如何在Ansible中加密二进制文件?


9

我们正在使用Ansible Vault在Ansible Playbook git存储中存储密码,证书的私钥等。我们所有现有的私有数据都是文本形式的,因此我们可以将其存储在变量中。然后将它们用于模板或与content复制模块的参数一起使用。

现在,我们有一个Java KeyStore文件,可悲的是它具有二进制格式。因此,它不能存储在变量中-至少我不知道该怎么做。将文件保存在git中但在运行时可用,最简单的方法是对其进行正确加密ansible-playbook

我已经尝试过但没有成功的东西:

  • 在base64中对二进制文件进行编码,将编码后的数据存储在变量中,并使用带有的模板模块{{base64_data | b64decode}}。导致大量的EF BF BD十六进制转储结果文件。这三个字节对UTF-8中的Unicode替换字符进行编码,因此将二进制数据解释为文本存在问题。
  • 在base64中对二进制文件进行编码,将编码后的数据存储在变量中,然后将复制模块与一起使用content="{{base64_data | b64decode}}"。Ansible抱怨“一个变量在模块args中插入了一个新参数”。当使用单引号而不是双引号时,Ansible抱怨“错误解析参数字符串”,并将所有二进制数据的副本转储到终端...

groups.google.com/d/topic/ansible-project/IinZK14FyX4中的讨论中,我得出结论,ansible不支持此功能,您必须自己做一些base64的工作,但是可能会有一些第三方的工作这样可以使它更容易。
Antonis Christofides 2015年

谢谢,这看起来不错。会尝试并举报…
丹尼尔(Daniel S)2015年

不,可惜它不起作用(请参阅已编辑的问题)。关于ansible的
Daniel Sith 2015年

您是否考虑过将其与GPG电话包装在一起?您可以将GPG私钥的ASCII表示形式存储在Ansible Vault中,并使用它来解密您的二进制文件,然后可以将其存储在git中而不会出现问题。
Christopher Karel

感谢您的建议,但是这种解决方法比我希望的要复杂得多。我已经考虑过将base64编码的KeyStore复制到目标计算机,并拥有一个在更新时对文件进行解码的处理程序,但是我更喜欢一个不会​​产生临时文件的解决方案。
丹尼尔(Daniel S)2015年

Answers:


4

您可以使用带有base64变量的shell命令来执行此操作。

- vars:
  - myvar: "<my_base64_var>"
- name: Create binary file
  shell: "echo '{{myvar}}' | base64 -d > /var/tmp/binary.dat"

埃里克


这绝对是一个选择,尤其是因为它不使用临时文件。可悲的是,它不允许Ansible检测是否进行了更改,但是它比我见过的所有其他解决方案都要好。
丹尼尔(Daniel S)

1
我认为保管库现在支持它:“保管库功能还可以加密任意文件,甚至二进制文件。如果将保管库加密的文件作为src参数提供给复制模块,则该文件将放置在目标主机上的目标位置解密(假定在运行播放时提供了有效的库密码)。” -docs.ansible.com/ansible/playbooks_vault.html
Mike Gleason jr Couturier

2
请注意,他们似乎已将@MikeGleasonjrCouturier引用的文本移到了ansible文档中的另一页上。现在请参阅docs.ansible.com/ansible/latest/vault.html
利亚姆

2

我们为ansible设置执行​​此操作的方式是:

-我们使用https://www.agwa.name/projects/git-crypt/加密单个敏感材料(我们存储库的一小部分) -我们都始终使用git符号标签进行提交-我们定期检查是否有未签名的文件

git-crypt的优点在于,由于它依赖于git过滤器,因此加密是透明的。另外,您可以在不损害加密内容的情况下将访问权授予开发人员(如果无法获得解密密钥,它将忽略加密文件)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.