ansible-vault 用于加密整个变量文件而非单个密码字符串,需分离敏感与非敏感变量至不同文件,使用 create/edit/view 命令操作加密文件,通过 vars_files 加载,配合 vault-password-file 或环境变量管理解密,且须重视 vault 密码生命周期与权限控制。

ansible-vault 不是用来“加密密码字符串本身”,而是加密整个文件——把明文密码放进 YAML 变量文件里,再用 ansible-vault 加密那个文件。直接对单个密码字段或字符串做 AES 加密(比如用 Python 的 cryptography 库)不是 Vault 的设计目标,也破坏了 Ansible 的变量加载机制。
加密前必须拆分:敏感变量和普通变量不能混在同一个文件里
把 db_password 和 app_version 写进同一个 group_vars/prod.yml,然后对它整体加密,会导致所有变量(包括非敏感的)都不可读、无法调试、IDE 无法语法校验。
- 推荐做法:在
group_vars/prod/下建两个文件:vars.yml(明文,放app_name、region等)和vault.yml(加密,只放vault_db_password、vault_api_token) - 变量名加
vault_前缀是约定,不是强制,但能一眼识别哪些值需解密、哪些可直接查 -
ansible.cfg绝对不能加密——Ansible 启动时就读它,加密即报错ERROR! Invalid vault header
创建和编辑加密文件必须用 ansible-vault create 或 ansible-vault edit
别用 ansible-vault encrypt existing.yml 处理已有明文文件,尤其当它已被 Git 跟踪过——你会不小心把明文历史留在 Git 中。新项目一律从 create 开始。
-
ansible-vault create group_vars/prod/vault.yml→ 输入密码 → 编辑器打开 → 写入:
--- vault_db_password: "prod-db-2026!" vault_ssh_key: |- -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA... -----END RSA PRIVATE KEY-----
- 后续修改只用
ansible-vault edit group_vars/prod/vault.yml:自动解密 → 编辑 → 保存时重加密,全程无明文落盘 - 想临时看内容?用
ansible-vault view group_vars/prod/vault.yml,不写入磁盘,适合 CI 日志排查
Playbook 中加载加密变量:vars_files 是唯一安全路径
别在 vars: 块里硬编码 db_password: !vault | ...,那是旧版(Ansible
- 正确加载方式(在 Play 顶层):
- name: Deploy to prod
hosts: prod_servers
vars_files:
- group_vars/prod/vault.yml
- group_vars/prod/vars.yml
tasks:
- name: Render config
template:
src: app.conf.j2
dest: /etc/app/conf
no_log: true
-
no_log: true必须加在调用敏感变量的任务上,否则{{ vault_db_password }}可能被打印进 Ansible stdout 或日志 - 模板中直接用
{{ vault_db_password }},Ansible 运行时自动解密注入,无需额外函数或 filter
CI/CD 流水线里避免交互输密码:用 --vault-password-file 或 ANSIBLE_VAULT_PASSWORD_FILE
在 GitHub Actions 或 GitLab CI 里敲 --ask-vault-pass 就卡死。必须提前把 Vault 密码存成文件,并严格控制权限。
- 流水线脚本开头加:
echo "${{ secrets.ANSIBLE_VAULT_PASS }}" > /tmp/vault-pass
chmod 600 /tmp/vault-pass
- 执行命令:
ansible-playbook deploy.yml --vault-password-file /tmp/vault-pass
- 更稳妥:设环境变量
ANSIBLE_VAULT_PASSWORD_FILE=/tmp/vault-pass,所有ansible-playbook调用自动生效 - 密码文件绝不能进 Git,也不能用
echo $PASS > file直接写——bash history 会记录,改用printf "%s" "$PASS" > file
加密不是终点,而是起点——真正容易被忽略的是:Vault 密码本身的生命周期管理(比如定期轮换用 ansible-vault rekey)、不同环境用不同 Vault ID 隔离(--vault-id prod@prompt),以及开发机上密码文件的权限(chmod 600)。这些不做,光加密文件等于没锁门。











