在GitHub环境中,有效管理ansible-vault的加密参数的技巧是什么?
首先
在实际场景中,我认为人们会使用GitHub或Bitbucket等平台来管理和共享Ansible的Playbook。
在这种情况下需要注意的是机密信息如密码的管理。
无论是公开还是私有仓库,都不应该上传这些信息。
为了应对这些问题,Ansible提供了一个名为ansible-vault的功能,它可以在Playbook执行时自动解密加密过的文件。非常方便!
然而,由于ansible-vault的加密是以文件为单位的,所以根据使用方式的不同,可能会导致管理变得困难的情况。
经常出现的情况
当想要将密码嵌入到模板中时
password={{ password }}
将名为”password”的参数记录在secret.yml中进行加密。
password: XXXXXXXX
加密后 huà
$ANSIBLE_VAULT;1.1;AES256
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...
上述的问题 de
新的成员会注意到模板中有一个名为“password”的参数,但即使在存储库内进行搜索,也会发现密钥都被加密,所以自然找不到它。
如果是一个人开发,那个人自己会了解到,所以应该没有问题。但是如果是团队开发,当有新成员加入时可能会引起混乱(就是我)。
解決方案
将变量分层,将普通变量与加密变量的层次分开。
通过这种方式,您可以指定value的不同层级变量,因此只需对value进行加密(参数password本身可搜索)。
样品
user={{ my_vars.user }}
password={{ my_vars.password }}
---
my_vars:
user: username
password: "{{ secret.password }}"
---
secret:
password: XXXXXXX
加密之后
$ANSIBLE_VAULT;1.1;AES256
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...
在vars.yml文件中,参数password本身并没有与参数user一起加密,因此搜索也很容易。
只需查看其value,即使无法知道具体的值,也能知道它是在secret.password中定义的。
剩下的是,要是在加密文件的文件名中加上” _secret “之类的命名规则,就能避免新成员的困惑了(依我看)。
请参考
在执行ansible-playbook时,可以通过输入密码进行解密,但考虑到实际操作,这种方式并不现实。相反,我们可以将加密时使用的密码存储在文件中,并在ansible-playbook运行时进行引用。
$ ansible-playbook -i hosts site.yml --vault-password-file /PATH/TO/.vault_password
这个也可以,但是如果你在ansible.cfg中的[defaults]部分进行如下配置,就不需要使用–vault-password-file选项了。
[defaults]
vault_password_file = /PATH/TO/.vault_password
只需将/PATH/TO/.vault_password在成员之间共享,就可以像平常一样使用ansible-playbook命令来执行。
一般情况下对加密文件进行的操作
现有文件的加密
也许使用 ansible-vault create 来创建新文件是更合适的做法,但在我的情况下,我通常在开发过程中不进行加密,而是在推送到代码库之前进行加密。
$ ansible-vault --vault-password-file /PATH/TO/.vault_password encrypt secret.yml
编辑加密文件
$ ansible-vault --vault-password-file /PATH/TO/.vault_password edit secret.yml
解密(个人很少使用)
$ ansible-vault --vault-password-file /PATH/TO/.vault_password decrypt secret.yml