【发布时间】:2021-04-05 00:04:01
【问题描述】:
我想在 ansible vault 文件中查看实际的 git commit 更改。
有没有简单的方法来实现这一点?
【问题讨论】:
标签: git diff ansible ansible-vault
我想在 ansible vault 文件中查看实际的 git commit 更改。
有没有简单的方法来实现这一点?
【问题讨论】:
标签: git diff ansible ansible-vault
您可以非常巧妙地执行此操作,以便使用自定义 git diff 驱动程序和 .gitattributes 等普通 git 工具,如 git log 和 git diff 可以查看保管文件内部。
.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的文件的diff驱动设置为ansible-vault view:
git config --global diff.ansible-vault.textconv "ansible-vault view"
应该就是这样 - 当 git 计算您的模式匹配的文件的差异时,它会首先解密它们。
【讨论】:
merge=binary过滤器防止git对加密文件进行3路合并和git config diff.ansible-vault.cachetextconv false防止缓存敏感信息也不错:selivan.github.io/2016/11/29/…
export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_password
diff.ansible-vault 命令之外,您还可以附加--vault-password-file=.vault_password,或者按照@victor-schröder 的建议,在ansible.cfg 中设置相应的属性。
vault_identity_list=foo@/path/to/vaultfile1,bar@/path/to/vaultfile2 (doc)。即使您的保管库没有 ID,这也有效,因为显然所有身份都将被尝试(即标签 foo 和 bar 是任意的且无效)。
所以经过一番挖掘后,我构建了一个重要的解决方案。
首先将您的保管库密码存储到 (.gitignored) .vault_password 文件中。
在以下示例中,文件 inventory/group_vars/xyz/vault.yml 的 HEAD 和 HEAD~2 版本是 vimdiff 编辑的:
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))
【讨论】:
【讨论】:
为了完整起见,值得一提的是如何在全局范围内为 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 将产生您期望从非保管文件中获得的可读差异:)
【讨论】:
给 Windows 用户的提示:
在 Windows 上运行时,您会遇到问题,即 ansible-vault 不可用。但您可以将其安装在 WSL 中。
在 WSL 中安装 ansible-vault 后,以下内容对我有用
.git 属性
**/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 中
【讨论】: