怎么使用 Ansible vault 加密敏感变量文件并在 playbook 中调用

文章导读
使用 Ansible Vault 加密敏感变量文件的标准做法是直接加密整个 YAML 文件,而非单个变量值。在 Playbook 中通过 vars_files 加载加密文件,执行时通过 `--ask-vault-pass` 或 `--vault-password-file` 提供解密密码,避免明文密码泄露到版本控制系统。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

使用 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` 手动输入,自动化环境需创建密码文件并限制权限。密码文件权限必须设置为仅当前用户可读。

怎么使用 Ansible vault 加密敏感变量文件并在 playbook 中调用
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 保护你的敏感数据:完整指南