在自动化运维中,明文存储密码、API 密钥等敏感数据是重大安全隐患。Ansible Vault 作为官方内置的加密工具,通过 AES-256 对称加密保护变量文件,实现敏感数据与普通配置的安全隔离,是企业级 Ansible 项目的必备安全实践。
目录
[一、Ansible Vault 核心原理与价值](#一、Ansible Vault 核心原理与价值)
[1. 工作原理](#1. 工作原理)
[2. 核心价值](#2. 核心价值)
[二、Vault 基础操作实战](#二、Vault 基础操作实战)
[1. 创建加密文件](#1. 创建加密文件)
[2. 查看加密文件内容](#2. 查看加密文件内容)
[3. 编辑加密文件](#3. 编辑加密文件)
[4. 加密现有文件](#4. 加密现有文件)
[5. 解密文件](#5. 解密文件)
[6. 更改加密密码](#6. 更改加密密码)
[三、Playbook 调用 Vault 加密文件](#三、Playbook 调用 Vault 加密文件)
[1. 交互式输入密码](#1. 交互式输入密码)
[2. 指定密码文件](#2. 指定密码文件)
[3. 环境变量传递](#3. 环境变量传递)
[4. 多 Vault 密码支持](#4. 多 Vault 密码支持)
[1. 目录结构设计](#1. 目录结构设计)
[2. 变量文件引入方式](#2. 变量文件引入方式)
[方式一:Playbook 中通过 vars_files 引入](#方式一:Playbook 中通过 vars_files 引入)
[方式二:通过 host_vars/group_vars 自动加载](#方式二:通过 host_vars/group_vars 自动加载)
[Q1:运行 Playbook 时提示 "Attempting to decrypt but no vault secrets found"?](#Q1:运行 Playbook 时提示 “Attempting to decrypt but no vault secrets found”?)
[Q2:如何安全存储 Vault 密码文件?](#Q2:如何安全存储 Vault 密码文件?)
一、Ansible Vault 核心原理与价值
1. 工作原理
Ansible Vault 基于 Python 密码学库实现,使用 AES-256 对称加密算法保护文件内容。加密后的文件仍为 YAML 格式,仅数据部分被加密,Ansible 运行时会自动解密读取,无需修改 Playbook 逻辑。
2. 核心价值
数据安全:避免密码、密钥等敏感信息以明文形式存在于代码仓库或服务器中
版本兼容:加密文件可直接提交 Git 等版本控制系统,无需额外处理
透明调用:Ansible 运行时自动解密,不影响 Playbook 执行流程
权限隔离:通过密码文件、环境变量等方式,控制敏感数据的访问权限
二、Vault 基础操作实战
1. 创建加密文件
使用 ansible-vault create 命令创建新的加密文件,默认使用 vi 编辑器:
# 交互式创建加密文件
ansible-vault create secret.yml
# 输入并确认Vault密码(如redhat),进入编辑界面
# 或指定密码文件创建(避免交互式输入)
ansible-vault create --vault-password-file=vault-pass secret.yml
2. 查看加密文件内容
无需解密即可查看加密文件内容,使用 view 命令:
ansible-vault view secret.yml
# 输入Vault密码后,显示文件内容
3. 编辑加密文件
使用 edit 命令编辑加密文件,Ansible 会创建临时文件供编辑,保存后自动重新加密:
ansible-vault edit secret.yml
# 输入密码后进入编辑界面,保存退出时自动重新加密
注意 :edit 命令会重写文件,不建议在版本控制中频繁使用,查看内容优先使用 view。
4. 加密现有文件
对已存在的明文文件进行加密,支持批量操作:
# 加密单个文件
ansible-vault encrypt config.yml
# 批量加密多个文件
ansible-vault encrypt db-pass.yml api-key.yml
5. 解密文件
将加密文件永久解密为明文:
# 解密文件并覆盖原文件
ansible-vault decrypt secret.yml
# 解密并保存为新文件(保留原加密文件)
ansible-vault decrypt secret.yml --output=secret-decrypted.yml
6. 更改加密密码
使用 rekey 命令更新文件的 Vault 密码:
# 交互式更改密码
ansible-vault rekey secret.yml
# 使用新旧密码文件批量更新
ansible-vault rekey --new-vault-password-file=new-pass.txt secret.yml
三、Playbook 调用 Vault 加密文件
运行包含加密文件的 Playbook 时,需向 Ansible 提供解密密码,支持以下三种方式:
1. 交互式输入密码
通过 --vault-id @prompt 参数,运行时交互式输入密码:
ansible-navigator run -m stdout site.yml \
--playbook-artifact-enable false \
--vault-id @prompt
注意 :需禁用 playbook 工件(--playbook-artifact-enable false),否则命令会挂起。
2. 指定密码文件
使用 --vault-password-file 参数指定存储密码的文件:
ansible-navigator run -m stdout site.yml \
--vault-password-file=vault-pass.txt
密码文件中仅需存储一行明文密码,需设置严格权限(如 chmod 600 vault-pass.txt)。
3. 环境变量传递
通过 ANSIBLE_VAULT_PASSWORD_FILE 环境变量指定密码文件路径:
export ANSIBLE_VAULT_PASSWORD_FILE=./vault-pass.txt
ansible-navigator run -m stdout site.yml
4. 多 Vault 密码支持
当项目中存在多个加密文件时,可通过 --vault-id 指定多个密码:
ansible-navigator run -m stdout site.yml \
--playbook-artifact-enable false \
--vault-id one@prompt \
--vault-id two@prompt
Ansible 会按 ID 匹配对应密码,优先使用匹配的密钥解密文件。
四、企业级变量文件管理规范
1. 目录结构设计
将敏感变量与普通变量分离存储,推荐采用以下目录结构:
ansible_project/
├── ansible.cfg
├── inventory/
├── group_vars/
│ └── web_servers/
│ ├── vars.yml # 普通变量(明文)
│ └── vault.yml # 敏感变量(Vault加密)
├── host_vars/
│ └── demo.example.com/
│ ├── vars.yml # 普通变量(明文)
│ └── vault.yml # 敏感变量(Vault加密)
└── playbook.yml
2. 变量文件引入方式
方式一:Playbook 中通过 vars_files 引入
- name: 部署Web服务
hosts: web_servers
vars_files:
- group_vars/web_servers/vars.yml # 明文变量
- group_vars/web_servers/vault.yml # Vault加密变量
tasks:
- name: 配置数据库连接
ansible.builtin.lineinfile:
path: /etc/app/config.ini
regexp: '^db_password='
line: "db_password={{ db_password }}"
方式二:通过 host_vars/group_vars 自动加载
Ansible 会自动加载 group_vars 和 host_vars 目录下的所有文件,包括加密文件,无需额外配置。
五、常见问题与解决方案
Q1:运行 Playbook 时提示 "Attempting to decrypt but no vault secrets found"?
原因 :未提供 Vault 解密密码,或密码文件路径错误。解决:
使用 --vault-password-file 指定正确的密码文件
或通过 --vault-id @prompt 交互式输入密码
检查密码文件权限,确保 Ansible 进程可读
Q2:如何安全存储 Vault 密码文件?
最佳实践:
设置文件权限为 600,仅当前用户可读
密码文件不提交到版本控制系统(在 .gitignore 中添加)
使用环境变量或 CI/CD 系统的密钥管理服务(如 Jenkins Credentials)传递密码
Q3:多个加密文件如何使用不同密码?
解决:
为每个加密文件分配不同的 vault-id
运行 Playbook 时通过多个 --vault-id 参数传递对应密码
避免强制 Ansible 尝试所有密码,提升解密效率
Q4:如何验证加密文件是否正确?
验证方法:
使用 ansible-vault view 命令查看内容,确认解密正常
在 Playbook 中添加调试任务,打印变量值验证
使用 ansible-inventory --host demo.example.com 命令查看主机加载的所有变量
结语
Ansible Vault 是保护敏感数据的关键工具,通过合理的目录结构、加密策略和权限管理,可在自动化运维中实现安全与效率的平衡。在企业级项目中,建议结合 CI/CD 密钥管理、环境变量和严格的文件权限控制,构建多层安全防护体系,避免敏感数据泄露风险。