Jakie są najlepsze praktyki korzystania z usługi Ansible Vault w publicznych repozytoriach CI i Source Control, takich jak BitBucket?

11

Wprowadzenie

W prywatnych repozytoriach CI i Source Control, takich jak Gitlab-ce, można skopiować ~ / .vault_pass.txt na serwer i pozwolić, aby używał go do odszyfrowywania plików przy użyciu Ansible.

Problem

W publicznych repozytoriach CI i Source Control, takich jak Bitbucket, nie można skopiować pliku ~ / .vault_pass.txt na sam serwer CI.

Dyskusja

W Bitbucket można zdefiniować zaszyfrowane zmienne, ale po sprawdzeniu tego pliku jedynymi zmiennymi powiązanymi z VAULT są:

  • ANSIBLE_ASK_VAULT_PASS
  • ANSIBLE_VAULT_PASSWORD_FILE

Te zmienne nie są opcją rozwiązania problemu, ponieważ gdy ANSIBLE_ASK_VAULT_PASSjest ustawiony, ansible-vaultnadal monituje:

user@host $
Vault password:

Po wprowadzeniu tego samego hasła można otworzyć zaszyfrowany plik, ale jego celem jest otwarcie pliku bez potrzeby podawania pliku lub wpisywania hasła w monicie.

Trwała kolejna próba rozwiązania problemu export ANSIBLE_ASK_VAULT_PASS=<ansible-vault-password>, ale tryb interaktywny nadal występuje.

Inną opcją jest export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt, ale następnie plik ten musi zostać przekazany do repozytorium, ale repozytoria kontroli źródła nie powinny zawierać haseł.

030
źródło
2
Cześć @ 030, czy możesz wyjaśnić, co masz na myśli przez CI? Dla mnie oznacza to ciągłą integrację , jednak zarówno GitLab, jak i BitBucket są również repozytoriami kontroli źródła - pytanie byłoby bardziej zrozumiałe, gdyby CI został rozwinięty.
Richard Slater

Odpowiedzi:

8

--vault-password-filezamiast tego może wskazywać na skrypt wykonywalny, który zapisuje na standardowe wyjście. Ta mało znana funkcja powinna rozwiązać Twój problem.

Najpierw napisz prosty, wykonywalny skrypt, który wypisuje systemową zmienną środowiskową i sprawdź to w kontroli źródła. Następnie użyj funkcji zaszyfrowanej zmiennej Bitbucket, aby ustawić tę zmienną środowiskową na klucz tajny w ansible-vault. Na koniec wykonaj tak:

ansible-playbook site.yml --vault-password-file ./mypass.sh.

Bibliografia:

  1. http://docs.ansible.com/ansible/playbooks_vault.html#running-a-playbook-with-vault

  2. https://groups.google.com/forum/#!topic/ansible-devel/1vFc3y6Ogto

Woodland Hunter
źródło
A potem plik mypass.sh będzie zawierał echo $VARna przykład, a ten var zostanie ustawiony w interfejsie BitBucket?
030
Tak! Alternatywnie, oto przykład w Pythonie: stackoverflow.com/questions/4906977/...
Woodland Hunter
([Errno 8] Exec format error). If this is not a script, remove the executable bit from the file.
030
1

Za pomocą

ansible-playbook site.yml --vault-password-file ./mypass.sh

doprowadzony:

ERROR! Problem running vault password script / p a t h / t o
/ e c h o _ v a u l t _ p a s s . s h ([Errno 8] Exec format error). If this is 
not a script, remove the executable bit from the file.

Na podstawie tego postu w bitbucket-pipelines zdefiniowano:

image: docker:latest

pipelines:
  default:
    - step:
        script:
          - echo $ANSIBLE_VAULT_PASSWORD > .vault_password.txt
          - ansible-playbook -i ansible/inventory ansible/site.yml --vault-password-file .vault_password.txt
030
źródło
-1

Możesz mieć zestaw testowy, który nie uruchamia produkcji, i ładować dla nich różne pliki.

Utwórz host_vars / localhost / vault, który działa tylko dla lokalnej instalacji testowej.

W ten sposób możesz użyć hasła do otwartego skarbca, które działa tylko dla tego lokalnego skarbca hosta.

Findarato
źródło