希望你好好的。
尽管我在网络和文档上进行了搜索,但我仍然无法循环 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