Was sind Best Practices für die Verwendung von Ansible Vault in öffentlichen CIs und Quellcodeverwaltungs-Repositorys wie BitBucket?

11

Einführung

Auf privaten CIs und Versionsverwaltungs-Repositorys wie Gitlab-ce ist es möglich, eine ~ / .vault_pass.txt auf den Server zu kopieren und vom CI zum Entschlüsseln von Dateien mit Ansible verwenden zu lassen.

Problem

In öffentlichen CIs und Quellcodeverwaltungs-Repositorys wie Bitbucket ist es nicht möglich, eine ~ / .vault_pass.txt selbst auf den CI-Server zu kopieren.

Diskussion

In Bitbucket ist es möglich, verschlüsselte Variablen zu definieren. Wenn diese Datei aktiviert ist, sind die einzigen VAULT-bezogenen Variablen:

  • ANSIBLE_ASK_VAULT_PASS
  • ANSIBLE_VAULT_PASSWORD_FILE

Diese Variablen sind keine Option, um das Problem zu lösen, da bei der ANSIBLE_ASK_VAULT_PASSEinstellung ansible-vaultimmer noch folgende Eingabeaufforderungen angezeigt werden:

user@host $
Vault password:

Wenn dasselbe Kennwort eingegeben wird, kann die verschlüsselte Datei geöffnet werden. Ziel ist es jedoch, die Datei zu öffnen, ohne eine Datei zu benötigen oder ein Kennwort in eine Eingabeaufforderung einzugeben.

Ein weiterer Versuch, das Problem zu lösen, wurde ausgeführt export ANSIBLE_ASK_VAULT_PASS=<ansible-vault-password>, der interaktive Modus bleibt jedoch bestehen.

Eine andere Option ist export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt, dass diese Datei dann in das Repository verschoben werden muss, die Quellcodeverwaltungs-Repositorys jedoch keine Kennwörter enthalten sollten.

030
quelle
2
Hallo @ 030, können Sie klarstellen, was Sie unter CI verstehen? Für mich bedeutet dies kontinuierliche Integration , jedoch sind sowohl GitLab als auch BitBucket auch Quellcodeverwaltungs-Repositorys - die Frage wäre klarer, wenn CI erweitert würde.
Richard Slater

Antworten:

8

--vault-password-filekann stattdessen auf ein ausführbares Skript verweisen, das in stdout schreibt. Diese wenig bekannte Funktion sollte Ihr Problem lösen.

Schreiben Sie zunächst ein einfaches, ausführbares Skript, das eine Systemumgebungsvariable druckt, und checken Sie dies in Ihre Quellcodeverwaltung ein. Verwenden Sie dann die Funktion für verschlüsselte Variablen von Bitbucket, um diese Umgebungsvariable auf Ihr Ansible-Vault-Geheimnis festzulegen. Führen Sie zum Schluss Folgendes aus:

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

Verweise:

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

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

Waldjäger
quelle
Und dann wird die Datei mypass.sh echo $VARzum Beispiel enthalten und diese Variable wird in der BitBucket-Benutzeroberfläche festgelegt?
030
Jep! Alternativ ist hier ein Python-Beispiel: 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

Verwenden von

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

führte zu:

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.

Basierend auf diesem Beitrag wurde Folgendes in Bitbucket-Pipelines definiert:

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
quelle
-1

Sie könnten einen Test einrichten, der keine Produktion ausführt, und verschiedene Dateien für diese laden.

Erstellen Sie ein host_vars / localhost / vault, das nur für die lokale Testinstallation funktioniert.

Auf diese Weise können Sie ein offenes Tresorkennwort verwenden, das nur für diesen lokalen Host-Tresor funktioniert.

Findarato
quelle