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

相关推荐
程序员zgh17 小时前
Linux 系统调用
linux·运维·服务器·c语言·c++·系统安全
DX_水位流量监测17 小时前
无人机测流之雷达流速仪监测技术分析
大数据·网络·人工智能·数据分析·自动化·无人机
0思必得017 小时前
[Web自动化] Selenium基础介绍
前端·python·selenium·自动化·web自动化
cly117 小时前
Ansible自动化(十二):Jinja2过滤器
运维·自动化·ansible
cly117 小时前
Ansible自动化(十三):调试与优化
数据库·自动化·ansible
P-ShineBeam17 小时前
八卡A100服务器坏卡引发 CUDA initialization: cudaGetDeviceCount()异常
运维·服务器·人工智能·语言模型
萤丰信息17 小时前
开启园区“生命体”时代——智慧园区系统,定义未来的办公与生活
java·大数据·运维·数据库·人工智能·生活·智慧园区
cly117 小时前
Ansible自动化(十四):Roles(角色)
服务器·自动化·ansible
Nobody__118 小时前
解决多台服务器 UID/GID 做对齐后,文件系统元数据未更新的情况
运维·服务器