循环查看 ansible 事实

循环查看 ansible 事实

希望你好好的。

尽管我在网络和文档上进行了搜索,但我仍然无法循环 ansible 2.9 事实。

我想从所有主机上的自定义接口检索 IP 地址并放入列表中。这是我尝试的:

---
- hosts: all
  gather_facts: True
  vars:
    ip_private_list: []

    - set_fact:
        ip_private_list: "{{  ip_private_list + [item]  }}"
      with_items: "{{ hostvars[inventory_hostname]['ansible_ens256']['ipv4']['address'] }}"
      delegate_facts: true

我不明白为什么 ip_private_list 没有填充元素,当我尝试使用 msg 进行调试时,我收到“Ansible Undefined”

我是否遗漏了有关数据结构的任何信息或正确的实现方法?

谢谢你的帮助

答案1

此查询应该会为您提供 IP 地址列表

    - set_fact:
        ipl: "{{ hostvars|dict2items|
                 json_query('[].value[].ansible_ens256.ipv4[].address') }}"
      run_once: true

笔记

映射主机并从 hostvars 中提取变量。例如

shell> cat playbook.yml
- hosts: test_11,test_12,test_13
  tasks:
    - set_fact:
        ipv4_dict: "{{ dict(ansible_play_hosts|zip(_ipv4)) }}"
      vars:
        _ipv4: "{{ ansible_play_hosts|
                   map('extract', hostvars, ['ansible_wlan0', 'ipv4'])|
                   list }}"
      run_once: true

给出列表词典

  ipv4_dict:
    test_11:
    - address: 10.1.0.61
      broadcast: 10.1.0.61
      netmask: 255.255.255.255
      network: 10.1.0.61
    test_12:
    - address: 10.1.0.62
      broadcast: 10.1.0.62
      netmask: 255.255.255.255
      network: 10.1.0.62
    test_13:
    - address: 10.1.0.63
      broadcast: 10.1.0.63
      netmask: 255.255.255.255
      network: 10.1.0.63

字典的值是列表,因为与适配器关联的 IP 地址可能更多。使用此字典来选择 IP 地址,例如

    - set_fact:
        ipv4_address: "{{ dict(ansible_play_hosts|zip(_address)) }}"
      vars:
        _address: "{{ ipv4_dict|dict2items|json_query('[].value[].address') }}"
      run_once: true

给出字典

  ipv4_address:
    test_11: 10.1.0.61
    test_12: 10.1.0.62
    test_13: 10.1.0.63

如果您想要一个简单的 IP 地址列表,请选择字典的值,例如

    - set_fact:
        ip_private_list: "{{ ipv4_address.values()|list }}"
      run_once: true

给出

  ip_private_list:
  - 10.1.0.61
  - 10.1.0.62
  - 10.1.0.63

相关内容