Python 使用Ansible从一行文本中提取两个字符串
我有一个shell输出的列表Python 使用Ansible从一行文本中提取两个字符串,python,list,filter,ansible,Python,List,Filter,Ansible,我有一个shell输出的列表 - 192.168.20.76:3260,1054 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6 - 192.168.21.126:3260,1056 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6 - 192.168.21.125:3260,1055 iqn.1992-08.com.netapp:sn.f
- 192.168.20.76:3260,1054 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
- 192.168.21.126:3260,1056 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
- 192.168.21.125:3260,1055 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
- 192.168.20.75:3260,1053 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
- 192.168.22.20:3260,1052 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
- 192.168.22.19:3260,1051 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
当IP与主机位于同一vlan中时,我想从列表中获取IP和iqn.xxxxx
我能够创建一个正确IP的列表,但不知道如何获得相应的iqn
代码:
目标_列表包含此项。它使用ip_addr函数匹配正确的子网
ok: [test-server] =>
target_list:
- 192.168.20.76
- 192.168.20.75
基本上,我最终会尝试在一个列表中搜索另一个列表的内容
- 我试过使用_子元素,但它需要一个字符串和一个列表
- 我试图找出如何使用regex一次性从iscsiadm_中提取正确的IP和iqn,但无法做到
- 我考虑过将iscsiadm_转换成一个json对象,然后使用json_查询,但我不知道如何做到这一点
我是Ansible的新手,python和jinja2的新手,但我试图研究这些路径也没有用。有其他方法可以获得相同的结果,但您可以基于以下概念进行构建。我只是在一个dict列表(每个dict包含一个ip/iqn对)中立即提取您的预期信息,并在其上循环以过滤出预期的元素 演示剧本:
---
-名称:提取IP和IQN
主机:本地主机
收集事实:错误
变量:
#这是你从命令中得到的
iscsiadm:
标准输出线:
-192.168.20.76:32601054 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
-192.168.21.126:32601056 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
-192.168.21.125:3260105 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
-192.168.20.75:32601053 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
-192.168.22.20:32601052 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
-192.168.22.19:32601051 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6
iscsi_vlan:'192.168.20.64/28'
任务:
-名称:“从命令结果创建{ip:x,iqn:y}目录列表”
变量:
当前输入:
-ip:>-
{item | regex_replace('(^(\d{1,3}\){3}\d{1,3})。*$,'\g')}
iqn:>-
{{item | regex_replace('^.*(iqn\.\d*-\d*.com.netapp.*$,'\g')}}
设定事实:
ipqn_列表:{{ipqn_列表|默认([])+当前_条目}”
循环:“{iscsiadm.stdout_line}”
-名称:当ip在我们的子网中时调试元素(更改为任何相关内容)
调试:
msg:“带IQN{{item.IQN}的IP{{item.IP}}在我们的子网中”
循环:“{ipqn_list}}”
时间:item.ip | ipaddr(iscsi_vlan)
给出了结果:
PLAY [Extract IP and IQN] **************************************************************************************************************************************************************************************************************
TASK [Create a list of {ip: x, iqn: y} dicts from the command result] ******************************************************************************************************************************************************************
ok: [localhost] => (item=192.168.20.76:3260,1054 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.21.126:3260,1056 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.21.125:3260,1055 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.20.75:3260,1053 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.22.20:3260,1052 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.22.19:3260,1051 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
TASK [Debug element when ip is in our subnet (change to whatever is relevant)] *********************************************************************************************************************************************************
ok: [localhost] => (item={'ip': '192.168.20.76', 'iqn': 'iqn.1992-08.com.netapp'}) => {
"msg": "IP 192.168.20.76 with IQN iqn.1992-08.com.netapp is in our subnet"
}
skipping: [localhost] => (item={'ip': '192.168.21.126', 'iqn': 'iqn.1992-08.com.netapp'})
skipping: [localhost] => (item={'ip': '192.168.21.125', 'iqn': 'iqn.1992-08.com.netapp'})
ok: [localhost] => (item={'ip': '192.168.20.75', 'iqn': 'iqn.1992-08.com.netapp'}) => {
"msg": "IP 192.168.20.75 with IQN iqn.1992-08.com.netapp is in our subnet"
}
skipping: [localhost] => (item={'ip': '192.168.22.20', 'iqn': 'iqn.1992-08.com.netapp'})
skipping: [localhost] => (item={'ip': '192.168.22.19', 'iqn': 'iqn.1992-08.com.netapp'})
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
解析列表中的项目并创建字典,例如
-设置事实:
ipqn_dict:{{{ipqn_dict}默认({})|
组合({索引:{'ip':ip,
“端口”:端口,
“iqn”:iqn,
“代码”:代码,
“vs”:vs}}}”
循环:“{iscsiadm_out.stdout_line}”
变量:
a:“{item.split(',')}”
ip:“{a.0.split(':').0}”
端口:“{a.0.split(':').1}”
b:“{a.1.拆分('')}”
索引:“{b.0}”
iqn:“{b.1.split(':').0}”
代码:“{b.1.split(':').1}”
vs:“{b.1.split(':').2}”
给予
ipqn_dict:
'1051':
代码:sn.f4bc76f43e2611e883e200a098d2174a
ip:192.168.22.19
iqn:iqn.1992-08.com.netapp
端口:'3260'
vs:vs.6
'1052':
代码:sn.f4bc76f43e2611e883e200a098d2174a
ip:192.168.22.20
iqn:iqn.1992-08.com.netapp
端口:'3260'
vs:vs.6
'1053':
代码:sn.f4bc76f43e2611e883e200a098d2174a
ip:192.168.20.75
iqn:iqn.1992-08.com.netapp
端口:'3260'
vs:vs.6
'1054':
代码:sn.f4bc76f43e2611e883e200a098d2174a
ip:192.168.20.76
iqn:iqn.1992-08.com.netapp
端口:'3260'
vs:vs.6
'1055':
代码:sn.f4bc76f43e2611e883e200a098d2174a
ip:192.168.21.125
iqn:iqn.1992-08.com.netapp
端口:'3260'
vs:vs.6
'1056':
代码:sn.f4bc76f43e2611e883e200a098d2174a
ip:192.168.21.126
iqn:iqn.1992-08.com.netapp
端口:'3260'
vs:vs.6
这将简化所需数据的选择,例如
-调试:
msg:{{ipqn_dict | json_query('*.[ip,iqn]')}”
给予
--192.168.20.76
-iqn.1992-08.com.netapp
- - 192.168.21.126
-iqn.1992-08.com.netapp
- - 192.168.21.125
-iqn.1992-08.com.netapp
- - 192.168.20.75
-iqn.1992-08.com.netapp
- - 192.168.22.20
-iqn.1992-08.com.netapp
- - 192.168.22.19
-iqn.1992-08.com.netapp
感谢您的时间和善意帮助!这正是我想要的!我将iqn正则表达式中的右括号移到了行的末尾,因为我需要它。我确实投了赞成票,但由于我是新来的,我没有足够的声誉使其公开可见。你需要更多的声誉来获得你的赞成票(应该很快就可以),但如果其中一个解决了你的问题,你仍然可以接受(绿色勾号)。这将让其他人知道有一个有效的解决方案。感谢您的帮助和时间!这是一种提取文本并将其排序为dict的好方法。我稍后将在其他用例中使用它。我确实投了赞成票,但由于我是新来的,我没有足够的声誉让它公开。
PLAY [Extract IP and IQN] **************************************************************************************************************************************************************************************************************
TASK [Create a list of {ip: x, iqn: y} dicts from the command result] ******************************************************************************************************************************************************************
ok: [localhost] => (item=192.168.20.76:3260,1054 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.21.126:3260,1056 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.21.125:3260,1055 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.20.75:3260,1053 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.22.20:3260,1052 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
ok: [localhost] => (item=192.168.22.19:3260,1051 iqn.1992-08.com.netapp:sn.f4bc76f43e2611e883e200a098d2174a:vs.6)
TASK [Debug element when ip is in our subnet (change to whatever is relevant)] *********************************************************************************************************************************************************
ok: [localhost] => (item={'ip': '192.168.20.76', 'iqn': 'iqn.1992-08.com.netapp'}) => {
"msg": "IP 192.168.20.76 with IQN iqn.1992-08.com.netapp is in our subnet"
}
skipping: [localhost] => (item={'ip': '192.168.21.126', 'iqn': 'iqn.1992-08.com.netapp'})
skipping: [localhost] => (item={'ip': '192.168.21.125', 'iqn': 'iqn.1992-08.com.netapp'})
ok: [localhost] => (item={'ip': '192.168.20.75', 'iqn': 'iqn.1992-08.com.netapp'}) => {
"msg": "IP 192.168.20.75 with IQN iqn.1992-08.com.netapp is in our subnet"
}
skipping: [localhost] => (item={'ip': '192.168.22.20', 'iqn': 'iqn.1992-08.com.netapp'})
skipping: [localhost] => (item={'ip': '192.168.22.19', 'iqn': 'iqn.1992-08.com.netapp'})
PLAY RECAP *****************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0