在 ansible 中创建 play_hosts 及其 eth0 IP 地址的字典

在 ansible 中创建 play_hosts 及其 eth0 IP 地址的字典

我如何创建剧中所有主机及其 eth0 IP 地址的列表?我想要一个这样的列表:

host2ip:
  - host1: 10.0.0.1
  - host2: 10.0.0.2
  - host3: 10.0.0.3

答案1

获取子集并设置变量ip。的价值ip将是一个列表,因为界面可能有更多的IP地址

    - setup:
        gather_subset: interfaces
    - set_fact:
        ip: "{{ lookup('vars', 'ansible_' ~ interface).ipv4 |
                map(attribute='address') }}"

声明界面以及主机及其 IP 地址的字典。例如,

    interface: em0
    host_ip: "{{ dict(ansible_play_hosts |
                      zip(ansible_play_hosts |
                          map('extract', hostvars, 'ip'))) }}"

这种词典是经常使用的模式。看字典(键|zip(值))

例如,给出

  host_ip:
    test_01: [10.1.0.51]
    test_02: [10.1.0.52]
    test_03: [10.1.0.53]

在这种情况下,字典是更好的结构。如果您想迭代它,您可以轻松地将其转换为列表。例如,

  host_ip | dict2items:
    - key: test_01
      value: [10.1.0.51]
    - key: test_02
      value: [10.1.0.52]
    - key: test_03
      value: [10.1.0.53]

如果您坚持要一份清单,请填写以下声明

    host_ip_list: |
      {% filter from_yaml %}
      {% for host in ansible_play_hosts %}
      - {{ host }}: {{ hostvars[host]['ip'] | first }}
      {% endfor %}
      {% endfilter %}

给出你想要的,包括第一个地址的选择

  host_ip_list:
  - test_01: 10.1.0.51
  - test_02: 10.1.0.52
  - test_03: 10.1.0.53

用于测试的完整剧本示例

- hosts: test

  vars:
    interface: em0
    host_ip: "{{ dict(ansible_play_hosts |
                      zip(ansible_play_hosts |
                          map('extract', hostvars, 'ip'))) }}"
    host_ip_list: |
      {% filter from_yaml %}
      {% for host in ansible_play_hosts %}
      - {{ host }}: {{ hostvars[host]['ip'] | first }}
      {% endfor %}
      {% endfilter %}
    
  tasks:

    - setup:
        gather_subset: interfaces
    - set_fact:
        ip: "{{ lookup('vars', 'ansible_' ~ interface).ipv4 |
                map(attribute='address') }}"
    - debug:
        var: ip

    - block:
        - debug:
            var: host_ip | to_yaml
        - debug:
            var: host_ip | dict2items | to_yaml
        - debug:
            var: host_ip_list
      run_once: true

相关内容