Ansible Vault: 加密 Ansible 仓库里的密钥
解决什么问题 Ansible 仓库里迟早会出现密钥:数据库密码、API token、TLS 私钥。playbook 和变量文件要进 git,密钥如果跟着明文进去,所有能克隆仓库的人和程序就都拿到了它,而且会永远留在历史里。 Ansible Vault 是 Ansible 自带的加密功能(命令是 ansible-vault,不用另外安装)。它解决的是一件事:让密钥以密文的形式和 playbook 放在同一个仓库里,运行 playbook 时自动解密。 它和 HashiCorp Vault 没有关系,只是名字像。HashiCorp Vault(以及它的 fork OpenBao)是一个常驻的密钥服务;Ansible Vault 只是一个文件加密工具,没有服务端。 原理 加密后的文件是这样的: $ANSIBLE_VAULT;1.1;AES256 62313365396662343061393464336163383764373764613633653634306231386433626436623361 6134333665353966363534333632666535333761666131620a663537646436643839616531643561 ... 第一行是头部:格式版本 1.1,算法 AES256。用了 vault ID(见下文)时版本是 1.2,头部末尾多一个标签。 加密过程:从 vault 密码用 PBKDF2-SHA256 加随机盐派生出密钥,用 AES-256(CTR 模式)加密内容,再用 HMAC-SHA256 防篡改,最后转成十六进制文本。 整个仓库通常只用一个 vault 密码。谁有这个密码,谁就能解开所有加密文件。 两种加密粒度 加密整个文件 # Create a new encrypted file and open it in $EDITOR ansible-vault create group_vars/prod/vault.yml # Encrypt an existing plaintext file in place ansible-vault encrypt group_vars/prod/vault.yml # Edit / view without leaving a plaintext copy on disk ansible-vault edit group_vars/prod/vault.yml ansible-vault view group_vars/prod/vault.yml # Change the password ansible-vault rekey group_vars/prod/vault.yml 只加密单个变量 ansible-vault encrypt_string 's3cr3t' --name 'db_password' 输出可以直接贴进普通的变量文件,文件其他部分仍是明文: ...