Ansible Playbook 中的密钥管理指南
Ansible 密钥管理三条进阶路径:vars_prompt 交互输入(零存储)、Ansible Vault 加密入库(AES-256)、对接外部密钥管理系统(Vault/AWS SM 等)。附全程安全最佳实践。
直接回答:Ansible 管密钥按成熟度分三层——手动场景用 vars_prompt 运行时交互输入(不落盘);团队协作用 Ansible Vault 把加密后的文件/变量提交进仓库(AES-256,运行时解密);企业级对接外部密钥管理系统(HashiCorp Vault、云厂商 SM)运行时拉取。明文密钥写进 playbook 是唯一错误答案。
第一层:交互输入
vars_prompt:
- name: db_password
prompt: "输入数据库密码"
private: true
提示输入不落入 playbook,但运行内存、debug 或目标配置仍可能泄漏——但只适合人工执行的 playbook,CI/CD 用不了。
第二层:Ansible Vault
ansible-vault create secrets.yml # 新建加密文件
ansible-vault encrypt_string --name api_key --stdin-name api_key # 只加密单个变量
ansible-playbook site.yml --ask-vault-pass # 运行时解密
加密内容可以安全进 Git——团队共享密钥而不共享明文。单变量加密(encrypt_string)比整文件加密更利于代码审查。
第三层:外部密钥系统
HashiCorp Vault、AWS Secrets Manager、Azure Key Vault 等通过 lookup 插件运行时拉取:
password: "{{ lookup('community.hashi_vault.vault_kv2_get', 'db', engine_mount_point='secret').secret.password }}"
示例为变量片段,需安装 community.hashi_vault、hvac 并配置 Vault 地址、认证和最小权限;含密钥的消费任务设 no_log。密钥存储与审计由外部系统管理,应用侧轮换仍需协同,Ansible 只做消费者——这是企业级的正确姿势。
安全最佳实践
- no_log: true:含密钥的任务关闭日志输出,防密码进日志文件
- 仓库加
.gitignore防明文文件误提交;CI 的 vault 密码走密钥变量注入 - 业务密钥与 Vault 加密密码分别轮换;rekey 只更换文件加密密码,不更新数据库/API 凭证;单变量密文须重新 encrypt_string
- 轮换后用新凭证验证关键接口,并检查客户端的认证失败记录;验证输出不记录密钥明文。
常见问题(FAQ)
Q:Vault 密码本身怎么保管?
A:密码管理器(1Password 等)存主密码;CI 环境用密钥管理服务注入为环境变量。多套环境可用 vault-id 分密码管理。
Q:加密文件能看 diff 吗?
A:密文 diff 无意义——配 git 的 textconv 驱动(ansible-vault view)只在受控本地终端显示解密内容,不输出到 CI 日志或共享审查系统,或直接用单变量加密降低 review 粒度。
Q:lookup 插件拉密钥的性能开销?
A:每次执行都实时请求外部系统——高频 playbook 建议拉到后缓存进内存变量,或对网络故障做好重试。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。