如何改变金库变化?

时间:2015-04-29 07:35:41

标签: git diff ansible ansible-vault

我希望在ansible保险库文件中看到实际的git提交更改。

有一种简单的方法可以达到这个目的吗?

5 个答案:

答案 0 :(得分:49)

你可以非常巧妙地做到这一点,这样普通的git工具,如git loggit diff,可以使用自定义git diff驱动程序和.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不要尝试对这些文件进行三向合并。

  • 然后您必须为属性为diff=ansible-vault的文件设置差异驱动程序为ansible-vault view

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

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

答案 1 :(得分:9)

因此,经过一些挖掘,我构建了非平凡的解决方案。

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

在以下示例中,文件HEAD的{​​{1}}和HEAD~2版本为vimdiff-ed:

inventory/group_vars/xyz/vault.yml

答案 2 :(得分:8)

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

中的atk-git-diff实用程序

This

Becomes

答案 3 :(得分:1)

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

在您的~/.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之类的文件)。该文件必须包含纯文本密码(当然应为.gitignore d)或生成该密码的可执行脚本。

通过将以下行添加到全局或本地.vault,继续进行并告诉ansible使用ansible.cfg文件:

vault_password_file = .vault

完成。现在运行git diff将产生您希望从非Vault文件中读取的差异:)

答案 4 :(得分:1)

给 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 $0 | wsl ansible-vault decrypt --output - --vault-password-file=~/.vault_pass'

保险库密码必须在 ~/.vault_pass 中的 wsl 内