Ansible import_playbook用变量做路径报错:'hostvars'未定义
在Ansible的import_playbook路径中使用变量的正确方式
问题原因
你遇到的'hostvars' is undefined报错,核心原因是import_playbook属于静态导入操作,它在playbook的解析阶段就会执行,而hostvars是运行时才生成的变量集合,解析阶段根本不存在这个对象,所以直接引用会报错。
解决方案
方案一:直接使用解析阶段可用的变量
如果你的ansible_collections_directory变量是通过vars_files加载的(就像你当前的代码),这个变量在解析阶段就已经存在,完全可以直接引用,不需要通过hostvars:
- hosts: localhost gather_facts: false vars_files: - "{{ var_file }}" - name: Import the k3s playbook with flannel ansible.builtin.import_playbook: "{{ ansible_collections_directory }}/techno_tim/k3s_ansible/site.yml" vars: ansible_collections_directory: "{{ ansible_collections_directory }}"
另外,你之前的set_fact步骤是多余的——因为vars_files已经加载了该变量,不需要再用set_fact重复赋值,可以直接删除。
方案二:用动态导入替代静态导入(适用于动态生成的变量)
如果你的变量是通过set_fact或其他运行时操作动态生成的,那就需要用include_playbook替代import_playbook。include_playbook是动态导入操作,在运行时执行,此时hostvars已经存在,可以正常访问:
- hosts: localhost gather_facts: false vars_files: - "{{ var_file }}" tasks: - name: 动态设置集合目录变量 set_fact: ansible_collections_directory: "{{ ansible_collections_directory }}" - name: 导入k3s playbook ansible.builtin.include_playbook: "{{ hostvars['localhost']['ansible_collections_directory'] }}/techno_tim/k3s_ansible/site.yml" vars: ansible_collections_directory: "{{ hostvars['localhost']['ansible_collections_directory'] }}"
关键区别总结
import_playbook:静态解析,只能使用解析阶段就存在的变量(比如vars_files加载的变量、命令行传入的--extra-vars、全局vars)include_playbook:动态执行,可以使用运行时生成的变量(比如set_fact的结果、hostvars、远程主机返回的facts)
内容的提问来源于stack exchange,提问作者Peter Talen
相关产品推荐
相关产品推荐

