Ansible自动化(十五):加解密详解

Ansible Vault 是 Ansible 提供的一套用于保护敏感数据的机制,可以对各类配置文件进行加密,防止敏感信息(如密码、私钥、API 密钥等)以明文形式暴露在代码仓库或配置文件中。


一、为什么需要 Ansible 加密?

场景说明:

  • Playbook 中包含数据库密码、API Token、SSH 私钥等敏感信息
  • Inventory(主机清单)中直接写入了连接密码(如 ansible_password
  • 变量文件(vars/main.yml)中包含机密配置

Ansible Vault 的优势

可以对 任何文件类型 进行加密,包括但不限于:

  • Playbook(.yml)
  • Inventory 文件(hosts.ini / inventory.yml)
  • Jinja2 模板(.j2)
  • 变量文件(group_vars/、host_vars/)
  • 普通文本文件(如证书、密钥)
    例外
    ansible.cfg 不能被加密

原因:Ansible 启动时需读取该配置文件,若被加密则无法加载,导致命令失败。
解决方案 :保留一个空白或未加密的 ansible.cfg,将原加密文件重命名(如 ansible.cfg.vault),使用时再解密。


二、Ansible Vault 常用命令详解

命令 功能 说明与示例
ansible-vault create filename 创建并加密新文件 交互式输入密码后,直接进入编辑器(如 vim)编写内容bash<br>ansible-vault create secrets.yml<br>
ansible-vault encrypt filename 加密已存在的文件 对已有明文文件加密bash<br>ansible-vault encrypt db_password.yml<br>
ansible-vault edit filename 编辑加密文件 自动解密 → 编辑 → 保存时重新加密bash<br>ansible-vault edit inventory.ini<br>
ansible-vault view filename 查看加密文件内容(不解密到磁盘) 临时解密并在终端显示内容bash<br>ansible-vault view vault-vars.yml<br>
ansible-vault decrypt filename 永久解密文件(移除加密) 将文件转为明文,慎用!bash<br>ansible-vault decrypt secrets.yml<br>
ansible-vault rekey filename 修改加密文件的密码 需先输入旧密码 ,再设置新密码 bash<br>ansible-vault rekey app-secrets.yml<br>

🔐 所有命令执行时都会提示输入 Vault 密码(除非使用 --vault-password-file


三、使用加密文件运行 Playbook 的方式

方式 1:交互式输入密码(适合手动操作)

bash 复制代码
ansible-playbook deploy-app.yml --ask-vault-pass
  • 执行时会提示:Vault password:
  • 适用于单次调试或小规模运维

方式 2:通过密码文件免交互(适合自动化脚本/CI/CD)

bash 复制代码
ansible-playbook deploy-app.yml --vault-password-file ~/.vault-pass.txt
  • ~/.vault-pass.txt 内容仅为一行密码(无换行建议):

    复制代码
    MySuperSecret123!
  • 权限建议chmod 600 ~/.vault-pass.txt 防止他人读取


四、多密码场景处理(不同文件用不同密码)

场景举例:

  • inventory.ini 用密码 A 加密
  • vars/prod.yml 用密码 B 加密
  • playbook.yml 本身未加密,但引用了上述两个文件

解决方案:

✅ 方式一:统一密码(推荐)

所有敏感文件使用同一个 Vault 密码,简化管理。

✅ 方式二:多密码文件(Ansible ≥ 2.4 支持)
bash 复制代码
ansible-playbook playbook.yml \
  --vault-id prod@prod-pass.txt \
  --vault-id inv@inv-pass.txt

或简写(按顺序匹配):

bash 复制代码
ansible-playbook playbook.yml \
  --vault-password-file prod-pass.txt \
  --vault-password-file inv-pass.txt

💡 注意:Ansible 会尝试用每个密码依次解密所有加密文件,直到成功。

✅ 方式三:预解密(不推荐,有安全风险)
bash 复制代码
ansible-vault decrypt inventory.ini --vault-password-file inv-pass.txt
ansible-vault decrypt vars/prod.yml --vault-password-file prod-pass.txt
ansible-playbook playbook.yml  # 此时文件已是明文
# 使用完后记得重新加密!

五、最佳实践建议

  1. 不要将 ansible.cfg 加密

  2. 敏感信息尽量放在独立变量文件中加密,而非直接写在 Playbook 里

  3. 使用 .gitignore 排除密码文件 (如 vault-pass.txt

  4. 在 CI/CD 中通过环境变量传递 Vault 密码 (更安全):

    bash 复制代码
    echo "$VAULT_PASS" > /tmp/vault-pass && chmod 600 /tmp/vault-pass
    ansible-playbook site.yml --vault-password-file /tmp/vault-pass
    rm /tmp/vault-pass
  5. 定期使用 rekey 更换密码


六、练习题

基础题

  1. 创建一个名为 db_secrets.yml 的加密文件,内容为:

    yaml 复制代码
    db_user: admin
    db_pass: S3cr3tP@ss!

    并使用密码 myvault123 加密。

  2. 编写一个 Playbook test-vault.yml,引用上述 db_secrets.yml,并在任务中输出 db_pass 的值(使用 debug 模块)。如何运行该 Playbook?

  3. 如何查看 db_secrets.yml 的内容而不将其解密到磁盘?

进阶题

  1. 假设你有两个加密文件:

    • inventory.ini(密码:pass1
    • group_vars/prod.yml(密码:pass2
      编写一条命令,使用两个不同的密码文件运行 deploy.yml
  2. 如果误将 ansible.cfg 加密了,导致 ansible --version 报错,应如何恢复?

  3. 在 Shell 脚本中自动化运行加密的 Playbook,要求不交互输入密码,且密码来自环境变量 ANSIBLE_VAULT_PASS

相关推荐
玉梅小洋2 分钟前
GitHub SSH配置教程
运维·ssh·github
等什么君!8 分钟前
Docker 数据卷:MySQL 数据同步实战
运维·docker·容器
fqbqrr8 分钟前
2601Mfc,自动化excel
自动化·excel·mfc
礼拜天没时间.16 分钟前
《Docker实战入门与部署指南:从核心概念到网络与数据管理》:环境准备与Docker安装
运维·网络·docker·容器·centos
每天瞎忙的农民工19 分钟前
Ubuntu 24 安装npm22
linux·运维·ubuntu·npm
j_xxx404_33 分钟前
Linux:进程控制(创建/终止/等待/获取退出信息/多进程)
linux·运维·服务器
BUG_MeDe1 小时前
LINUX MTU/MSS(1500 1460等)的一些理解
linux·运维·服务器
曹牧1 小时前
Nginx:正向代理与反向代理
运维·nginx
Ha_To1 小时前
2026.1.30 搭建docker仓库
运维·docker·容器
lpfasd1231 小时前
Docker Desktop 在国内使用的囧境:镜像拉取失败、加速器失效与破局之道
运维·docker·容器