You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:43:31