使用 Ansible Vault 加密敏感变量文件的标准做法是直接加密整个 YAML 文件,而非单个变量值。在 Playbook 中通过 vars_files 加载加密文件,执行时通过 `--ask-vault-pass` 或 `--vault-password-file` 提供解密密码,避免明文密码泄露到版本控制系统。
先说结论:Ansible Vault 使用 AES-256 对称加密算法保护文件内容,仅在 Playbook 运行时解密,适合存储数据库密码、API 密钥等敏感信息。
- 适合场景:变量文件、配置文件、任何包含明文凭据的 YAML 文件
- 优先操作:设置密码文件权限为 600,避免其他用户读取
- 验收标准:Playbook 运行时无报错,敏感变量值正确加载且日志不泄露明文
命令速用版
创建加密文件并设置密码,系统会打开编辑器输入内容:
ansible-vault create secrets.yml执行 Playbook 时交互式输入密码:
ansible-playbook site.yml `--ask-vault-pass`使用密码文件自动解密(生产环境推荐):
ansible-playbook site.yml `--vault-password-file` ~/.vault_pass.txt为什么会这样
Ansible Vault 设计为文件级加密工具,而非字符串加解密服务。它通过 AES-256 算法将整个文件内容转换为密文,只有在执行 Playbook 且提供正确密码时,Ansible 引擎才会在内存中解密并注入变量。这种机制确保存储在磁盘或 Git 仓库中的文件始终是密文,防止因权限配置失误导致敏感数据泄露。
分步处理
第一步:创建或加密变量文件。使用 ansible-vault create 新建文件,或对已有明文文件使用 ansible-vault encrypt。确保文件内只包含变量定义,不要混入 Playbook 逻辑。
第二步:在 Playbook 中引用加密文件。使用 vars_files 指令静态加载,变量可在 tasks、when 条件中直接使用。避免在 vars 字典中直接使用 !vault 标签,这会降低可维护性。
vars_files:
- secrets.yml第三步:配置密码提供方式。开发环境可用 `--ask-vault-pass` 手动输入,自动化环境需创建密码文件并限制权限。密码文件权限必须设置为仅当前用户可读。
chmod 600 ~/.vault_pass.txt怎么验证是否生效
运行前使用 `--check` 参数模拟执行,确认变量加载无误且无解密报错。使用 ansible-vault view 命令查看加密文件内容,若能正常显示明文则说明加密状态正常且密码正确。
ansible-playbook site.yml `--check` `--ask-vault-pass`
ansible-vault view secrets.yml检查执行日志,确认敏感变量值未以明文形式输出到 stdout 或日志文件中。
常见坑
不要用普通编辑器直接修改加密文件。直接 vim 编辑加密后的文件会破坏 Vault 头部标识,导致无法解密。必须使用 ansible-vault edit 命令进行修改。
多环境密码管理复杂。如果 dev/test/prod 环境使用不同密码,需配合 `--vault-id` 参数区分,或为不同环境创建独立的加密文件,避免单一密码文件泄露影响所有环境。
密码文件权限风险。存储 Vault 密码的文件若权限设置为 644 或更高,同一主机上的其他用户可能读取该密码,从而解密所有敏感数据。
常见问题
能否只加密变量文件中的某个字段?
可以但不推荐。Ansible 支持 encrypt_string 加密单个字符串,但维护成本高且 diff 不友好,建议直接加密整个变量文件。
忘记 Vault 密码怎么办?
无法恢复。Vault 采用对称加密,没有后门或重置机制,丢失密码意味着加密文件内容永久不可读,必须重新生成敏感数据。
CI/CD 流水线中如何安全传入密码?
通过流水线系统的秘密管理功能注入密码文件内容,运行时写入临时文件并在使用后立即销毁,避免密码持久化存储在构建节点。
参考来源
- 来源名:CSDN 博客,页面标题:Ansible Vault 加密敏感数据:密码 / 密钥加密存储,避免 Playbook 泄露信息
- 来源名:知识库,页面标题:怎么在 Ansible 中利用 Vault 加密自动化脚本中敏感变量
- 来源名:知识库,页面标题:使用 Ansible Vault 保护你的敏感数据:完整指南