ansible vault 专用于加密敏感变量文件而非整个 playbook,应将密码、密钥等抽离为独立加密文件(如 secrets.yml),通过 vars_files 引入并设 no_log: true 防日志泄露;ci/cd 中用环境变量或临时密码文件非交互解密,多环境推荐 vault id 隔离密码。

Ansible Vault 不是用来加密整个 Playbook 文件的,而是专门保护其中的敏感变量——比如数据库密码、API 密钥、SSH 私钥等。直接加密 Playbook 会导致语法检查失效、IDE 无法识别、CI/CD 流水线难以调试,反而增加运维风险。真正安全又可持续的做法,是把敏感数据抽离为独立变量文件,用 Vault 加密它,并配合非交互式解密和运行时屏蔽机制。
把密码和密钥单独抽成加密变量文件
不要在 playbook.yml 或 inventory 中写明文密码。新建一个专用变量文件,例如 group_vars/prod/secrets.yml:
- 运行
ansible-vault create group_vars/prod/secrets.yml,输入主密码后,在编辑器中填入结构化内容:
db_password: "P@ssw0rd4Prod" api_token: "sk_live_abc123xyz789" ssh_private_key: | -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAu... -----END RSA PRIVATE KEY-----
- 保存即加密,Git 提交的是密文(AES-256),可放心纳入版本库;
- 确保该文件不被误加进
.gitignore—— 它本就该进仓库,只是内容已受保护。
Playbook 中安全加载与使用变量
在 Playbook 里通过 vars_files 显式引用加密文件,避免路径硬编码或混入普通变量:
- 示例片段(
deploy.yml):
- name: Deploy to production
hosts: prod_servers
become: true
vars_files:
- group_vars/prod/secrets.yml
tasks:
- name: Render config with credentials
template:
src: app.conf.j2
dest: /etc/myapp/config.conf
no_log: true-
no_log: true是关键:防止 Ansible 在 stdout 或日志中打印出{{ db_password }}的明文值; - 模板文件
app.conf.j2可自由使用{{ api_token }},Ansible 运行时自动解密注入,全程仅内存明文,磁盘无残留。
CI/CD 流水线中免交互自动解密
流水线不能手动输密码,必须用可信方式提供 Vault 密码:
- 推荐做法:从 CI 系统密钥管理功能(如 GitHub Secrets、GitLab CI Variables)读取 Vault 密码,写入临时受限文件:
echo "${VAULT_PASSWORD}" > /tmp/vault-pass
chmod 600 /tmp/vault-pass
ansible-playbook deploy.yml --vault-password-file /tmp/vault-pass- 更稳妥方式:设环境变量
ANSIBLE_VAULT_PASSWORD_FILE=/tmp/vault-pass,Ansible 自动识别; - 禁止用
--ask-vault-pass进入 CI 流程,否则会卡住构建。
用 Vault ID 区分多环境密钥,防错用混淆
开发、预发、生产环境应使用不同 Vault 密码,避免一处泄露波及全部:
- 创建时指定 Vault ID:
ansible-vault create --vault-id dev@prompt secrets-dev.yml ansible-vault create --vault-id prod@prompt secrets-prod.yml
- 运行时显式指定:
ansible-playbook deploy.yml --vault-id prod@/path/to/prod-vault-pass
- 这样即使文件名相似,也不会因密码通用而误解密;
- 同时支持同一 Playbook 复用多个加密文件(如
secrets-dev.yml+certs-prod.yml),各用各的密码。











