如何 select 列表中的值

how to select values from lists

我定义了 6 个主机,这些主机有多个 IPv4。我需要这些 IP 列表中的 IPv4 子集。

我就是这样运行

- hosts: gluster_mariadb
  gather_facts: true
  tasks:
    - set_fact:
        main_nodes_ips: "{{ groups.zicluster |
                            map('extract', hostvars, 'ansible_all_ipv4_addresses') |
                            list }}"
      run_once: true

    - debug:
        var: main_nodes_ips
      run_once: true

响应是:

    ok: [zi04] => {
        "main_nodes_ips": "[ ['172.18.0.1', '192.168.17.209', '172.17.0.1', '169.254.135.46', '169.254.74.141'], ['172.18.0.1', '192.168.17.208', '169.254.118.121', '169.254.53.186', '172.17.0.1'], ['172.18.0.1', '192.168.17.196', '172.17.0.1', '169.254.211.146', '169.254.1.199'], ['172.18.0.1', '192.168.17.159', '169.254.234.110', '169.254.150.56', '172.17.0.1'], ['172.18.0.1', '192.168.17.160', '172.17.0.1', '169.254.113.116', '169.254.97.143'], ['172.18.0.1', '192.168.17.161', '172.17.0.1', '169.254.240.6', '169.254.74.189']]"
    }

我试着用这个做子选择:

- debug:
    var:
      main_nodes_ips | select('match', '^192') | list

这个returns没有数据,我想是因为它是一个列表列表。 所以我尝试更早地进行子选择。像这样:

- hosts: gluster_mariadb
  gather_facts: true
  tasks:
    - set_fact:
        main_nodes_ips: "{{ groups.zicluster |
                            map('extract', hostvars, 'ansible_all_ipv4_addresses') |
                            select('match', '^192') |
                            list }}"
      run_once: true

    - debug:
        var: main_nodes_ips
      run_once: true

这也returns没有数据。

    ok: [zi04] => {
        "main_nodes_ips": []
    }

我要找的是这样的:

    ok: [zi04] => {
        "main_nodes_ips":
            [
                "192.168.17.100",
                "192.168.17.101",
                "192.168.17.102",
                "192.168.17.103",
                "192.168.17.104",
                "192.168.17.105"
            ]
         }

变量main_nodes_ips是一个列表的列表

main_nodes_ips:
  - - 172.18.0.1
    - 192.168.17.209
    - 172.17.0.1
    - 169.254.135.46
    - 169.254.74.141
  - - 172.18.0.1
    - 192.168.17.208
    - 169.254.118.121
    - 169.254.53.186
    - 172.17.0.1
  - - 172.18.0.1
    - 192.168.17.196
    - 172.17.0.1
    - 169.254.211.146
    - 169.254.1.199
  - - 172.18.0.1
    - 192.168.17.159
    - 169.254.234.110
    - 169.254.150.56
    - 172.17.0.1
  - - 172.18.0.1
    - 192.168.17.160
    - 172.17.0.1
    - 169.254.113.116
    - 169.254.97.143
  - - 172.18.0.1
    - 192.168.17.161
    - 172.17.0.1
    - 169.254.240.6
    - 169.254.74.189

您不能直接使用过滤器 select。您必须映射过滤器select到每个项目

main_nodes_192: "{{ main_nodes_ips|
                    map('select', 'match', '^192.*$')|
                    flatten }}"

给予

main_nodes_192:
  - 192.168.17.209
  - 192.168.17.208
  - 192.168.17.196
  - 192.168.17.159
  - 192.168.17.160
  - 192.168.17.161