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

使用多ID的ansible-vault调用macOS钥匙串时为何查找default密钥?

问题原因与解决方案

核心原因

当你执行ansible-vault encrypt_string --vault-id dev时,Ansible的执行逻辑是:

  1. 首先尝试在当前目录查找名为dev的文件,尝试读取其中的密码;
  2. 找不到该文件时,会回退使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:02:31