OK, mamy super tajny plik z hasłami, który trzeba zaszyfrować:
$ cat test.yml
foo: bar
Generujemy hasło (w dobrym tonie może być dodać plik z hasłem do .gitignore) i szyfrujemy:
$ pwgen 20 1 > vault.passwd
$ ansible-vault encrypt --vault-password-file vault.passwd test.yml
Encryption successful
$ cat test.yml
$ANSIBLE_VAULT;1.1;AES256
38353234616662643162646333323937633239316461616532646566366538356463636532663864
3666356664656266376661306435316636336161663730380a303134323037326331383339343438
35346466663336346536643039613264626137303835363265306538343263343631663663326237
3839353565623031610a646338643434626431373966666261373633393934643961386230653766
6433
git diff
działa bez niespodzianek i pokazuje szyfrowaną zawartość, która może się zmieniać nawet bez zmian w zaszyfrowanej treści (po każdym ansible-vault edit
):
$ git add test.yml
$ git diff --cached
diff --git a/test.yml b/test.yml
new file mode 100644
index 0000000..88cfa06
--- /dev/null
+++ b/test.yml
@@ -0,0 +1,6 @@
+$ANSIBLE_VAULT;1.1;AES256
+38353234616662643162646333323937633239316461616532646566366538356463636532663864
+3666356664656266376661306435316636336161663730380a303134323037326331383339343438
+35346466663336346536643039613264626137303835363265306538343263343631663663326237
+3839353565623031610a646338643434626431373966666261373633393934643961386230653766
+6433
Żeby na to poradzić potrzebujemy przede wszystkim skryptu, który jest w stanie przezroczyście rozszyfrować pliki Vaulta. Wrzucamy go gdzieś w $PATH
(/usr/bin
albo gdziekolwiek) i pamiętamy o chmod +x vault-cat
. W skrypcie jest zahardkodowana ścieżka do pliku vault.passwd (względem głównego katalogu repo). Można też dać --ask-vault-password
ale się zamęczycie przy każdym git log -p
.
Jeżeli plik nie jest szyfrowany, zostanie wyświetlony bez konwersji, za pomocą cat
.
$ cat `which vault-cat`
#!/bin/bash
HEADER=`head -n 1 "$1"`
case "$HEADER" in
\$ANSIBLE_VAULT*)
ansible-vault view --vault-password-file vault.passwd "$1"
;;
*)
cat "$1"
;;
esac
Pozostaje już tylko wpiąć vault-cat
jako driver do konwersji plików na format tekstowy (ta sztuczka działa dla dowolnych rodzajów plików, .doc, .pdf, cokolwiek co da się przekonwertować w sensowny sposób na tekst). Najpierw trzeba powiedzieć gitowi, że pliki typu vault (nazwa całkowicie arbitralna) mają być przed diffowaniem przefiltrowane przez vault-cat
(który je rozszyfruje):
$ git config diff.vault.textconv vault-cat
a potem oznaczyć pliki .yml
jako typ vault:
$ echo '*.yml diff=vault' > .git/info/attributes
Tu się przydaje fakt, że vault-cat
działa też dla plików nieszyfrowanych, bo np. playbooki też mają rozszerzenie .yml.
Szybki test:
$ git diff --cached
diff --git a/test.yml b/test.yml
new file mode 100644
index 0000000..88cfa06
--- /dev/null
+++ b/test.yml
@@ -0,0 +1 @@
+foo: bar
TADA.