python - 使用 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.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 或者以完全不同的方式提取 iqn?

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

在我的测试中,我已经在这里和 Internet 上的其他地方搜索了几个小时。 我是 Ansible 的新手,完全是 python 和 jinja2 的菜鸟,但我也试图调查这些路径但无济于事。

最佳答案

还有其他方法可以达到相同的结果,但您可以在以下概念的基础上进行构建。我只是在 dict 列表(每个 dict 包含一个 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

关于python - 使用 Ansible 从一行文本中提取两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66477488/

相关文章:

filter - Google Docs 电子表格显示匹配条件的行中的数据

python - Django compilemessages 不创建 .mo 文件

python - Pygame:位 block 传输移动背景会产生太多模糊

javascript - Immutable.js 中的列表列表

python - 使用列表推导式对数据帧列表中的数据帧进行编号

java - 从字符串中过滤出某些文本

swift - 在 Realm 中按日期组件过滤

python - ThreadPoolExecutor在最后一个线程完成之前不启动新线程

python - 如何使用python的seaborn绘制CDF?

c# - View 模型公开的集合必须使用 MVVM 模式实现 ObservableCollection<T>