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

为什么Ansible会为每个主机创建独立的主机作用域列表变量?

问题原因

Ansible 不存在跨所有主机共享的全局可变变量:你在 play 层级定义的 ip_list_from_terraform 会在每个主机执行任务前独立初始化一份本地副本,set_fact 默认仅修改当前执行任务主机的本地变量,自然无法把所有主机的 IP 汇总到同一个列表里。
另外你原有写法中 with_items 用法存在问题:你传入的是单个 IP 字符串,with_items 会默认将字符串拆分为单个字符遍历,只是巧合下没有触发异常,属于不规范写法。

正确实现方案

分两步执行:首先给所有主机设置各自的私有 IP 作为主机级 fact,再指定单个固定节点遍历全量主机的 fact 汇总成列表即可,修正后的 playbook 示例如下:

---
- name: 采集所有节点的私有IP
  hosts: all
  become: true
  gather_facts: true
  tasks:
    - name: 存储当前主机的私有IP到本机fact
      set_fact:
        node_private_ip: "{{ hostvars[inventory_hostname]['ansible_' + ansible_default_ipv4['interface']]['ipv4']['address'] }}"

- name: 汇总全量IP列表
  hosts: shrimp-master-0 # 指定任意一个固定节点执行汇总逻辑即可
  gather_facts: false
  vars:
    ip_list_from_terraform: ['Verify']
  tasks:
    - name: 遍历所有主机提取IP拼接列表
      set_fact:
        ip_list_from_terraform: "{{ ip_list_from_terraform + [ hostvars[item].node_private_ip ] }}"
      loop: "{{ groups['all'] }}"

    - name: 打印汇总后的全量IP列表
      debug:
        var: ip_list_from_terraform

执行后汇总节点的输出就会和你预期的全量IP列表一致。

内容的提问来源于stack exchange,提问作者Jack Murphy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:06:03