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

时间:2016-02-18 18:18:34

标签: ansible ansible-vault

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

e.g。我有一个标准的vars文件,roles/myrole/vars/main.yml

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

然后加密一个roles/myrole/vars/vaulted_vars.yml

---
my_variable_vaulted: 'SECRET!'

但是当我运行剧本时,我总是得到错误!#34;错误!错误! ' my_variable_vaulted'未定义"'。

我在没有加密第二个文件的情况下尝试了它,以确保它不是加密问题,并且我得到了同样的错误。

2 个答案:

答案 0 :(得分:2)

my_variable_vaulted无法使用的原因是因为我没有包含变量文件。我假设某个角色vars/目录中的所有文件都是自动获取的,但我认为只有vars/main.yml的情况。

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

- include_vars: vars/vaulted_vars.yml

答案 1 :(得分:1)

这不是在ansibles中处理保险库的最佳方式。 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将自动从production_vault.yml获取development_vault.ymlgroup_vars,具体取决于哪个环境框所属。然后您可以像以前一样在角色/剧本中使用my_variable,而不必担心从正确的位置获取它。