Quelqu'un at-il un exemple de décryptage et de téléchargement d'un fichier en utilisant ansible-vault .
Je pense à garder mes certificats SSL cryptés dans le contrôle de code source.
Il semble que quelque chose comme ce qui suit devrait fonctionner.
---
- name: upload ssl crt
copy: src=../../vault/encrypted.crt dest=/usr/local/etc/ssl/domain.crt
Ça ne va pas marcher. Vous obtiendrez votre encrypted.crt
(avec Ansible Vault) téléchargé littéralement en tant que domain.crt
Ce que vous devez faire, c'est intégrer votre playbook à un "coffre-fort" et ajouter une variable qui contient le contenu de votre certificat. Quelque chose comme ça:
---
- name: My cool playbook
hosts: all
vars:
mycert: |
aasfasdfasfas
sdafasdfasdfasdfsa
asfasfasfddasfasdfa
tasks:
# Apparently this causes new lines on newer ansible versions
# - name: Put uncrypted cert in a file
# Shell: echo '{{ mycert }}' > mydecrypted.pem
# You can try this as per
# https://github.com/ansible/ansible/issues/9172
- copy:
content: "{{ mycert }}"
dest: /mydecrypted.pem
- name: Upload Cert
copy: src=/home/ubuntu/mydecrypted.pem dest=/home/ubuntu/mydecrypteddest.pem
- name: Delete decrypted cert
file: path=/home/ubuntu/mydecrypted.pem state=absent
Vous pouvez également choisir de placer votre variable mycert
dans un fichier de variables distinct à l'aide d'Ansible Vault.
Le module de copie a été mis à jour dans Ansible 2.1. Depuis le journal des modifications: "le module de copie peut désormais utiliser de manière transparente un fichier stocké comme source, si les mots de passe du coffre-fort ont été fournis, il sera décrypté et copié à la volée." En le notant ici, car certaines personnes ne regarderont pas forcément au-delà de la réponse acceptée. - JK Laiho
Le module de copie le fait maintenant de manière transparente à partir d'Ansible 2.1.x. Cryptez simplement votre fichier avec Ansible Vault, puis lancez la tâche de copie sur le fichier.
(Pour référence, voici la fonctionnalité qui a ajouté ceci: https://github.com/ansible/ansible/pull/15417 )
Il y a ne demande de fonctionnalité pour supporter cela nativement dans le module de copie. Mais jusqu'à ce que cela soit implémenté, voici la solution de contournement (similaire à la réponse de @ dave1010, mais en répétant les parties communes pour être complet):
Créez un fichier secrets.yml
Chiffré avec un coffre-fort ansible qui contient vos secrets, par exemple:
---
private_ssl_key: |
-----BEGIN PRIVATE KEY-----
abcabcabcabcabcabcabcabcabc
-----END PRIVATE KEY-----
private_crt: |
-----BEGIN CERTIFICATE-----
abcabcabcabcabcabcabcabcabc
-----END CERTIFICATE-----
Dans votre livre de jeu, incluez-le:
vars_files:
- secrets.yml
Ensuite, vous pouvez utiliser les variables dans les tâches:
- name: Copy private kay
copy: content="{{ private_ssl_key }}" dest=/some/path/ssl.key
Cependant, cela ne fonctionne pas si le fichier que vous essayez de copier est un fichier binaire. Dans ce cas, vous devez d'abord encoder le contenu avec base64:
cat your_secret_file | /usr/bin/base64
Mettez ensuite la valeur encodée en base64 dans votre fichier secrets.yml
, Par exemple:
crt_b64: |
ndQbmFQSmxrK2IwOFZnZHNJa0sKICAxdDhFRUdmVzhMM...
Vous pouvez ensuite créer le fichier distant en deux étapes:
- name: Copy certificate (base64 encoded)
copy: content="{{ crt_b64 }}" dest=/some/path/cert.b64
- name: Decode certificate
Shell: "base64 -d /some/path/cert.b64 > /some/path/cert.txt"
args:
creates: /some/path/cert.txt
Notez que vous pouvez supprimer le fichier temporaire cert.b64
Sur l'hôte distant. Mais en réexécutant le playbook, vous le recréez au lieu de sauter cette tâche. Je préfère donc le laisser là.
[~ # ~] mise à jour [~ # ~] : Cette fonctionnalité a été implémentée dans Ansible 2.1 .
le module de copie peut désormais utiliser de manière transparente un fichier stocké comme source, si des mots de passe de coffre-fort ont été fournis, il sera décrypté et copié à la volée.
J'ai utilisé un modèle et un vars_file
Pour le faire:
Dans votre playbook de haut niveau:
vars_files:
- secretvars.yml
Dans une tâche:
- name: Private ssl key
template: src=etc-ssl-private-site.key dest=/etc/ssl/private/site.key
Dans le modèle (etc-ssl-private-site.key
) Tout ce dont vous avez besoin est la variable:
{{ private_ssl_key }}
Dans le secretvars.yml
Chiffré (chiffrez-le avec ansible-vault
):
---
private_ssl_key: |
-----BEGIN PRIVATE KEY-----
abcabcabcabcabcabcabcabcabc
-----END PRIVATE KEY-----
Mise à jour: En date du avril 2016 mon Github PR a été fusionné et est disponible dans Ansible 2.1 et versions ultérieures. Ce qui suit était une solution provisoire jusqu'à la fusion du PR.
Voulant faire la même chose, j'ai créé un plugin d'action pour implémenter la fonctionnalité. Ceci est disponible via github . Le plugin est exactement le plugin d'action de copie fourni avec ansible, mais avec la prise en charge du décryptage du coffre-fort.
Vous pouvez l'utiliser comme ceci:
- name: Copy Some Secret File
copyv: src="secret.txt" dest="/tmp/"
si secret.txt est chiffré (et que le mot de passe du coffre-fort est fourni), il sera déchiffré et copié.
Je pense que vous avez un moyen plus simple de le faire.
Si vous utilisez le certificat + la clé dans un fichier dans un certain format (comme pkcs12 ou simplement concaténé), vous pouvez utiliser le cryptage générique openssl
(ou gpg
, ou autre)). Il ressemblera à ceci:
openssl enc -e -aes-256-ctr -in original.pem -out encrypted.aes -k <pass-vault>
Après cela, vous pouvez simplement copier encrypted.aes sur l'hôte distant et le décrypter en place:
- name: copy encrypted cert and key
copy: src=encrypted.aes dest=/root/ansible-files/ mode=0600
- name: decrypt cert and key
command: openssl enc -aes-256-ctr -d -in /root/ansible-files/encrypted.aes -out <dest> -k {{ pass-vault }}
Si vous avez un fichier clé distinct au format pem ou der, vous pouvez utiliser
openssl rsa -in original.pem -out encrypted.pem -aes256 -passout pass:<pass-vault>
Ansible 2.5 a ajouté le paramètre decrypt
au module copy
.
Par exemple, si vous avez chiffré votre fichier en utilisant quelque chose comme:
$ ansible-vault encrypt vault/encrypted.crt
Vous pouvez maintenant utiliser copy + decrypt:
---
- name: upload ssl crt
copy:
src: path/to/encrypted-with-vault.crt
dest: /usr/local/etc/ssl/domain.crt
decrypt: yes
mode: 0600
Jusqu'à ce que le module de "copie" ait été étendu pour décrypter automatiquement les fichiers du coffre-fort, voici une solution simple:
Lorsque stdout n'est pas un tty, ansible-vault view <file>
imprime le texte clair sur stdout sans invoquer de pager.
En combinaison avec une recherche "pipe", ce comportement peut être utilisé avec un fichier de mot de passe du coffre-fort pour alimenter l'option "contenu" du module de copie:
- name: "install Host key"
copy: content="{{ lookup('pipe', 'ansible-vault view ' + src_key_file) }}"
dest={{ dest_key_file }}
Vous pouvez également utiliser local_action pour décrypter temporairement votre fichier dans le cadre du playbook:
- name: "temporairly decrypt the twpol.enc"
Sudo: False
local_action: Shell ansible-vault view --vault-password-file {{ lookup('env', 'ANSIBLE_VAULT_PASS_FILE') }} ./roles/copykey/files/key.enc > ./roles/copykey/files/key.txt
- name: "copy the key to the target machine."
copy: src=key.txt dest=/tmp
- name: "remove decrypted key.txt file"
Sudo: False
local_action: rm ./roles/copykey/files/key.txt