Ansible:主机能否访问另一主机的host_vars文件?
没问题!完全可以在host1运行剧本时访问host_vars/host2里的变量,而且操作逻辑和你用hostvars[]访问远程主机facts的思路非常相似,只是针对的是预定义的host_vars变量而已。下面给你详细拆解实现方法:
直接通过
hostvars字典访问
你可以直接用hostvars['host2']来获取host2对应的host_vars文件里的所有变量集合。比如如果host_vars/host2里定义了device: "router-01",那在host1的任务里就能这么调用:- name: 打印host2的device变量 debug: msg: "host2的device变量值是: {{ hostvars['host2'].device }}"这里要注意:不管host2有没有在当前剧本的执行目标主机列表里,只要它存在于你的inventory清单中,Ansible就会自动加载对应的host_vars文件,你就能直接访问。
确保host2在inventory中存在
Ansible是通过inventory来识别主机并加载对应host_vars的,所以必须保证host2已经被添加到你的inventory文件里(不管是静态文件还是动态inventory)。如果inventory里没有host2,hostvars['host2']就会抛出变量未定义的错误。和gather_facts的区别
你之前用hostvars[]访问的是通过gather_facts收集的主机实时信息,这需要目标主机在线且能被Ansible连接;而访问host_vars变量不需要收集facts,也不需要host2在线——因为这些变量是你预先在本地host_vars文件里定义的,只要inventory里有这个主机条目就能访问。特殊变量名的访问方式
如果host_vars里的变量名包含特殊字符(比如连字符-),可以用字典下标形式访问:{{ hostvars['host2']['device-port'] }}
内容的提问来源于stack exchange,提问作者Quake

