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

Ansible中为何无法通过hostvars访问另一主机的变量?

问题原因及解决方法

你的问题出在Play级别变量的作用域上:

你在第一个Play里定义的db_backup_path是Play级别的临时变量,它只在当前Play的执行过程中生效,并不会被自动存入hostvars['host1']的主机变量集合中。hostvars里存储的是主机的facts信息,或者通过set_fact明确声明的持久化主机变量,Play的vars不属于这个范畴,所以第二个Play访问时会提示变量未定义。


解决方法

最直接的方式是用set_fact把变量设置为host1的主机变量,这样后续Play就能通过hostvars访问:

修改第一个Play的内容,把原Play级的vars替换成set_fact任务:

- name: Backup database
  hosts: host1
  roles:
    - backup_database
  tasks:
    - set_fact:
        db_backup_path: "{{ hostvars.localhost.temp_dir.path + '/' + backup_filename }}"
        cacheable: yes  # 开启缓存,确保变量在后续Play中能被读取

补充说明:

  • set_fact定义的变量会被添加到目标主机(这里是host1)的hostvars中,跨Play也能访问。
  • cacheable: yes参数可选,但如果你的Ansible开启了fact缓存,它能保证变量在不同Play间的可用性更稳定。

另外,如果这个变量不需要绑定到host1,也可以直接在第一个Play里把变量传递给localhost,或者在inventory的host_vars/group_vars里预先定义(但如果变量是动态生成的,这种方式不适用)。

内容的提问来源于stack exchange,提问作者jerdub1993

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:22:13