本文目录导读:

在Ansible中使用Vault加密敏感变量(如密码、密钥等)非常常见,下面是详细的使用方法:
创建加密变量文件
使用ansible-vault命令创建加密文件
# 创建加密文件,会提示设置密码 ansible-vault create secrets.yml # 创建后输入内容,如: db_password: my_secret_password api_key: xxxxxx
加密已有文件
# 加密一个已存在的变量文件 ansible-vault encrypt vars.yml # 查看加密后的内容 cat vars.yml # $ANSIBLE_VAULT;1.1;AES256 # 1234567890abcdef...
解密和编辑加密文件
# 查看解密内容 ansible-vault view secrets.yml # 编辑加密文件 ansible-vault edit secrets.yml # 解密文件(永久解密) ansible-vault decrypt secrets.yml # 更改密码 ansible-vault rekey secrets.yml
在Playbook中使用加密变量
使用vars_files
# playbook.yml
---
- hosts: all
vars_files:
- secrets.yml # 加密的变量文件
tasks:
- name: 使用加密变量
debug:
msg: "数据库密码是 {{ db_password }}"
直接在playbook中使用加密变量
# playbook.yml
---
- hosts: all
vars:
db_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
1234567890abcdef...
tasks:
- name: 使用加密变量
debug:
msg: "密码是 {{ db_password }}"
运行Playbook时提供密码
交互式输入
# 运行时会提示输入vault密码 ansible-playbook playbook.yml --ask-vault-pass
密码文件
# 创建密码文件 echo "my_vault_password" > vault_pass.txt chmod 600 vault_pass.txt # 使用密码文件 ansible-playbook playbook.yml --vault-password-file vault_pass.txt
环境变量
# 设置环境变量 export ANSIBLE_VAULT_PASSWORD_FILE=/path/to/vault_pass.txt # 运行playbook ansible-playbook playbook.yml
最佳实践
目录结构示例
project/
├── group_vars/
│ ├── all/
│ │ ├── vars.yml # 普通变量
│ │ └── vault.yml # 加密变量
│ ├── webservers/
│ │ └── vault.yml # 特定组加密变量
│ └── dbservers/
│ └── vault.yml # 特定组加密变量
├── host_vars/
│ └── db1.example.com/
│ └── vault.yml # 特定主机加密变量
├── playbook.yml
└── vault_pass.txt # 密码文件(不提交到git)
使用Ansible Vault ID(多密码)
# 使用不同的密码ID ansible-vault encrypt --vault-id prod@prompt secrets_prod.yml ansible-vault encrypt --vault-id dev@prompt secrets_dev.yml # playbook中使用 ansible-playbook playbook.yml --vault-id prod@vault_pass_prod.txt --vault-id dev@vault_pass_dev.txt
在ansible.cfg中配置
[defaults] vault_password_file = /path/to/vault_pass.txt
安全注意事项
- 永远不要将vault密码明文提交到版本控制系统
- 在
.gitignore中加入密码文件 - 定期更换vault密码
- 使用强密码(建议至少16位)
- 考虑使用密码管理器或CI/CD的secret存储功能
实际示例
# group_vars/all/vault.yml (加密文件) vault_db_password: MyS3cretP@ssw0rd vault_api_key: abc123def456
# group_vars/all/vars.yml (普通文件) db_user: admin app_name: myapp
# playbook.yml
---
- hosts: all
tasks:
- name: 配置数据库连接
template:
src: config.j2
dest: /etc/myapp/config.yml
vars:
db_password: "{{ vault_db_password }}" # 使用加密变量
这样就能安全地管理敏感变量了!