Ansible Vault现在可以对每个变量进行加密
2017年3月25日:新增文档。根据此链接 http://docs.ansible.com/ansible/playbooks_vault.html#single-encrypted-variable 可知,从2.3版本开始引入了这个功能。同时,官方将其称为「单个加密变量」。
每个变量保险库
Ansible Vault是一种功能,可以以Ansible可处理的状态将机密信息(如密码)加密。然而,尽管通常只需要加密值而不需要加密变量名称,但在以往,必须将一系列变量名称和其值一起定义在一个文件中进行加密。
结果是,用户无法通过查看加密文件来了解定义了哪些变量。
在此,Ansible 2.2 以后,可以对每个变量的值进行加密。
这个功能被称为 per variable vault 等。
用法
-
- 値をまず「!vault」で始める(「!vault-encrypted」でも良い)。
-
- この後改行を含む文字列を記述するので、改行を保存することを表す”|”を記述する。
- ansible-vault encryptなどのコマンドで暗号化した値をその後に記述する。ただし、YAMLなのでインデントが必要になる。
总结来说,如果要使用名为vault_pass的Ansible Vault文件中写有密码的文件来将变量”test_password”设置为”PASSWORD”的值,只需执行以下命令。
$ echo -n 'PASSWORD' | ansible-vault encrypt --vault-password-file vault_pass | awk 'BEGIN { printf "%s: !vault |\n", "test_password" } { printf "%2s%s\n", "", $0 }' >> role_test1/vars/main.yml
可以使用ansible-vault encrypt_string在Ansible 2.3中执行到目前为止的操作。将 echo -n ‘PASSWORD’ | ansible-vault encrypt_string –vault-password-file vault_pass 的标准输出粘贴到变量的位置,并调整缩进。
执行此操作后,role_test1/vars/main.yml文件的内容将如下所示。
(假设role_test1角色已经通过ansible-galaxy init –offline role_test1命令创建)
---
# vars file for role_test1
test_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
36633235636233353730356634363634323665656431646337393138383335346434636336386234
3136326634306139343639636433623764643530376231610a333761383265343238653534663161
38653332336437336663343437353831663363303464313061663564343435623762343963333635
3030613963326537350a353333636533326166353234366539613730363864626331633565333966
3035
让我们确认它是否可用。
将role_test1/tasks/main.yml设置如下。
---
# tasks file for role_test1
- debug:
var: test_password
创建一个调用role_test1的base_test1.yml文件。
- hosts: localhost
roles:
- role_test1
尝试执行以下命令:ansible-playbook –vault-password-file vault_pass base_test1.yml。
$ ansible-playbook --vault-password-file vault_pass base_test1.yml
[WARNING]: provided hosts list is empty, only localhost is available
PLAY [localhost] ***************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [role_test1 : debug] ******************************************************
ok: [localhost] => {
"test_password": "PASSWORD"
}
PLAY RECAP *********************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0
我能看到加密之前的字符串。
请留意
-
- 今のところansible_passwordを暗号化すると接続に失敗する。同様にansible_become_passを暗号化するとsudoに失敗する。報告したら修正されたので2.2.1では直っているはず。
-
- https://github.com/ansible/ansible/issues/19795
-
- 2017-01-17追記:2.2.1で修正されているのを確認した。
-
- 2017-06-03追記:このissueには続きがあってwinrm接続が未だに失敗する。
- この方法で暗号化されたものを含むファイルに対してansible-vaultコマンドを使うことはできない。なので例えば暗号化前の文字列を確認したければ上のように適当なplaybookを作るとか、適当なファイルを作ってコピペしてからansible-vault viewを使うとか。
回家结果
在编写Ansible的清单文件时,我曾以为只有使用Ansible Vault加密的内容才会放置在host_vars目录或group_vars目录中。然而,考虑到per variable vault,host_vars目录和group_vars目录似乎不再需要,我们可以将之前在这些目录中定义的变量直接定义在清单文件中。(假设已解决了相关的错误)