我如何创建剧中所有主机及其 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