求助:单个passfile无法解密多密码加密的Ansible Vault文件
我的Ansible Playbook内容如下:
--- - hosts: all vars_files: - files/test1/.env - files/test2/.env - files/test3/.env roles: - role: test1 - role: test2 - role: test3
所有.env文件都用ansible-vault以不同密码加密,我准备了一个.passfile,内容是按文件顺序排列的三个密码:
pass1 pass2 pass3
但执行验证命令时出现解密失败:
ansible-vault view files/test1/.env --vault-pass-file .passfile
错误信息:
ERROR! Decryption failed (no vault secrets were found that could decrypt) on files/test1/.env for files/test1/.env
如果只在.passfile里留pass1,命令能正常执行;但跑Playbook时,单密码无法解密其他文件,加多个密码后又会出现部分文件解密失败的问题。已经确认.passfile没有多余空格或换行,密码包含特殊字符。
现在需要解决:怎么用单个.passfile解密所有不同密码加密的文件?
Ansible默认只会用--vault-pass-file里的第一个密码尝试解密所有加密文件,不会自动按顺序匹配文件和密码。要实现不同文件用不同密码解密,得用Vault ID来绑定密码和对应的文件:
1. 修改.passfile格式,添加Vault ID标识
把.passfile改成键值对格式,每行写成[Vault ID]:[密码],示例:
test1:pass1 test2:pass2 test3:pass3
注意:如果密码里有特殊字符(比如冒号、空格),要用单引号把密码包起来,比如
test1:'pass:1@abc'
2. 给每个加密文件绑定对应的Vault ID
如果文件已经加密,用rekey命令重新关联Vault ID;如果是新加密,直接指定Vault ID即可:
- 重新关联test1的.env文件:
ansible-vault rekey files/test1/.env --vault-id test1@.passfile
- 同理处理另外两个文件:
ansible-vault rekey files/test2/.env --vault-id test2@.passfile ansible-vault rekey files/test3/.env --vault-id test3@.passfile
执行rekey时会要求输入原密码验证,验证通过后就会把文件和对应的Vault ID绑定
3. 执行Playbook时指定所有Vault ID
有两种方式让Ansible识别所有Vault ID:
方式一:在Playbook里直接声明
修改Playbook,添加vault_ids字段:
--- - hosts: all vault_ids: - test1 - test2 - test3 vars_files: - files/test1/.env - files/test2/.env - files/test3/.env roles: - role: test1 - role: test2 - role: test3
然后执行Playbook时带上密码文件参数:
ansible-playbook your_playbook.yml --vault-pass-file .passfile
方式二:执行命令时指定所有Vault ID
直接在命令里逐个指定:
ansible-playbook your_playbook.yml --vault-id test1@.passfile --vault-id test2@.passfile --vault-id test3@.passfile
如果嫌麻烦,可以创建一个vault-ids.txt文件,内容如下:
test1@.passfile test2@.passfile test3@.passfile
然后执行:
ansible-playbook your_playbook.yml --vault-id @vault-ids.txt
4. 验证单个文件解密
现在可以用指定Vault ID的方式验证解密是否正常:
ansible-vault view files/test1/.env --vault-id test1@.passfile
或者直接用包含所有Vault ID的文件,Ansible会自动匹配对应的密码:
ansible-vault view files/test1/.env --vault-id @vault-ids.txt
内容的提问来源于stack exchange,提问作者anonymous

