Skip to content

Instantly share code, notes, and snippets.

@gnosek
Created September 7, 2015 14:36
Show Gist options
  • Save gnosek/5bd80c03d73e278f5e94 to your computer and use it in GitHub Desktop.
Save gnosek/5bd80c03d73e278f5e94 to your computer and use it in GitHub Desktop.
ansible-vault diff

git diff ansible-vault

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment