针对不同环境分开Ansible Vault?

时间:2015-05-15 19:37:38

标签: ansible ansible-playbook

我正在使用Ansible来处理不同环境的端点差异。 这是通过使用变量和ansible-xml扩展来完成的。

例如,我在名为“myapp”的角色中设置了一个名为“endpoints.yml”的任务。此任务在配置文件中设置各种配置参数,替换为变量。

/roles/myapp/tasks/endpoints.yml

 —> set value in app config file to: {{ db_user }}
 —> set value in app config file to: {{ db_password }}

由于我的非prod环境共享一个端点,因此这些变量的值在角色的默认文件中设置:

/roles/myapp/defaults/main.yml

 —> db_user: myuser_ro
 —> db_passwordd: some_password

对于prod环境,我用group_variable覆盖默认值(因为它优先):

/环境/ PROD / group_vars / myapp_servers

 —> db_user: produser_ro
 —> db_password: some_other_password

这一切都很有效,允许我们在所有环境中使用单个剧本/角色。但是,我想利用ansible-vault将密码值从这些文件中移出并加载到加密文件中。

然而,prod和non-prod仍然会有不同的值。 我可以在名为“pass.yml”的角色中创建一个新的“vars”文件,使用ansible-vault对其进行加密,然后使用“include_vars:pass.yml”从任务中引用它。

但这并没有解释我如何考虑为不同的环境需要不同的(加密的)变量。

有什么建议吗?

3 个答案:

答案 0 :(得分:6)

听起来您正在使用像this这样的多环境结构。在这种情况下,您可以为每个环境创建一个Vault文件。

environments
├── dev
│   └── group_vars
│       └── all
│           └── secrets
└── prod
    └── group_vars
        └── all
            └── secrets

每个"秘密"文件可以有自己的密码。

答案 1 :(得分:4)

ansible保险库目前不支持单个ansible配置中的多个保管库密码。您必须使用相同的保管库密码来加密prod和非prod环境文件。

答案 2 :(得分:1)

自上次答案以来已经过去了一段时间,Ansible 2.2限制您使用一个保险箱密码进行整个剧本执行,但它不会妨碍您使用不同的保险库密码加密不同的文件,只要它们不在同一个地方使用。

简而言之,您可能拥有一个测试环境,其中的保管库密码与生产密码不同。

我做了一个PoC,你可以在这里查看:

https://github.com/brianmori/ansible-poc