【Ansible】(十一) Vault

在自动化运维中,明文存储密码、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 密码文件?)

Q3:多个加密文件如何使用不同密码?

Q4:如何验证加密文件是否正确?

结语


一、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_varshost_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 密钥管理、环境变量和严格的文件权限控制,构建多层安全防护体系,避免敏感数据泄露风险。