【问题标题】:How to diff ansible vault changes?如何区分 ansible Vault 更改?
【发布时间】:2021-04-05 00:04:01
【问题描述】:

我想在 ansible vault 文件中查看实际的 git commit 更改。

有没有简单的方法来实现这一点?

【问题讨论】:

    标签: git diff ansible ansible-vault


    【解决方案1】:

    您可以非常巧妙地执行此操作,以便使用自定义 git diff 驱动程序和 .gitattributes 等普通 git 工具,如 git loggit 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/…
    • 我必须设置 ANSIBLE_VAULT_PASSWORD_FILE 环境。
    • 我也是@BARJ: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,这也有效,因为显然所有身份都将被尝试(即标签 foobar 是任意的且无效)。
    【解决方案2】:

    所以经过一番挖掘后,我构建了一个重要的解决方案。

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

    在以下示例中,文件 inventory/group_vars/xyz/vault.ymlHEADHEAD~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))
    

    【讨论】:

      【解决方案3】:

      您可以使用来自https://github.com/dellis23/ansible-toolkitatk-git-diff 实用程序

      【讨论】:

        【解决方案4】:

        为了完整起见,值得一提的是如何在全局范围内为 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 将产生您期望从非保管文件中获得的可读差异:)

        【讨论】:

          【解决方案5】:

          给 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 中

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-21
            • 1970-01-01
            • 2020-10-13
            相关资源
            最近更新 更多