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

作者:cly1日期:2026/1/12

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:交互式输入密码(适合手动操作)

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

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

1ansible-playbook deploy-app.yml --vault-password-file ~/.vault-pass.txt
2
  • ~/.vault-pass.txt 内容仅为一行密码(无换行建议):
1MySuperSecret123!  

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

场景举例:

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

解决方案:

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

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

✅ 方式二:多密码文件(Ansible ≥ 2.4 支持)
1ansible-playbook playbook.yml \
2  --vault-id prod@prod-pass.txt \
3  --vault-id inv@inv-pass.txt
4

或简写(按顺序匹配):

1ansible-playbook playbook.yml \
2  --vault-password-file prod-pass.txt \
3  --vault-password-file inv-pass.txt
4

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

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

五、最佳实践建议

  1. 不要将 ansible.cfg 加密
  2. 敏感信息尽量放在独立变量文件中加密,而非直接写在 Playbook 里
  3. 使用 .gitignore 排除密码文件(如 vault-pass.txt
  4. 在 CI/CD 中通过环境变量传递 Vault 密码(更安全):
1echo "$VAULT_PASS" > /tmp/vault-pass && chmod 600 /tmp/vault-pass  
2ansible-playbook site.yml --vault-password-file /tmp/vault-pass  
3rm /tmp/vault-pass  
  1. 定期使用 rekey 更换密码

六、练习题

基础题

  1. 创建一个名为 db_secrets.yml 的加密文件,内容为:
1db_user: admin  
2db_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

Ansible自动化(十五):加解密详解》 是转载文章,点击查看原文


相关推荐


Go 项目结构总是写乱?这个 50 行代码的 Demo 教你标准姿势
Java小成2026/1/4

1. 场景复现:那个让我头疼的时刻 去年,我接手了一个"祖传" Go 项目。打开代码仓库的那一刻,我整个人都不好了——所有代码都塞在一个 main.go 里,足足 3000 多行。想加个功能?先花半小时找代码在哪。想写个单元测试?抱歉,函数全是私有的,而且互相耦合,根本没法单独测。 我当时就在想:如果当初写这个项目的人,能从第一天就用一个规范的结构,后面的人得少掉多少头发? 后来我开始研究 Go 官方和社区推荐的项目布局,发现其实规则很简单,但很多人就是不知道。于是我写了这个 50 行代码的小


Vue 实例挂载的过程是怎样的?
全栈陈序员2025/12/25

一、整体流程概览 当我们执行 new Vue({ ... }) 时,Vue 会经历 初始化 → 编译模板 → 挂载 DOM 三个阶段。整个过程由 _init 方法驱动,最终通过 $mount 完成视图渲染。 核心路径: new Vue() → _init() → initState() → $mount() → mountComponent() → _render() → _update() → 真实 DOM 二、详细步骤解析 1. 构造函数与 _init 初始化 源码位


从已损坏的备份中拯救数据
神奇的程序员2025/12/17

前言 12月15号早上,一觉醒来,拿起手机看到我的邮箱收到了内网服务无法访问的告警邮件,本以为只是简单的服务卡死,将服务器重启后就去上班了。 后来,陆续有好友联系我说网站挂了。 定位问题 晚上下班回家后,尝试将电脑断电重启,发现pve只能存活2分钟左右,然后整个系统卡死,无法进行任何操作。首先,我想到的是:会不会某个vm虚拟机或者ct容器影响到宿主机了。 因为系统只能存活几分钟,在执行禁用操作的时候,强制重启了好几次服务器。当所有的服务都停止启动后,卡死的问题依旧存在。 翻日志 没辙了,这已经


苹果ios手机ipad安装配置ish终端shell工具
无痕melody2025/12/9

简介 官方介绍 iSH 是一个运行在 iOS 上的 Linux Shell,用来在ARM架构的 iOS 设备上模拟 X86 架构。也就是说不光是 IPad 可以安装,IPhone 上也可以安装运行 iSH,直接在 IOS 设备上运行 Linux 环境,而且免费! 如果你正在使用的电脑是 Mac,那么可以把 iSH 比作你电脑上面的终端。 iSH 官方地址 安装 AppStore里搜索ish或手机打开链接 配置 基本操作 操作按钮 2. 这个按钮相当于电脑上的 Tab 键,用于命令


为什么C语言拒绝函数重载?非要重载怎么做?
码事漫谈2025/11/29

在我们学习C++、Java或C#时,函数重载(Function Overloading)是一个再自然不过的概念:允许两个或多个函数使用相同的名字,只要它们的参数列表(参数的类型、个数或顺序)不同即可。编译器会根据调用时传入的实参,自动选择最匹配的那个函数。 然而,当我们回到C语言的世界,这条规则却失效了。如果你定义了两个同名的函数,即使参数列表不同,编译器也会毫不留情地报出一个“重定义”错误。 那么,为什么C语言的设计者,要“剥夺”这个看似非常实用的特性呢? 答案并非“不能”,而是“不为”。这背


筑牢金融底座:企业级区块链全球化数据库架构设计白皮书
China_Yanhy2026/1/20

📖 前言:Web3 业务的双重账本 在 Web3 业务中,区块链(AMB)是不可篡改的“链上真理”,而关系型数据库(RDS/Aurora)则是承载用户资产、撮合逻辑和KYC信息的“链下业务核心”。对于追求全球化的高频交易项目,数据库的架构设计必须解决两个核心矛盾:跨国访问的物理延迟 与 资金数据的一致性。 第一部分:旗舰方案 —— Amazon Aurora Global Database (深度解析) 这是针对跨国交易所(如币安、Coinbase 模式)的首选架构。 1. 核心架构

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客