在一个角色中,我试图从另一个角色加载一些变量。 (如果该角色包含在当前游戏中,那么变量将是可访问的,但事实并非如此。)
所以我尝试了这个:
- include_vars: ../../another_role/defaults/main.yml
但它不起作用,没有错误,但变量仍未定义。
所以我试着变得聪明并将文件符号链接到我想要使用变量的角色中的vars/another_role_defaults.yml
,然后像这样包含它:
- include_vars: another_role_defaults.yml
相同的结果,没有错误(如果找不到文件,为什么不抛出错误?)但变量仍未定义。我也试过这个,但是还是没有雪茄。
- include_vars: ../vars/another_role_defaults.yml
我做错了什么?
答案 0 :(得分:8)
这最终是我自己的错...我使用debug
模块和tags
这样测试了这个:
- include_vars: ../../another_role/defaults/main.yml
- debug: msg={{ variable }}
tags: foo
然后像这样执行剧本:
ansible-playbook -vvvv playbook.yml --tags foo
一旦我遗漏了标签,它就可以了(当然)。问题是我应该将标签添加到include_vars
命令中,如下所示:
- include_vars: ../../another_role/defaults/main.yml
tags: foo
- debug: msg={{ variable }}
tags: foo
答案 1 :(得分:1)
在我的情况下,如果文件是从另一个角色导入的,则无法接受的解决方案。通过特殊变量对我有用的稍微修改的方法:
- include_vars: "{{ role_path }}/../another_role/defaults/main.yml"
tags: foo
role_path-当前正在运行的角色的目录的路径
答案 2 :(得分:0)
从 ansible-core 2.11 开始,您可以这样做:
- include_vars: ../../nrpe/vars/standard_nrpe_checks.yml
name: standard_nrpe_checks
- debug:
msg: "{{ standard_nrpe_checks }}"
要获得相同的结果,您还可以将 set_fact
与查找插件一起使用。
- debug:
msg: "{{ lookup('file', '../../nrpe/vars/standard_nrpe_checks.yml') }}"
我想提一下您是否正在使用集合并分发您可以使用的剧本
playbooks
|_vars/
|_standard_nrpe_checks.yml
在这种情况下,我现在可以从集合中共享变量,并且由于它位于查找路径中,因此我不需要相对指定它。 IE。而不是让一个列表成为一个 nrpe 角色,默认为两个角色读取它并将其维护在一个地方。
- include_vars: standard_nrpe_checks.yml
name: standard_nrpe_checks
- debug:
msg: "{{ standard_nrpe_checks }}"
TASK [namespace.my_collection.icinga : debug] *******************************************
ok: [hostname] =>
msg: |-
standard_nrpe_checks:
check_users:
script: check_users