如何为Ansible特定组设置包含IP列表的facts?
解决Ansible中获取组内所有主机IP列表作为Fact的问题
问题描述
已通过以下配置成功设置包含nodes组所有主机名的nodes Fact:
- name: Set nodes fact ansible.builtin.set_fact: nodes: "{{ groups['nodes'] }}"
输出符合预期,每台主机上的nodes变量都包含整个组的主机名列表。
但尝试设置node_ips Fact以存储所有主机的ansible_default_ipv4['address']时,仅能获取当前执行主机的单个IP:
- name: Set node IPs fact ansible.builtin.set_fact: node_ips: "{{ ansible_default_ipv4['address'] }}" - name: Debug ansible.builtin.debug: var: node_ips
输出结果为单台主机的IP,而非整个组的IP列表。需要实现每台主机上的node_ips都包含nodes组所有主机的IP地址列表。
解决方案
要获取组内所有主机的IP,需通过hostvars全局变量跨主机引用其他节点的Facts,结合map和extract过滤器提取目标字段:
核心配置
- name: Set node_ips fact with all nodes' IPs ansible.builtin.set_fact: node_ips: "{{ groups['nodes'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list }}" - name: Debug node_ips ansible.builtin.debug: var: node_ips
配置说明
groups['nodes']:获取nodes组的所有主机名列表map('extract', hostvars, ['ansible_default_ipv4', 'address']):对每个主机名,从hostvars中提取对应主机的ansible_default_ipv4.address值| list:将map返回的迭代器转换为列表格式
预期输出
执行后每台主机的node_ips都会包含整个组的IP列表:
ok: [apollo.lan] => { "node_ips": [ "192.168.1.2", "192.168.1.3" ] } ok: [boreas.lan] => { "node_ips": [ "192.168.1.2", "192.168.1.3" ] }
可选优化(处理无IPv4的主机)
若组内存在未获取到ansible_default_ipv4的主机(如仅启用IPv6),可添加默认值并过滤空值:
- name: Set node_ips fact with non-empty IPs ansible.builtin.set_fact: node_ips: "{{ groups['nodes'] | map('extract', hostvars, ['ansible_default_ipv4', 'address'], default='') | reject('equalto', '') | list }}"
原方法失效原因
ansible_default_ipv4是当前执行主机的本地Fact,直接引用只会获取当前主机的IP。要获取组内其他主机的Facts,必须通过hostvars全局变量进行跨主机引用。
内容的提问来源于stack exchange,提问作者Floren
相关产品推荐
相关产品推荐

