Ansible Vault 是 Ansible 提供的一套用于保护敏感数据的机制,可以对各类配置文件进行加密,防止敏感信息(如密码、私钥、API 密钥等)以明文形式暴露在代码仓库或配置文件中。
一、为什么需要 Ansible 加密?
场景说明:
- Playbook 中包含数据库密码、API Token、SSH 私钥等敏感信息
- Inventory(主机清单)中直接写入了连接密码(如
ansible_password) - 变量文件(vars/main.yml)中包含机密配置
✅ Ansible Vault 的优势:
可以对 任何文件类型 进行加密,包括但不限于:
- Playbook(.yml)
- Inventory 文件(hosts.ini / inventory.yml)
- Jinja2 模板(.j2)
- 变量文件(group_vars/、host_vars/)
- 普通文本文件(如证书、密钥)
❌ 例外:
ansible.cfg不能被加密!
原因:Ansible 启动时需读取该配置文件,若被加密则无法加载,导致命令失败。
解决方案:保留一个空白或未加密的ansible.cfg,将原加密文件重命名(如ansible.cfg.vault),使用时再解密。
二、Ansible Vault 常用命令详解
| 命令 | 功能 | 说明与示例 |
|---|---|---|
| ansible-vault create filename | 创建并加密新文件 | 交互式输入密码后,直接进入编辑器(如 vim)编写内容bash<br>ansible-vault create secrets.yml<br> |
| ansible-vault encrypt filename | 加密已存在的文件 | 对已有明文文件加密bash<br>ansible-vault encrypt db_password.yml<br> |
| ansible-vault edit filename | 编辑加密文件 | 自动解密 → 编辑 → 保存时重新加密bash<br>ansible-vault edit inventory.ini<br> |
| ansible-vault view filename | 查看加密文件内容(不解密到磁盘) | 临时解密并在终端显示内容bash<br>ansible-vault view vault-vars.yml<br> |
| ansible-vault decrypt filename | 永久解密文件(移除加密) | 将文件转为明文,慎用!bash<br>ansible-vault decrypt secrets.yml<br> |
| ansible-vault rekey filename | 修改加密文件的密码 | 需先输入旧密码,再设置新密码bash<br>ansible-vault rekey app-secrets.yml<br> |
🔐 所有命令执行时都会提示输入 Vault 密码(除非使用
--vault-password-file)
三、使用加密文件运行 Playbook 的方式
方式 1:交互式输入密码(适合手动操作)
1ansible-playbook deploy-app.yml --ask-vault-pass 2
- 执行时会提示:
Vault password: - 适用于单次调试或小规模运维
方式 2:通过密码文件免交互(适合自动化脚本/CI/CD)
1ansible-playbook deploy-app.yml --vault-password-file ~/.vault-pass.txt 2
~/.vault-pass.txt内容仅为一行密码(无换行建议):
1MySuperSecret123!
- 权限建议:
chmod 600 ~/.vault-pass.txt防止他人读取
四、多密码场景处理(不同文件用不同密码)
场景举例:
inventory.ini用密码 A 加密vars/prod.yml用密码 B 加密playbook.yml本身未加密,但引用了上述两个文件
解决方案:
✅ 方式一:统一密码(推荐)
所有敏感文件使用同一个 Vault 密码,简化管理。
✅ 方式二:多密码文件(Ansible ≥ 2.4 支持)
1ansible-playbook playbook.yml \ 2 --vault-id prod@prod-pass.txt \ 3 --vault-id inv@inv-pass.txt 4
或简写(按顺序匹配):
1ansible-playbook playbook.yml \ 2 --vault-password-file prod-pass.txt \ 3 --vault-password-file inv-pass.txt 4
💡 注意:Ansible 会尝试用每个密码依次解密所有加密文件,直到成功。
✅ 方式三:预解密(不推荐,有安全风险)
1ansible-vault decrypt inventory.ini --vault-password-file inv-pass.txt 2ansible-vault decrypt vars/prod.yml --vault-password-file prod-pass.txt 3ansible-playbook playbook.yml # 此时文件已是明文 4# 使用完后记得重新加密! 5
五、最佳实践建议
- 不要将
ansible.cfg加密 - 敏感信息尽量放在独立变量文件中加密,而非直接写在 Playbook 里
- 使用
.gitignore排除密码文件(如vault-pass.txt) - 在 CI/CD 中通过环境变量传递 Vault 密码(更安全):
1echo "$VAULT_PASS" > /tmp/vault-pass && chmod 600 /tmp/vault-pass 2ansible-playbook site.yml --vault-password-file /tmp/vault-pass 3rm /tmp/vault-pass
- 定期使用
rekey更换密码
六、练习题
基础题
- 创建一个名为
db_secrets.yml的加密文件,内容为:
1db_user: admin 2db_pass: S3cr3tP@ss!
并使用密码 myvault123 加密。
2. 编写一个 Playbook test-vault.yml,引用上述 db_secrets.yml,并在任务中输出 db_pass 的值(使用 debug 模块)。如何运行该 Playbook?
3. 如何查看 db_secrets.yml 的内容而不将其解密到磁盘?
进阶题
- 假设你有两个加密文件:
inventory.ini(密码:pass1)group_vars/prod.yml(密码:pass2)
编写一条命令,使用两个不同的密码文件运行deploy.yml。
- 如果误将
ansible.cfg加密了,导致ansible --version报错,应如何恢复? - 在 Shell 脚本中自动化运行加密的 Playbook,要求不交互输入密码,且密码来自环境变量
ANSIBLE_VAULT_PASS。
《Ansible自动化(十五):加解密详解》 是转载文章,点击查看原文。