巧妙运用Ansible Vault
在使用Ansible处理密码、API密钥等机密信息时,可以使用ansible-vault来将变量保存为加密的文件。
我以前写过一个简单的使用方法,可以试试Ansible Vault。
然而,由于ansible-vault只能对文件进行加密,所以甚至会将无需加密的项目全部加密,导致甚至无法确定定义了哪些变量的问题。这相当不方便。
我一直以来都这么想,可是在我阅读文件的时候突然发现了这个问题的解决方案。
拆分主机和组特定数据 hé zǔ
令人惊讶的是,在ansible-vault版本1.5推出之前,已经存在了版本1.4中的这个功能!
但是
作为高级用例,您可以创建以您的组或主机命名的目录,并且Ansible将读取这些目录中的所有文件。以‘raleigh’组为例。
在使用 Ansible Vault 时,推荐将子目录纳入其中进行说明是在 1.8 版本引入的。
关于这个功能,比如说如果想在属于 appservers 组的主机上处理数据库的密码,即使在 group_vars/appservers 文件中有除密码以外的其他不需要保密的变量,如果全部都使用 vault 进行加密,那就会带来使用上的不便,正如前面所述。
实际上,您可以将group_vars/appservers/public.yml和group_vars/appservers/db_password.valut等文件放置在以组名命名的目录下,该工具将自动读取所有文件。
如果是这种情况,可以将加密的文件命名规则设定为变量名作为文件名,这样无论在哪里以及如何定义变量,即使是不知道解密密码的人也能够知道。
另外,如果是文本文件的话,只需要在文件名后加上.yml后缀就能对编辑器起到提示作用。如果加密文件被保存在vault中,只需要用.vault作为后缀,通过文件名就能知道该文件已经被加密了。
2017年9月28日 附加说明
从 Ansible 2.2.1 开始,变量文件只能读取扩展名为 .yml、.yaml、.json 或没有拓展名(不包含点的)的文件。(可以从 https://github.com/ansible/ansible/issues/18223 追溯)
在Variables and Vaults这一项最佳实践中。
建立一个名为 group_vars/{group_name}/vars 的文件以及一个名为 group_vars/{group_name}/vault 的文件,并将变量存储在 vars 文件中。
password: "{{ vault_password }}"
some_secret: "{{ some_secret }}"
将文件保存在保险库中
vault_password: "XXXXXXX"
some_secret: "YYYYYYYY"
写着要进行加密的话。
再来一个额外的。
在使用 Ansible Vault 的 playbook 中,需要将 ansible.cfg 文件放置在其根目录。
[defaults]
ask_vault_pass = True
如果写成-ask-vault-pass选项忘记了
ERROR: A vault password must be specified to decrypt ...
你就不会再被责怪了。
[defaults]
vault_password_file=/some/where/password.txt
也可以这样做。如果写在全局设置中,密码可能会不同,请注意。