在第二个 var 文件中使用来自一个 Ansible var 文件的变量

Using a variable from one Ansible var file in a second var file

在使用 Ansible 时,我尝试使用拱形 vars 文件来存储私有变量,然后在另一个 vars 文件中以相同的角色使用这些变量。 (想法来自'Vault Pseudo leaf encryption'here。)

例如我有一个标准的 vars 文件,roles/myrole/vars/main.yml:

---
my_variable: '{{ my_variable_vaulted }}'

然后是加密的,roles/myrole/vars/vaulted_vars.yml:

---
my_variable_vaulted: 'SECRET!'

但是当我 运行 剧本时,我总是得到“"ERROR! ERROR! 'my_variable_vaulted' is undefined"”。

我在不加密第二个文件的情况下进行了尝试,以确保这不是加密问题,但我遇到了同样的错误。

这不是在 ansibles 中处理 vault 的最佳方式。 vault documentation for ansible 中概述了更好的方法。因此,您可以像这样在 group_vars/all.yml 中为环境创建基本变量:

my_variable: {{ vault_my_variable }}

然后在您的 inventories/main 中决定哪些主机应加载哪个保管库文件以满足此变量。例如,您可以在 inventories/main:

[production:children]
myhost1

[development:children]
myhost2

[production_vault:children]
production

[development_vault:children]
development

然后 ansible 会自动从 group_vars 中分别获取 production_vault.ymldevelopment_vault.yml ,具体取决于哪个环境框属于。然后您可以像以前一样在 roles/playbooks 中使用 my_variable,而不必担心从正确的位置获取它。

my_variable_vaulted 不可用的原因是因为我没有包含变量文件。我假设角色的 vars/ 目录中的所有文件都是自动提取的,但我认为只有 vars/main.yml.

才是这种情况

因此,为了使角色内的所有任务都可以使用 vaulted 变量,在 roles/myrole/tasks/main.yml 中,我在所有任务之前添加了这个:

- include_vars: vars/vaulted_vars.yml