如何区分 ansible vault 的变化?

How to diff ansible vault changes?

我想查看 ansible 库文件中的实际 git 提交更改。

有没有简单的方法可以做到这一点?

所以经过一番挖掘,我构建了一个非平凡的解决方案。

首先将您的保管库密码存储到 (.gitignored) .vault_password 文件中。

在下面的示例中,文件 inventory/group_vars/xyz/vault.ymlHEADHEAD~2 版本是 vimdiff-ed:

vimdiff \
  <(ansible-vault view --vault-password-file=.vault_password \
    <(git show HEAD:inventory/group_vars/xyz/vault.yml)) \
  <(ansible-vault view --vault-password-file=.vault_password \
    <(git show HEAD~2:inventory/group_vars/xyz/vault.yml))

您可以使用 https://github.com/dellis23/ansible-toolkit

中的 atk-git-diff 实用程序

您可以非常巧妙地执行此操作,以便 git loggit diff 等普通 git 工具可以使用自定义 git diff 查看拱形文件内部driver 和 .gitattributes.

  • 确保您的保管库密码在 .vault_password 中并且该文件 提交 - 您还应该将其添加到 .gitignore
  • 添加一个 .gitattributes 文件,该文件与存储库中使用 ansible-vault 加密的任何文件相匹配,并为它们赋予属性 diff=ansible-vault。例如,我有:

    env_vars/production.yml diff=ansible-vault merge=binary
    env_vars/staging.yml diff=ansible-vault merge=binary
    

    您还可以使用通配符模式 - 每行的第一个元素,即模式,遵循与 .gitignore 文件相同的规则。 merge=binary 选项告诉 git 不要尝试对这些文件进行 three-way 合并。

  • 然后你必须将属性 diff=ansible-vault 的文件的 diff driver 设置为 ansible-vault view:

    git config --global diff.ansible-vault.textconv "ansible-vault view"
    

应该就是这样 - 当 git 计算与您的模式匹配的文件的差异时,它会首先解密它们。

为了完整起见,值得一提的是如何在全局范围内为 ansible-vaulted 文件配置差异。例如,我在这里使用了很多 ansible 存储库,几乎所有存储库都有一些受保护的秘密。所以我想要的是我的配置是全局的并且可以从一台机器移植到另一台机器。

在您的 ~/.gitconfig 中添加以下部分:

[core]
    # The following line defines a global .gitattributes file
    attributesfile = ~/.gitattributes

[diff "ansible-vault"]
    textconv = "ansible-vault view"

为此,您需要一些用于 ansible-vaulted 文件的命名模式,无论如何您都应该这样做。就我而言,我喜欢用扩展名 .vault.yml 来命名它们。所以我的 ~/.gitattributes 文件看起来像这样:

*.vault.yml diff=ansible-vault merge=binary

最后,为了避免一直输入密码,请确保在每个存储库的方便位置都有一个文件(通常类似于 .vault,放在根目录下)。此文件必须包含明文密码(当然 .gitignored 是正确的)或生成此类密码的可执行脚本。

准备就绪后,继续告诉 ansible 使用 .vault 文件,方法是将以下行添加到全局或本地 ansible.cfg:

vault_password_file = .vault

完成。现在 运行 git diff 将产生您期望从非 vaulted 文件中获得的可读差异 :)

给 Windows 用户的提示:
当 windows 上的 运行 出现问题时,ansible-vault 不可用。但是您可以将它安装在您的 WSL 中。
在 WSL 中安装 ansible-vault 后,以下对我有用

.gitattributes

**/vault.yml diff=ansible-vault

.gitconfig

[core]
  attributesfile = ~/.gitattributes
[diff "ansible-vault"]
  textconv = sh -c 'cat [=11=] | wsl ansible-vault decrypt --output - --vault-password-file=~/.vault_pass'

保管库密码必须在 ~/.wsl 中。vault_pass