11

在一个角色中,我试图从另一个角色加载一些变量。(如果该角色包含在当前戏剧中,则变量将是可访问的,但事实并非如此。)

所以我尝试了这个:

- 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

我究竟做错了什么?

4

3 回答 3

13

到底是我自己的错...我使用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
于 2014-07-04T14:35:36.337 回答
3

如果文件是从另一个角色导入的,则接受的解决方案在我的情况下不起作用。通过对我有用的特殊变量的稍微修改的方法:

- include_vars: "{{ role_path }}/../another_role/defaults/main.yml"
  tags: foo

role_path - 当前运行角色的目录路径

于 2020-09-05T12:13:14.330 回答
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

在这种情况下,我现在可以从集合中共享 var,因为它位于查找路径中,所以我不需要相对指定它。即不是让一个列表成为一个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
于 2021-05-11T09:38:58.330 回答