如何在Ansible清单文件中引用其他主机的hostvars变量?
问题:如何在Ansible清单文件中引用另一台主机的变量?
在Ansible任务里用hostvars引用其他主机变量很顺畅,但直接在清单文件里写{{ hostvars['host1'].name }}这类语法时,它不会被解析成对应的值,只会被当作纯字符串存储。
示例清单
servers: hosts: host1: name: "foo" host2: name: "bar" link: "{{ hostvars['host1'].name }}"
示例剧本
--- - name: Test hosts: all gather_facts: yes tasks: - debug: msg: "{{ hostvars['host2'].link }}"
执行返回结果
"msg": "{{ hostvars['host1'].name }}"
解决方案
Ansible的清单变量属于静态配置,默认不会解析Jinja2模板语法,要实现跨主机变量引用,得用运行时动态赋值的方式:
方法1:用set_fact在剧本中动态设置变量
在剧本里通过set_fact模块,针对目标主机(这里是host2)动态赋值,直接引用其他主机的变量值:
--- - name: Test hosts: all gather_facts: yes tasks: - name: 给host2设置link变量 set_fact: link: "{{ hostvars['host1'].name }}" when: inventory_hostname == 'host2' - debug: msg: "{{ hostvars['host2'].link }}"
执行这个剧本后,debug模块会返回正确的"msg": "foo"。如果需要让这个变量在后续所有任务中生效,可以把该任务放到pre_tasks段提前执行。
方法2:用host_vars目录结合Jinja2模板
如果习惯用文件管理主机变量,可在项目的host_vars目录下创建host2.yml文件,内容如下:
name: "bar" link: "{{ hostvars['host1'].name }}"
然后在ansible.cfg中开启变量解析:
[defaults] enable_template_vars = True
不过这种方式对Ansible版本有要求,且配置灵活性不如set_fact。
内容的提问来源于stack exchange,提问作者dranobob
相关产品推荐
相关产品推荐

