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:交互式输入密码(适合手动操作)
bash
ansible-playbook deploy-app.yml --ask-vault-pass
- 执行时会提示:
Vault password: - 适用于单次调试或小规模运维
方式 2:通过密码文件免交互(适合自动化脚本/CI/CD)
bash
ansible-playbook deploy-app.yml --vault-password-file ~/.vault-pass.txt
-
~/.vault-pass.txt内容仅为一行密码(无换行建议):MySuperSecret123! -
权限建议 :
chmod 600 ~/.vault-pass.txt防止他人读取
四、多密码场景处理(不同文件用不同密码)
场景举例:
inventory.ini用密码 A 加密vars/prod.yml用密码 B 加密playbook.yml本身未加密,但引用了上述两个文件
解决方案:
✅ 方式一:统一密码(推荐)
所有敏感文件使用同一个 Vault 密码,简化管理。
✅ 方式二:多密码文件(Ansible ≥ 2.4 支持)
bash
ansible-playbook playbook.yml \
--vault-id prod@prod-pass.txt \
--vault-id inv@inv-pass.txt
或简写(按顺序匹配):
bash
ansible-playbook playbook.yml \
--vault-password-file prod-pass.txt \
--vault-password-file inv-pass.txt
💡 注意:Ansible 会尝试用每个密码依次解密所有加密文件,直到成功。
✅ 方式三:预解密(不推荐,有安全风险)
bash
ansible-vault decrypt inventory.ini --vault-password-file inv-pass.txt
ansible-vault decrypt vars/prod.yml --vault-password-file prod-pass.txt
ansible-playbook playbook.yml # 此时文件已是明文
# 使用完后记得重新加密!
五、最佳实践建议
-
不要将
ansible.cfg加密 -
敏感信息尽量放在独立变量文件中加密,而非直接写在 Playbook 里
-
使用
.gitignore排除密码文件 (如vault-pass.txt) -
在 CI/CD 中通过环境变量传递 Vault 密码 (更安全):
bashecho "$VAULT_PASS" > /tmp/vault-pass && chmod 600 /tmp/vault-pass ansible-playbook site.yml --vault-password-file /tmp/vault-pass rm /tmp/vault-pass -
定期使用
rekey更换密码
六、练习题
基础题
-
创建一个名为
db_secrets.yml的加密文件,内容为:yamldb_user: admin db_pass: S3cr3tP@ss!并使用密码
myvault123加密。 -
编写一个 Playbook
test-vault.yml,引用上述db_secrets.yml,并在任务中输出db_pass的值(使用debug模块)。如何运行该 Playbook? -
如何查看
db_secrets.yml的内容而不将其解密到磁盘?
进阶题
-
假设你有两个加密文件:
inventory.ini(密码:pass1)group_vars/prod.yml(密码:pass2)
编写一条命令,使用两个不同的密码文件运行deploy.yml。
-
如果误将
ansible.cfg加密了,导致ansible --version报错,应如何恢复? -
在 Shell 脚本中自动化运行加密的 Playbook,要求不交互输入密码,且密码来自环境变量
ANSIBLE_VAULT_PASS。