我正在使用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”从任务中引用它。
但这并没有解释我如何考虑为不同的环境需要不同的(加密的)变量。
有什么建议吗?
答案 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,你可以在这里查看: