Ansible Vault - 用于生产和测试的相同 Git 回购
Ansible Vault - Same Git repo for Prod & Test
对冗长表示歉意post。我是 Ansible 和 Vault 的新手(<2 个月)。
环境:
- CentOS & Win2019(90% Linux 系统)
- Ansible 2.10.7(主 Ansible 控制器)
- AWX 17.0.1(嵌入式 ansible 2.9.17)
最终目标:
- 对两种环境(生产和测试)使用来自 Git 的相同代码
- 能够根据环境
分离 'secrets' 值
基本设置(当前):
- Ansible 主控制器设计为完全自启动。这意味着所有 settings/configs 都包含在剧本中。这意味着我可以在 3 分钟内炸毁 ANS 控制器并重建。
- 所有秘密都是可变文件中的加密字符串。由于 AWX 无法导入 vaulted 文件,所有秘密都是内联的(ansible-vault encrypt_string 'secret_data' --name 'my_secret')
- 两种环境中存在相同的用户帐户,但凭据不同
当前问题:
- 如果将 Git 存储库导入我的 Prod Ansible 主控制器,任何需要秘密的播放都会失败(因为它有带有 'Test' 值的秘密变量)
想解决:
- 我考虑过将 ansible 'default' 函数与基于 Inventory 文件的 'when' 条件相结合的任何秘密。基本上,如果清单文件是基于 'Test' 的系统,则使用 'Test' 秘密。如果没有,则使用 'Prod' 秘密。
从我的角度来看,这是一个丑陋的解决方案,但必须是一个更好的解决方案。
- 使用 Hashicorp Vault。它具有使用名称空间树对信用进行分类的能力。我还没有尝试过这个想法,不确定它的可行性。
我想知道业内其他人正在为同样的问题做些什么。这不是唯一的问题,并且肯定有针对这种情况的最佳做法。
谢谢
由于您需要基于环境的不同变量(保管库机密只是另一个变量),因此您可以为每个环境使用单独的清单,请参阅 https://docs.ansible.com/ansible/2.8/user_guide/playbooks_best_practices.html#alternative-directory-layout。然后,例如,inventories/prod/group_vars/all.yml
将具有 prod 个保管库机密...您可以使用 ansible -i inventories/prod ...
.
明确指定每个清单
在此清单布局中,您可以使用符号链接在环境之间共享一个变量文件,例如。 inventories/prod/group_vars/all/010_cross_env_vars.yml
将是 ../../../010_cross_env_vars.yml
的符号链接,因此指向位于每个环境子目录的父目录中的变量文件,即。 inventories/010_cross_env_vars.yaml
.
对冗长表示歉意post。我是 Ansible 和 Vault 的新手(<2 个月)。
环境:
- CentOS & Win2019(90% Linux 系统)
- Ansible 2.10.7(主 Ansible 控制器)
- AWX 17.0.1(嵌入式 ansible 2.9.17)
最终目标:
- 对两种环境(生产和测试)使用来自 Git 的相同代码
- 能够根据环境 分离 'secrets' 值
基本设置(当前):
- Ansible 主控制器设计为完全自启动。这意味着所有 settings/configs 都包含在剧本中。这意味着我可以在 3 分钟内炸毁 ANS 控制器并重建。
- 所有秘密都是可变文件中的加密字符串。由于 AWX 无法导入 vaulted 文件,所有秘密都是内联的(ansible-vault encrypt_string 'secret_data' --name 'my_secret')
- 两种环境中存在相同的用户帐户,但凭据不同
当前问题:
- 如果将 Git 存储库导入我的 Prod Ansible 主控制器,任何需要秘密的播放都会失败(因为它有带有 'Test' 值的秘密变量)
想解决:
- 我考虑过将 ansible 'default' 函数与基于 Inventory 文件的 'when' 条件相结合的任何秘密。基本上,如果清单文件是基于 'Test' 的系统,则使用 'Test' 秘密。如果没有,则使用 'Prod' 秘密。
从我的角度来看,这是一个丑陋的解决方案,但必须是一个更好的解决方案。
- 使用 Hashicorp Vault。它具有使用名称空间树对信用进行分类的能力。我还没有尝试过这个想法,不确定它的可行性。
我想知道业内其他人正在为同样的问题做些什么。这不是唯一的问题,并且肯定有针对这种情况的最佳做法。
谢谢
由于您需要基于环境的不同变量(保管库机密只是另一个变量),因此您可以为每个环境使用单独的清单,请参阅 https://docs.ansible.com/ansible/2.8/user_guide/playbooks_best_practices.html#alternative-directory-layout。然后,例如,inventories/prod/group_vars/all.yml
将具有 prod 个保管库机密...您可以使用 ansible -i inventories/prod ...
.
在此清单布局中,您可以使用符号链接在环境之间共享一个变量文件,例如。 inventories/prod/group_vars/all/010_cross_env_vars.yml
将是 ../../../010_cross_env_vars.yml
的符号链接,因此指向位于每个环境子目录的父目录中的变量文件,即。 inventories/010_cross_env_vars.yaml
.