Как объяснить изменения в хранилище?
Я хотел бы видеть изменения 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))
Для полноты картины стоит упомянуть, как глобально настроить 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.