Ansible如何在当前主机组访问另一主机组的host_vars变量值
解决方案
错误原因
你之前的写法存在两个问题:
- 混淆了Ansible两个内置顶级变量的作用域:
groups是直接存放所有inventory主机组信息的顶级变量,无需从hostvars中读取;hostvars是字典结构,只能以主机名为key读取对应主机的所有定义变量 debug模块的var参数直接填变量名即可,不需要用{{ }}包裹,只有msg参数里的变量需要用双大括号包裹
正确取值写法
如果你要读取iperf_servers组第一台主机的data_ip,写法如下:
{{ hostvars[groups['iperf_servers'][0]].nodes[0].data_ip }}
逻辑是:先从groups中取出iperf_servers组的第一台主机名,再将该主机名作为key,从hostvars中读取对应主机的nodes[0].data_ip变量。
注意事项
如果运行时提示变量未定义,是因为Ansible默认只会加载当前play目标主机的变量,你可以在playbook最开头添加一个空play预加载所有需要用到的主机变量:
- hosts: iperf_servers,iperf_clients gather_facts: yes tasks: []
完整示例(修改后的第二个play)
- hosts: iperf_clients remote_user: root tasks: - name: 打印第一台iperf服务器的data_ip debug: msg: "第一台iperf服务器的data_ip为 {{ hostvars[groups['iperf_servers'][0]].nodes[0].data_ip }}" # 如需遍历所有iperf服务器的ip可以用循环 - name: 遍历打印所有iperf服务器的data_ip debug: msg: "服务器 {{ item }} 的data_ip为 {{ hostvars[item].nodes[0].data_ip }}" loop: "{{ groups['iperf_servers'] }}"
内容的提问来源于stack exchange,提问作者Leo_simon
相关产品推荐
相关产品推荐

