使用加密变量和文件
当你运行一个使用加密变量或文件的任务或 playbook 时,你必须提供密码来解密变量或文件。你可以在命令行中执行此操作,或者在配置选项或环境变量中设置默认密码源。
传递单个密码
如果你的任务或 playbook 中的所有加密变量和文件都需要使用单个密码,你可以使用 --ask-vault-pass
或 --vault-password-file
命令行选项。
提示输入密码
ansible-playbook --ask-vault-pass site.yml
从 /path/to/my/vault-password-file
文件中检索密码
ansible-playbook --vault-password-file /path/to/my/vault-password-file site.yml
从 Vault 密码客户端脚本 my-vault-password-client.py
获取密码
ansible-playbook --vault-password-file my-vault-password-client.py
传递 Vault ID
你还可以使用 --vault-id
选项传递带有其 Vault 标签的单个密码。当单个清单中使用多个 Vault 时,这种方法更清晰。
提示输入 ‘dev’ Vault ID 的密码
ansible-playbook --vault-id dev@prompt site.yml
从 dev-password
文件中检索 ‘dev’ Vault ID 的密码
ansible-playbook --vault-id dev@dev-password site.yml
从 Vault 密码客户端脚本 my-vault-password-client.py
获取 ‘dev’ Vault ID 的密码
ansible-playbook --vault-id [email protected]
传递多个 Vault 密码
如果你的任务或 playbook 需要使用不同的 Vault ID 加密的多个加密变量或文件,你必须使用 --vault-id
选项,传递多个 --vault-id
选项来指定 Vault ID(‘dev’、‘prod’、‘cloud’、‘db’)和密码源(提示、文件、脚本)。例如,要使用从文件中读取的 ‘dev’ 密码,并提示输入 ‘prod’ 密码
ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml
默认情况下,Vault ID 标签(dev、prod 等)只是提示。Ansible 尝试使用每个密码解密 Vault 内容。与加密数据具有相同标签的密码将首先尝试,之后,将按照在命令行中提供的顺序尝试每个 Vault 密钥。
如果加密数据没有标签,或者标签与提供的任何标签都不匹配,则将按照指定的顺序尝试密码。在上面的示例中,将首先尝试 ‘dev’ 密码,然后尝试 ‘prod’ 密码,以处理 Ansible 不知道使用哪个 Vault ID 来加密某些内容的情况。
使用不带 Vault ID 的 --vault-id
也可以使用不指定 vault-id 的 --vault-id
选项。此行为等同于 --ask-vault-pass
或 --vault-password-file
,因此很少使用。
例如,要使用密码文件 dev-password
ansible-playbook --vault-id dev-password site.yml
提示输入密码
ansible-playbook --vault-id @prompt site.yml
从可执行脚本 my-vault-password-client.py
获取密码
ansible-playbook --vault-id my-vault-password-client.py
配置使用加密内容的默认值
设置默认的 Vault ID
如果你比任何其他 Vault ID 更频繁地使用一个 Vault ID,你可以设置配置选项 DEFAULT_VAULT_IDENTITY_LIST 来指定默认的 Vault ID 和密码源。每当你未指定 --vault-id
时,Ansible 将使用默认的 Vault ID 和源。你可以为此选项设置多个值。设置多个值等同于传递多个 --vault-id
命令行选项。
设置默认密码源
如果你不想在命令行上提供密码文件,或者你比任何其他 Vault 密码文件更频繁地使用一个 Vault 密码文件,则可以设置 DEFAULT_VAULT_PASSWORD_FILE 配置选项或 ANSIBLE_VAULT_PASSWORD_FILE
环境变量来指定要使用的默认文件。例如,如果你设置 ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt
,Ansible 将自动在该文件中搜索密码。例如,如果你从 Jenkins 等持续集成系统中使用 Ansible,这将非常有用。
你引用的文件可以是包含密码(纯文本)的文件,也可以是返回密码的脚本(设置了可执行权限)。
加密文件何时可见?
通常,你使用 Ansible Vault 加密的内容在执行后仍保持加密状态。但是,有一个例外。如果你将加密文件作为 src
参数传递给 copy、template、unarchive、script 或 assemble 模块,则该文件不会在目标主机上加密(假设你在运行 playbook 时提供了正确的 Vault 密码)。此行为是预期的,并且很有用。你可以加密配置文件或模板以避免共享配置的详细信息,但是当你将该配置复制到环境中的服务器时,你希望它被解密,以便本地用户和进程可以访问它。
使用 Ansible Vault 加密的文件格式
Ansible Vault 创建 UTF-8 编码的 txt 文件。文件格式包括一个以换行符结尾的标头。例如
$ANSIBLE_VAULT;1.1;AES256
或
$ANSIBLE_VAULT;1.2;AES256;vault-id-label
标头最多包含四个元素,以分号 (;
) 分隔。
格式 ID (
$ANSIBLE_VAULT
)。目前,$ANSIBLE_VAULT
是唯一有效的格式 ID。格式 ID 标识使用 Ansible Vault 加密的内容(使用 vault.is_encrypted_file())。Vault 格式版本 (
1.X
)。如果提供了带标签的 Vault ID,则当前所有受支持的 Ansible 版本都将默认为 ‘1.1’ 或 ‘1.2’。‘1.0’ 格式仅支持读取(并在写入时自动转换为 ‘1.1’ 格式)。当前,格式版本仅用作精确的字符串比较(当前不“比较”版本号)。用于加密数据的密码算法 (
AES256
)。目前,AES256
是唯一受支持的密码算法。Vault 格式 1.0 使用 ‘AES’,但当前代码始终使用 ‘AES256’。用于加密数据的 vault ID 标签(可选,
vault-id-label
)。例如,如果您使用--vault-id dev@prompt
加密文件,则 vault-id-label 为dev
。
注意:将来,标头可能会发生变化。格式 ID 和格式版本之后的字段取决于格式版本。未来的 vault 格式版本可能会添加更多的密码算法选项和/或额外的字段。
文件的其余内容是“vaulttext”。 vaulttext 是加密密文的文本装甲版本。每行宽 80 个字符,最后一行可能较短。
Ansible Vault 有效载荷格式 1.1 - 1.2
vaulttext 是密文和 SHA256 摘要的串联,结果为“十六进制化(hexlifyied)”。
“hexlify” 指的是 Python 标准库 binascii 模块的 hexlify()
方法。
hexlify() 的结果
盐(salt)的 hexlify() 字符串,后跟一个换行符 (
0x0a
)加密的 HMAC 的 hexlify() 字符串,后跟一个换行符。HMAC 是
RFC2104 风格的 HMAC
输入是
AES256 加密的密文
PBKDF2 密钥。此密钥、密码密钥和密码 IV 是从以下内容生成的:
盐(salt),以字节为单位
10000 次迭代
SHA256() 算法
前 32 个字节是密码密钥
后 32 个字节是 HMAC 密钥
剩余的 16 个字节是密码 IV
密文的 hexlify() 字符串。密文是
AES256 加密的数据。数据使用以下方法加密:
AES-CTR 流密码
密码密钥
IV
一个从整数 IV 播种的 128 位计数器块
明文
原始明文
填充到 AES256 块大小。(用于填充的数据基于 RFC5652)