Quelles sont les meilleures pratiques pour utiliser Ansible Vault sur des CI publics et des référentiels de contrôle de source comme BitBucket?

11

introduction

Sur un CI privé et des référentiels de contrôle de source comme Gitlab-ce, il est possible de copier un ~ / .vault_pass.txt sur le serveur et de le laisser utiliser par le CI pour déchiffrer des fichiers à l'aide d'Ansible.

Problème

Sur les CI publics et les référentiels de contrôle de source comme Bitbucket, il n'est pas possible de copier un ~ / .vault_pass.txt sur le serveur CI lui-même.

Discussion

Dans Bitbucket, il est possible de définir des variables chiffrées, mais lorsque ce fichier est vérifié, les seules variables liées à VAULT sont:

  • ANSIBLE_ASK_VAULT_PASS
  • ANSIBLE_VAULT_PASSWORD_FILE

Ces variables ne sont pas une option pour résoudre le problème, car lorsque le ANSIBLE_ASK_VAULT_PASSparamètre est défini, vous êtes ansible-vaulttoujours invité:

user@host $
Vault password:

Lorsque le même mot de passe est entré, il peut ouvrir le fichier crypté, mais le but est d'ouvrir le fichier sans avoir besoin d'un fichier ou entrer un mot de passe dans une invite.

Une autre tentative de résolution du problème était en cours d'exécution export ANSIBLE_ASK_VAULT_PASS=<ansible-vault-password>, mais le mode interactif persiste.

Une autre option est export ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt, mais ce fichier doit être poussé vers le référentiel, mais les référentiels de contrôle source ne doivent pas contenir de mots de passe.

030
la source
2
Salut @ 030, pourriez-vous préciser ce que vous entendez par CI? Pour moi, cela signifie une intégration continue , mais GitLab et BitBucket sont également des référentiels de contrôle de source - la question serait plus claire si CI était développé.
Richard Slater

Réponses:

8

--vault-password-filepeut plutôt pointer vers un script exécutable qui écrit sur stdout. Cette fonctionnalité peu connue devrait résoudre votre problème.

Tout d'abord, écrivez un script exécutable simple qui imprime une variable d'environnement système et vérifiez-le dans votre contrôle de code source. Ensuite, utilisez la fonction de variable cryptée de Bitbucket pour définir cette variable d'environnement sur votre secret ansible-vault. Enfin, exécutez comme suit:

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

Les références:

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

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

Chasseur des bois
la source
Et puis le mypass.sh contiendra echo $VARpar exemple et cette var sera définie dans l'interface utilisateur BitBucket?
030
Ouaip! Alternativement, voici un exemple Python: 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

En utilisant

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

a donné lieu à:

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.

Sur la base de ce post, les éléments suivants ont été définis dans bitbucket-pipelines:

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
la source
-1

Vous pouvez avoir une configuration de test qui n'exécute pas la production et charger différents fichiers pour ceux-ci.

Créez un host_vars / localhost / vault qui ne fonctionne que pour l'installation de test locale.

De cette façon, vous pouvez utiliser un mot de passe de coffre ouvert qui ne fonctionne que pour ce coffre hôte local.

Findarato
la source