繁体   English   中英

如何从具有多个主机的 ansible_facts 中创建一个列表

[英]how to make a list from ansible_facts with multiple hosts

我正在尝试制作一个包含各种主机的 IP 地址的列表,然后在另一个任务中使用此列表。 我的问题是,如何从每个主机的 output 中选择一个 IP(我需要公共 IP)并将其添加到列表中? 我需要10. .. 开头的 IP。

稍后,我需要在另一个任务中使用这个列表。

我通过运行此剧本来提取此信息:

- hosts: facts
  become: true
  gather_facts: True
  tasks:
    - debug:
        msg: "The ip: {{ item }}"
      with_items: "{{ ansible_all_ipv4_addresses }}" 

稍后,我需要在另一个任务中使用这个列表:

- wait_for:
    host: "{{ item[0] }}"
    port: "{{ item[1] }}"
    state: started
    delay: 0
    timeout: 2
  delegate_to: localhost
  become: false
  ignore_errors: no
  ignore_unreachable: yes
  register: result
  failed_when: not result.failed  
  with_nested:
    - [ IP LIST HERE]
    - [443,80,9200,9300,22,5432,6432]

您可以立即从hostvars访问这些值,然后使用带有match测试的reject过滤器来拒绝您不想测试的内容。

其中,在debug任务中会给出:

# note: ports list reduced for brevity 

- debug:
    msg: "I should wait for interface {{ item.0 }}:{{ item.1 }}"
  loop: >-
    {{
      hostvars
        | dict2items
        | selectattr('key', 'in', ansible_play_hosts)
        | map(attribute='value.ansible_all_ipv4_addresses', default=[])
        | flatten
        | reject('match', '10\..*')
        | product(_ports)
    }}
  loop_control:
    label: "{{ item.0 }}"
  run_once: true
  delegate_to: localhost
  vars:
    _ports:
      - 22
      - 80

在我的实验室中,这给出:

ok: [ansible-node-1 -> localhost] => (item=172.18.0.3) => 
  msg: I should wait for interface 172.18.0.3:22
ok: [ansible-node-1 -> localhost] => (item=172.18.0.3) => 
  msg: I should wait for interface 172.18.0.3:80
ok: [ansible-node-1 -> localhost] => (item=172.18.0.4) => 
  msg: I should wait for interface 172.18.0.4:22
ok: [ansible-node-1 -> localhost] => (item=172.18.0.4) => 
  msg: I should wait for interface 172.18.0.4:80

试试下面的例子

shell> cat pb.yml
- hosts: all

  vars:

    ip_list: "{{ ansible_play_hosts|
                 map('extract', hostvars, 'ansible_all_ipv4_addresses')|
                 map('first')|list }}"
    ip_list_reject: "{{ ip_list|reject('match', '10\\.')|list }}"

  tasks:

    - setup:
        gather_subset: network
    - block:
        - debug:
            var: ip_list
        - debug:
            var: ip_list_reject
        - wait_for:
            host: "{{ item.0 }}"
            port: "{{ item.1 }}"
            state: started
            delay: 0
            timeout: 2
          delegate_to: localhost
          register: result
          with_nested:
            - "{{ ip_list_reject }}"
            - [443, 80, 9200, 9300, 22, 5432, 6432]
      run_once: true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM