ansible vault 可安全加密敏感变量至独立文件(如 secrets.yml),通过密码文件或环境变量在 ci/cd 中非交互解密,配合 no_log 和 vault id 实现全流程防护。

直接用 Ansible Vault 把数据库密码和 Token 加密进变量文件,再通过非交互方式解密运行,就能在 CI/CD 流水线中避免明文泄露。关键不是“能不能加”,而是“怎么加得安全、不卡流程”。
加密敏感数据到独立变量文件
不要把密码写在 Playbook 里,单独建一个加密文件,比如 secrets.yml:
- 运行
ansible-vault create secrets.yml,输入主密码后,在编辑器里写入:
db_password: "$6$rounds=5000$salt$hash..."<br>api_token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
- 保存即加密,文件内容变成乱码,Git 提交也只存密文。
- 确保该文件不被误加入
.gitignore—— 它本就该进版本库,只是内容已加密。
流水线中自动解密(免交互)
CI/CD 环境不能手动输密码,必须用密码文件或环境变量方式提供 Vault 密码:
- 在流水线作业开始前,把 Vault 密码写入临时文件(如
/tmp/vault-pass),并设权限:chmod 600 /tmp/vault-pass; - 执行时带上参数:
ansible-playbook deploy.yml --vault-password-file /tmp/vault-pass; - 更稳妥的做法:从 CI 系统的密钥管理功能(如 GitHub Secrets、GitLab CI Variables)注入密码,再写入文件或通过
ANSIBLE_VAULT_PASSWORD_FILE环境变量指向它。
Playbook 中安全引用与使用
变量加载和使用需保持清晰隔离,防止意外暴露:
- 在
deploy.yml中用vars_files加载,不写死路径,也不混入普通变量:
- name: Deploy app<br> hosts: app_servers<br> become: true<br> vars_files:<br> - secrets.yml # 明确标识为加密源<br> tasks:<br> - name: Configure database<br> template:<br> src: db.conf.j2<br> dest: /etc/app/db.conf<br> no_log: true # 防止日志打印密码值
-
no_log: true是重要补充,避免 Ansible 执行时把变量值打到 stdout 或日志中; - 模板文件(如
db.conf.j2)里直接用{{ db_password }},Ansible 运行时自动解密注入,全程内存中明文,磁盘无残留。
额外加固建议
防住常见疏漏点,让机制真正落地:
- 禁止对整个 Playbook 文件加密(如
ansible-vault encrypt deploy.yml),会导致语法检查、语法高亮、IDE 支持全部失效,维护成本陡增; - 不同环境(dev/staging/prod)建议用 Vault ID 区分密码,例如
ansible-vault create --vault-id prod@prompt secrets-prod.yml,运行时指定--vault-id prod@/path/to/prod-pass,避免一套密码全环境通用; - 定期轮换 Vault 密码:用
ansible-vault rekey secrets.yml更新加密密钥,旧密码立即失效。











