使用多ID的ansible-vault调用macOS钥匙串时为何查找default密钥?
问题原因与解决方案
核心原因
当你执行ansible-vault encrypt_string --vault-id dev时,Ansible的执行逻辑是:
- 首先尝试在当前目录查找名为
dev的文件,尝试读取其中的密码; - 找不到该文件时,会回退使用
ANSIBLE_VAULT_PASSWORD_FILE指向的脚本,但默认情况下,这个脚本会去钥匙串中查找default密钥,而非你指定的dev——这就是错误提示的来源。
而--vault-id dev@~/.vault/vault-keyring-client.py能正常工作,是因为这种格式明确关联了dev这个Vault ID和对应的脚本,Ansible会把dev作为参数传递给脚本,脚本据此去钥匙串中查找匹配的dev条目。
解决方案
方案1:使用ANSIBLE_VAULT_IDENTITY_LIST绑定ID与脚本
这是最简洁的方式,直接通过环境变量把Vault ID和对应的密码脚本关联起来:
export ANSIBLE_VAULT_IDENTITY_LIST="dev@~/.vault/vault-keyring-client.py,prod@~/.vault/vault-keyring-client.py"
设置完成后,直接执行ansible-vault encrypt_string --vault-id dev,Ansible会自动调用对应的脚本,并传递dev作为Vault ID参数,脚本就能正确从钥匙串中读取对应密码。
方案2:修改脚本适配Vault ID参数
如果你坚持使用ANSIBLE_VAULT_PASSWORD_FILE,需要修改vault-keyring-client.py,让它能识别Ansible传递的Vault ID:
- Ansible会通过环境变量
ANSIBLE_VAULT_ID传递当前指定的Vault ID; - 修改脚本中查找密钥的逻辑,优先使用
ANSIBLE_VAULT_ID的值,而非默认的default。
比如找到脚本中类似如下的代码片段,确保它优先读取环境变量:
key = os.environ.get('ANSIBLE_VAULT_ID', 'default')
这样当你指定--vault-id dev时,脚本就会去查找钥匙串中的dev条目。
验证
设置好上述任一方案后,执行:
ansible-vault encrypt_string --vault-id dev
此时应该能正常读取钥匙串中的dev密码,完成加密操作。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

