Ansible Vault:为自动化加密保护密钥
Ansible Vault 用 AES-256 加密 playbook 中的敏感数据:整文件加密或单变量加密,运行时自动解密对自动化透明。本文覆盖核心命令、密码管理、实战场景与团队协作姿势。
直接回答:Ansible Vault 是内置的密钥加密功能——AES-256 加密整个文件或单个变量,强密码保护的密文可入 Git,但需考虑历史密文泄露和离线破解风险,playbook 执行时自动解密,对自动化流程完全透明。核心命令:create/edit/encrypt/encrypt_string/decrypt/rekey;团队用 vault-id 管理多套密码。
两种加密粒度
# 整文件加密
ansible-vault create group_vars/all/vault.yml
# 单变量加密(推荐)
ansible-vault encrypt_string --stdin-name db_password
# 以下仅示意密文格式,不是有效密钥内容:
db_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
6638643965...
单变量加密保留其他字段可读,但密文 diff 仍不可读,且不能保证运行期不泄漏。
运行时解密
ansible-playbook site.yml --ask-vault-pass # 交互输入
ansible-playbook site.yml --vault-password-file ~/.vault_pass # 密码文件(chmod 600)
ansible-playbook site.yml --vault-id prod@prompt # 命名密码
团队协作姿势
- 主密码存密码管理器,绝不进仓库
- 多环境分密码:
--vault-id dev@... --vault-id prod@... - 人员变动时轮换文件加密密码及已知业务凭证;rekey 不会轮换数据库密码,单变量密文需重新生成。轮换业务凭证后,逐一验证依赖客户端的认证结果,不记录凭证明文。
- CI/CD 通过受保护凭证脚本或权限受限临时密码文件提供密码;普通环境变量不会自动变为 Vault 密码源
实战场景
API key、数据库密码、TLS 私钥、云服务凭证——任何会进 playbook 的敏感值都应过 Vault。配合 no_log: true 任务属性,减少任务结果泄露;debug、diff、控制端 ANSIBLE_DEBUG 与目标应用日志仍要单独防护。
常见问题(FAQ)
Q:忘记 Vault 密码能找回吗?
A:不能——AES-256 没有后门。这就是主密码必须进密码管理器的原因;丢失等于重新生成全部密钥。
Q:加密文件损坏怎么办?
A:密文本身在 Git 里有历史,git 回滚可恢复;改密文导致解不开时同样回滚处理。
Q:和外部密钥管理系统冲突吗?
A:不冲突,是层级关系——中小团队 Vault 够用;需要集中轮换、审计、动态密钥的企业场景,Ansible 通过 lookup 插件消费外部系统,Vault 退为兜底。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。