python - 使用 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.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。
代码:
- hosts: test_server
gather_facts: yes
tasks:
- name:
set_facts:
iscsi_vlan: '192.168.20.64/28'
- name: iscsiadm discovery
command: /usr/sbin/iscsiadm iscsiadm --mode discovery --type sendtargets --portal {{ storage_fqdn }}
register: iscsiadm_out
- name: facts
set_fact:
target_list: "{{ target_list + item | regex_findall('(^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})') | ipaddr( iscsi_vlan ) }}"
loop: "{{ iscsiadm_out.stdout_lines }}"
- name: target_list
debug:
var: target_list
target_list 包含这个。它使用 ip_addr 函数匹配正确的子网。
ok: [test-server] =>
target_list:
- 192.168.20.76
- 192.168.20.75
基本上,我最终会尝试在包含另一个列表内容的列表中进行搜索。
- 我试过 with_subelements 但它需要一个字符串和一个列表
- 我试图弄清楚如何使用正则表达式一次性从 iscsiadm_out 中提取正确的 IP 和 iqn,但不能。
- 我曾考虑将 iscsiadm_out 转换为 json 对象,然后使用 json_query,但我不知道该怎么做。
如何使用此列表从 iscsiadm_out 中提取 iqn 或者以完全不同的方式?
我知道我可以在命令模块中使用 grep 和 awk 等命令,但我不喜欢那个选项。
在我的测试中,我在互联网上搜索了这里和其他地方几个小时。我是 Ansible 的新手,也是 python 和 jinja2 的新手,但我也试图调查这些路径也无济于事。
解决方案
还有其他方法可以实现相同的结果,但您可以建立以下概念。我只是在一个字典列表(每个字典包含一个 ip/iqn 对)中一次提取您的预期信息并循环它以过滤掉预期的元素。
演示手册:
---
- name: Extract IP and IQN
hosts: localhost
gather_facts: false
vars:
# This is what you get from your command
iscsiadm:
stdout_lines:
- 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
iscsi_vlan: '192.168.20.64/28'
tasks:
- name: "Create a list of {ip: x, iqn: y} dicts from the command result"
vars:
current_entry:
- ip: >-
{{ item | regex_replace('(^(\d{1,3}\.){3}\d{1,3}).*$', '\g<1>') }}
iqn: >-
{{ item | regex_replace('^.* (iqn\.\d*-\d*.com.netapp).*$', '\g<1>') }}
set_fact:
ipqn_list: "{{ ipqn_list | default([]) + current_entry }}"
loop: "{{ iscsiadm.stdout_lines }}"
- name: Debug element when ip is in our subnet (change to whatever is relevant)
debug:
msg: "IP {{ item.ip }} with IQN {{ item.iqn }} is in our subnet"
loop: "{{ ipqn_list }}"
when: 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
推荐阅读
- java - 字符串比较返回 false 而它们具有相同的值
- python - ctx 是必需的参数
- jenkins - 获取与特定 Jenkins 从属关联的作业名称
- c# - 从 .Net Core 运行 Powershell - 无法加载文件或程序集 Microsoft.Management.Infrastructure
- regex - 正则表达式对单个字符使用括号
- python - 使用 MatPlotLib 的美国人口普查数据
- android - 将 espresso-contrib 添加到 androidTestImplementation 会产生依赖/约束错误
- docker - Docker 容器如何获取主机进程退出消息?
- python - 如何使用本机 Interactive Brokers Python API 创建条件订单?
- java - 我怎样才能使用这个变量?