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
相关产品推荐
相关产品推荐

