为什么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
相关产品推荐
相关产品推荐

