Как объяснить изменения в хранилище?

Я хотел бы видеть изменения git commit в файле ansible vault.

Есть ли простой способ, как этого добиться?

5 ответов

Решение

Вы можете сделать это очень аккуратно, чтобы обычные инструменты git, такие как git log а также git 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 для файлов с атрибутом diff=ansible-vault в ansible-vault view:

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

И это должно быть так - когда git вычисляет diff файлов, которым соответствует ваш шаблон, он сначала расшифрует их.

Поэтому после некоторого раскопок я построил нетривиальное решение.

Прежде всего, сохраните свой пароль хранилища в (.gitignored) .vault_password файл.

В следующем примере HEAD а также HEAD~2 версии файла inventory/group_vars/xyz/vault.yml 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))

Ты можешь использовать atk-git-diff утилита от https://github.com/dellis23/ansible-toolkit

это

становится

Для полноты картины стоит упомянуть, как глобально настроить diff для файлов ansible-vaults. Например, я работаю здесь с очень большим количеством доступных хранилищ, и почти у всех из них есть несколько секретных хранилищ. Поэтому я хочу, чтобы моя конфигурация была глобальной и переносимой с одной машины на другую.

В вашем ~/.gitconfig добавить эти разделы:

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

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

Чтобы это работало, вам нужен какой-то шаблон именования для файлов ansible-vaults, что в любом случае следует сделать хорошо. В моем случае я хотел бы назвать их с расширением .vault.yml, Так что мой ~/.gitattributes файл выглядит так:

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

Наконец, чтобы не вводить пароль постоянно, убедитесь, что у вас есть файл в удобном месте в каждом хранилище (обычно что-то вроде .vaultразмещены в корне). Этот файл должен содержать пароль в виде простого текста (правильно .gitignoreг, конечно) или исполняемый скрипт, который выдает такой пароль.

Имея это на месте, иди и скажи Ансайлу использовать .vault файл, добавив следующую строку в глобальный или локальный ansible.cfg:

vault_password_file = .vault

Готово. Сейчас работает git diff создаст читабельный diff, который вы ожидаете от файлов без хранилища:)

Подсказка для пользователей Windows:
при работе в Windows возникает проблема, это ansible-vault недоступно. Но вы можете установить его внутри своего WSL.
После установки ansible-vault в WSL у меня работает следующее:

.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'

Пароль хранилища должен быть внутри wsl в ~ / .vault_pass.

Другие вопросы по тегам