You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:50:24