深色模式
Ansible Vault 加密:管理敏感变量
摘要:把明文密码提交进 Git 是最常见的安全事故。本文演示 Vault 加密整个变量文件、只加密单个字符串、运行时解密的三种方式,以及密钥该怎么保存。
适用环境
- 已安装 ansible-core / ansible(
ansible-vault随其提供) - 已有 inventory 与 playbook 项目目录,项目纳入 Git 管理
操作步骤
1. 创建加密变量文件
bash
cd ~/ansible
ansible-vault create group_vars/web/vault.yml # 输入密码后写入 vault_db_password
ansible-vault view group_vars/web/vault.yml # 只读查看
ansible-vault edit group_vars/web/vault.yml # 编辑
ansible-vault rekey group_vars/web/vault.yml # 改密码1
2
3
4
5
2
3
4
5
2. 只加密某一个字符串
bash
ansible-vault encrypt_string 'SuperSecret' --name 'db_password'1
输出 db_password: !vault | 加一串 $ANSIBLE_VAULT;1.1;AES256 密文,可直接粘进普通 vars.yml,其余变量保持明文可读。
3. 明文变量引用密文变量(推荐)
yaml
# group_vars/web/vars.yml(明文,可提交)
db_user: appuser
db_password: "{{ vault_db_password }}" # 指向加密文件里的值1
2
3
2
3
playbook 里始终用 db_password,秘密只在 vault.yml 中。
4. 运行时解密
bash
ansible-playbook -i inventory.ini site.yml --ask-vault-pass
ansible-playbook -i inventory.ini site.yml --vault-password-file ~/.vault_pass
export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass1
2
3
2
3
5. 多环境用 Vault ID 隔离
bash
ansible-vault create --vault-id prod@prompt group_vars/prod/vault.yml
ansible-playbook -i inventory.ini site.yml --vault-id prod@prompt1
2
2
危险
不要把 Vault 密码和加密文件放在同一仓库。两者同时泄露,加密等于没做。密码应放 CI Secret 或本机 600 权限文件。
验证
bash
git show HEAD:group_vars/web/vault.yml | head -1 # 应为 $ANSIBLE_VAULT 开头
ansible-playbook -i inventory.ini site.yml --check --ask-vault-pass1
2
2
- [ ] 仓库中的 vault 文件不是明文
- [ ] 不提供密码时报解密失败而不是跳过
- [ ] 密码文件权限 600,且未被 Git 跟踪
常见坑
忘了 --ask-vault-pass
会在第一个用到密文变量的任务上报 Decryption failed,容易误判为语法问题。
用 echo 写密码会进 history
echo 'pass' > file 会被 shell history 记录。改用编辑器创建或用 read -s 读入。
CI 中密钥失效导致整段失败
Vault 解密发生在任务执行前。CI 中建议先用 ansible-vault view 单独验证密钥可用性。