使用 Ansible Vault 加密 GCP 凭证文件

使用 Ansible Vault 加密 GCP 凭证文件

我在 Ansible 2.9.13 中使用 gcp_compute inventory插件,一切运行正常,使用auth_kind: serviceaccountservice_account_file: <somefile>.json

我的问题是我不想以纯文本形式存储服务帐户文件。如果我使用 ansible-vault 对其进行加密,该插件似乎无法读取该文件,并且会失败,出现库存模块似乎会执行的标准“内容损坏,以奇怪的方式失败”:

$ ansible-inventory -i inventory/ --graph --ask-vault-pass
Vault password:
[WARNING]:  * Failed to parse <rootpath-redacted>/inventory/hosts_gcp_compute.yaml with auto plugin: Expecting value: line 1 column 1 (char 0)
[WARNING]:  * Failed to parse <rootpath-redacted>/inventory/hosts_gcp_compute.yaml with yaml plugin: Plugin configuration YAML file, not YAML inventory
[WARNING]:  * Failed to parse <rootpath-redacted>/inventory/hosts_gcp_compute.yaml with ini plugin: Invalid host pattern 'plugin:' supplied, ending in
':' is not allowed, this character is reserved to provide a port.
[WARNING]: Unable to parse <rootpath-redacted>/inventory/hosts_gcp_compute.yaml as an inventory source
@all:
...<list of other inventory items excluding gcp_compute ones>

如果我除了解密引用的文件之外不进行任何其他更改,service_account_file那么命令运行正常,并且我会得到完整的库存清单。

有没有办法让 gcp_compute 库存插件通过 ansible vault 读取服务帐户文件?我找不到任何文档显示文件加密存储,或者找不到将其加载到变量中并将其传递给脚本或任何其他东西的方法 - 我无法确定是不是没有办法,或者我是否试图以“错误”的方式做事。

我们的计划是让 ansible 设置在 docker 容器中运行,该容器可能位于任何云提供商的平台(gcp、aws 等)或开发人员的机器上,因此我不能假设我已经拥有 GCE 元数据服务器提供服务帐户,我需要以某种方式提供一个。我也宁愿避免先运行单独的脚本来执行解密,但如果这是唯一的方法,那么这可能是我要走的路。

答案1

在过去的一天半里,我一直在为同样的问题而苦苦挣扎。为了简单起见,我为了让它工作,我尝试了很多不同的方法,直到最后我偶然发现了一个非常简单的技巧:

gcp_cred_file_enc: "credentials.json.enc"
gcp_cred_file_contents: "{{ lookup('ansible.builtin.file', '{{ gcp_cred_file_enc }}') | from_json | to_json }}"

而且它真的有效了!!该credentials.json.enc文件就是下载的 GCP 凭证文件,其名称如下,并使用以下方式加密:ansible-vault encrypt --vault-id=@prompt credentials.json.enc

现在gcp_cred_file_contents可以与以下产品一起使用service_account_contents

service_account_contents: "{{ gcp_cred_file_contents }}"

..库存创建成功!

答案2

您可以使用(将credentials-file.json内容加密为字符串ansible-vault encrypt_string文档),然后使用它的!vault | $ANSIBLE_VAULT;...输出来gcp_compute定义服务帐户内容参数(而不是使用service_account_file),如本指南的步骤#10。

相关内容