Python 使用Ansible从一行文本中提取两个字符串

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

我有一个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.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_查询,但我不知道如何做到这一点
我如何使用此列表从iscsiadm_中提取iqn,或者以完全不同的方式提取iqn

我知道我可以在命令模块中使用grep和awk等命令,但我不喜欢这个选项

在我的测试中,我在互联网上搜索了数小时。
我是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