Ansible父Playbook如何调用子Playbook中include_vars加载的变量?
Ansible跨Playbook条件导入时变量未定义问题解决
问题背景
我使用Ansible 2.8.1编写了主Playbook playbook.yml,用于导入子Playbook,需求是基于my_app_vars[key1]的值条件导入play2.yml,主Playbook配置如下:
- import_playbook: play1.yml - import_playbook: play2.yml when: {{ my_app_vars[key1] }} vars: key1: "{{mock_key}}"
子Playbook play1.yml负责加载变量,配置如下:
- name: "Get Some Info" hosts: mock_servers pre_tasks: - name: include_vars: file: mock-vars.yml name: my_app_vars register: "{{my_app_vars}}" # 添加register无效果
执行时出现错误my_app_vars is undefined,添加register字段后问题依旧。虽然play2.yml的role中能正常使用my_app_vars、mock_key和key1,但无法在主playbook.yml中直接引用这些变量。
尝试过的方案及报错
尝试通过hostvars跨Playbook引用变量(已移除play1.yml中的无效register配置),但多次尝试均失败:
- 配置:
报错:when: not ( {{ hostvars[groups[mock_servers][0]].my_app_vars[key1] }} )''mock_servers'' is undefined' - 配置:
报错:when: not ( {{ hostvars[groups['mock_servers'][0]].my_app_vars[key1] }} )''ansible.vars.hostvars.HostVarsVars object'' has no attribute ''my_app_vars''' - 配置:
报错:when: not ( {{ hostvars[groups.mock_servers.0].my_app_vars[key1] }} )''ansible.vars.hostvars.HostVarsVars object'' has no attribute ''my_app_vars''' - 配置:
报错:when: not ( {{ hostvars[groups.mock_servers.0] }}.my_app_vars[key1] )''dict object'' has no attribute ''my_app_vars'
最终解决方案
在play1.yml的play块中添加gather_facts: false后,问题得到完美解决。修改后的play1.yml如下:
- name: "Get Some Info" hosts: mock_servers gather_facts: false pre_tasks: - name: Load mock variables include_vars: file: mock-vars.yml name: my_app_vars
此时主playbook.yml中可以通过hostvars正确引用变量,修正后的条件判断配置示例:
- import_playbook: play1.yml - import_playbook: play2.yml when: hostvars[groups['mock_servers'][0]].my_app_vars[key1] vars: key1: "{{mock_key}}"
内容的提问来源于stack exchange,提问作者Vikki
相关产品推荐
相关产品推荐

