Ansible Vault 是批量部署中管理敏感数据最稳妥的内置方案,支持加密变量、Inventory、凭据文件及Jinja2模板,运行时内存解密、磁盘无明文,并可通过统一密码文件、分层加密结构和CI/CD安全集成实现自动化密钥管理。

Ansible Vault 是批量部署中管理敏感数据最稳妥的内置方案。它不改变你写 Playbook 的方式,也不要求额外服务或密钥中心,而是把密码、API 密钥、私钥等直接加密后存进 Git 仓库——运行时才在内存中解密,磁盘上永远不留明文。
哪些数据该加密
批量部署里常出现的敏感项,基本都落在这几类文件中:
- 变量文件:比如
group_vars/prod.yml里的数据库密码、管理员 token - Inventory 文件:如
inventory/production.ini中的ansible_ssh_pass或ansible_password - 专用凭据文件:像
secrets/db_creds.yml、secrets/api_keys.yml这类集中存放的密钥文件 - Jinja2 模板:含敏感值的
.j2文件(需整文件加密,不能只加密某字段)
注意:ansible.cfg 不能加密,但可以把其中的敏感配置(如 remote_user、private_key_file)移到加密变量文件里,再通过 vars_files 引入。
批量场景下的加密操作流
面对多环境、多角色的批量部署,建议用统一密码文件 + 分层加密结构,避免手动输密码出错:
- 先建一个安全的密码文件:
echo "my-vault-pass-2026" > vault.pass && chmod 600 vault.pass - 为不同环境分别创建加密文件:
ansible-vault create --vault-password-file=vault.pass group_vars/prod/vault.yml - 把共用密钥(如 CA 证书、SSH 私钥)单独加密到
group_vars/all/vault.yml,供所有环境调用 - 用
ansible-vault encrypt批量加密已有明文变量文件,例如:ansible-vault encrypt --vault-password-file=vault.pass group_vars/staging/*.yml
Playbook 中自动解密调用
只要文件被 Vault 加密,引入方式和普通变量文件完全一样,Ansible 会自动识别并解密:
- 在 Playbook 顶部用
vars_files引入:vars_files: ["group_vars/all/vault.yml", "group_vars/{{ env }}/vault.yml"] - 也可用
include_vars动态加载:- include_vars: "group_vars/{{ target_env }}/vault.yml" - 执行时指定密码来源:
ansible-playbook site.yml --vault-password-file=vault.pass -e env=prod
如果要支持多套密码(比如 dev 和 prod 用不同密钥),可用 --vault-id 区分:ansible-playbook site.yml --vault-id dev@vault-dev.pass --vault-id prod@vault-prod.pass,对应文件里用 $ANSIBLE_VAULT_ID 标识。
CI/CD 流水线中的安全集成
自动化部署最怕密码泄露,Vault 配合 CI 工具能真正实现“零明文落地”:
- 把
vault.pass存为 CI 平台的 secret 变量(如 GitLab CI 的VVAULT_PASS),运行时写入临时文件再传给--vault-password-file - 禁止在流水线日志中回显密码:确保 CI 配置开启屏蔽敏感变量输出
- 加一道校验:在 pipeline 前跑
ansible-vault view --vault-password-file=vault.pass secrets/test.yml 2>/dev/null && echo "OK",验证密码有效性 - 定期轮换密码:用
ansible-vault rekey更新所有文件密钥,旧密码立即失效

















