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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:05:31