
Votre premier playbook installait nginx — il est temps de manipuler des secrets. Dès que votre Ansible touche à un mot de passe de base de données, un token API ou une clé privée, vous devez les chiffrer avant qu’ils n’entrent dans Git. Cette page vous fait passer du « j’ai un fichier secret.yml en clair » à « mon fichier est chiffré, mon playbook le déchiffre au runtime, mon repo est commitable », en 7 étapes très progressives. À la fin : un .vault_password sécurisé, un fichier YAML chiffré avec ansible-vault encrypt, consommé via vars_files:, avec no_log: true sur les tâches sensibles.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Créer un mot de passe vault dans
.vault_passwordavec mode0600. - Chiffrer un fichier de secrets avec
ansible-vault encrypt. - Visualiser et éditer un fichier chiffré sans le déchiffrer manuellement.
- Consommer un fichier chiffré depuis un playbook (
vars_files:). - Lancer un playbook avec
--vault-password-fileou--ask-vault-pass. - Protéger la sortie Ansible avec
no_log: truesur les tâches sensibles.
Prérequis
Section intitulée « Prérequis »- Avoir validé Premier playbook.
- Lab homelab avec
db1.labjoignable en SSH. ansible-vault --versionretourne une version (livré avec ansible-core).
Pourquoi Ansible Vault dès maintenant
Section intitulée « Pourquoi Ansible Vault dès maintenant »Trois raisons concrètes le rendent incontournable très tôt :
- Git garde tout : un mot de passe commit en clair par accident reste dans
git logmême après un revert. GitHub indexe et propose le contenu via toute la chaîne de fork. - Les
.gitignorene chiffrent pas : ungit add -fou un fichier renommé qui sort du pattern, et le secret part. Le.gitignoreest un filtre, pas une protection. - Ansible Vault chiffre AES-256 : même committé sur GitHub public, le contenu reste protégé tant que le mot de passe vault, lui, est correctement isolé.
Vous reconnaissez un fichier chiffré à son en-tête caractéristique :
$ANSIBLE_VAULT;1.1;AES25633623037333362623432636361663137...C’est ce préfixe qui permet à Ansible de détecter automatiquement un fichier chiffré : pas besoin de l’annoncer dans le playbook, Ansible voit l’en-tête, demande le mot de passe, déchiffre en mémoire.
Étape 1 — Créer un mot de passe vault
Section intitulée « Étape 1 — Créer un mot de passe vault »Le pattern recommandé : un fichier .vault_password sur disque, mode 0600, jamais commité.
cd labs/premiers-pas/ansible-vault/
echo "premiers-pas-vault-2026" > .vault_passwordchmod 0600 .vault_passwordls -la .vault_passwordPourquoi 0600 ? Mode -rw------- signifie « lecture/écriture uniquement par le propriétaire ». Sans cette restriction, n’importe quel autre user du système (autre admin, runner CI partagé) peut lire le mot de passe. Ansible Vault accepterait quand même le fichier, mais c’est un anti-pattern majeur.
Étape 2 — Créer un fichier de secrets en clair
Section intitulée « Étape 2 — Créer un fichier de secrets en clair »Démarrez avec un fichier YAML lisible, vous le chiffrerez à l’étape suivante.
db_password: "Sup3rSecretP@ss2026!"api_token: "tok_demo_abc123xyz789"Vérifiez :
cat secret.ymlLe contenu apparaît en clair. Pour l’instant, ne le commitez surtout pas.
Étape 3 — Chiffrer le fichier
Section intitulée « Étape 3 — Chiffrer le fichier »Une seule commande transforme le fichier en blob chiffré :
ansible-vault encrypt secret.yml --vault-password-file=.vault_passwordSortie :
Encryption successfulVérifiez le résultat :
head -1 secret.yml$ANSIBLE_VAULT;1.1;AES256Le fichier est désormais illisible sans le mot de passe. Vous pouvez le git add et le commiter en toute sécurité.
Étape 4 — Lire le contenu sans le modifier
Section intitulée « Étape 4 — Lire le contenu sans le modifier »ansible-vault view secret.yml --vault-password-file=.vault_passwordAffiche le YAML déchiffré dans le terminal sans toucher au fichier sur disque. Idéal pour relire rapidement avant un commit ou en revue de code.
Étape 5 — Modifier un fichier chiffré
Section intitulée « Étape 5 — Modifier un fichier chiffré »ansible-vault edit secret.yml --vault-password-file=.vault_passwordCette commande déchiffre en mémoire, ouvre votre $EDITOR (vim, nano, code), vous éditez normalement, et rechiffre à la fermeture. Aucune copie en clair ne touche le disque.
À ne pas faire : view > tmp.yml, modifier tmp.yml, puis encrypt. Cette séquence laisse une fenêtre où le secret existe en clair sur disque — l’éditeur peut faire un swap, un crash peut laisser un fichier orphelin.
Étape 6 — Consommer le secret depuis un playbook
Section intitulée « Étape 6 — Consommer le secret depuis un playbook »Le pattern le plus simple : vars_files qui pointe sur le fichier chiffré.
- name: Premiers pas vault — déposer un secret sur db1 hosts: db1.lab become: true gather_facts: false vars_files: - secret.yml # ← Ansible déchiffre automatiquement
tasks: - name: Déposer la config DB avec le mot de passe déchiffré ansible.builtin.copy: dest: /tmp/db-config.txt content: | # Lab 04b — vault déchiffrement OK db_password={{ db_password }} api_token={{ api_token }} owner: root group: root mode: "0600" no_log: trueTrois bonnes pratiques visibles dans cette tâche :
vars_files: [secret.yml]charge le fichier (chiffré ou non) — Ansible détecte le header$ANSIBLE_VAULTautomatiquement.mode: "0600"sur le fichier déposé évite que d’autres users du serveur cible puissent le lire.no_log: truesur la tâche masque la sortie Ansible (sinonansible-playbook -vafficherait les variables résolues, donc le secret en clair).
Étape 7 — Lancer le playbook
Section intitulée « Étape 7 — Lancer le playbook »ansible-playbook lab.yml --vault-password-file=.vault_passwordSortie :
PLAY [Premiers pas vault — déposer un secret sur db1] ********
TASK [Déposer la config DB avec le mot de passe déchiffré] ***changed: [db1.lab]
PLAY RECAP ***************************************************db1.lab : ok=1 changed=1 unreachable=0 failed=0Vérification côté cible :
ssh ansible@db1.lab "sudo cat /tmp/db-config.txt"# Lab 04b — vault déchiffrement OKdb_password=Sup3rSecretP@ss2026!api_token=tok_demo_abc123xyz789Le fichier db-config.txt contient les valeurs déchiffrées sur la cible — déchiffrement transparent au runtime, sans jamais écrire le clair sur disque côté contrôleur.
Que se passe-t-il sans le mot de passe ?
Section intitulée « Que se passe-t-il sans le mot de passe ? »ansible-playbook lab.yml # SANS --vault-password-fileSortie :
ERROR! Attempting to decrypt but no vault secrets foundAnsible refuse de tourner sans le mot de passe — sécurité par défaut. Pour un workflow interactif (en démo, formation), utilisez :
ansible-playbook lab.yml --ask-vault-passVous serez invité à taper le mot de passe au clavier. Pas pour la CI/CD — un fichier en 0600 ou une variable d’env pointant vers un secret manager est plus pratique et plus sûr.
Lab pratique
Section intitulée « Lab pratique »Le lab premiers-pas/ansible-vault du repo ansible-training reproduit cette page avec 8 tests pytest automatisés qui valident :
- Le fichier
.vault_passwordexiste et est en mode0600. - Le fichier
app_secrets.ymlest bien chiffré (en-tête$ANSIBLE_VAULT). - Le playbook
solution.ymldépose/tmp/db1-app.confsurdb1.labavec mode0600, ownerroot. - Les 3 secrets attendus (
db_password=,jwt_secret=,redis_token=) sont présents et non vides.
Suivre : labs/premiers-pas/ansible-vault/README.md.
Sécurité — bonnes pratiques
Section intitulée « Sécurité — bonnes pratiques ».vault_passworden mode0600et gitignored dès la création du projet.ansible.cfg: poservault_password_file = .vault_passworddans[defaults]pour éviter de répéter--vault-password-fileà chaque commande.no_log: truesur toute tâchecommand:,shell:,uri:,copy:aveccontent:qui manipule un secret.mode: "0600"ou plus restrictif sur tout fichier déposé contenant des valeurs déchiffrées.- Rotation périodique du mot de passe vault (tous les 6 à 12 mois) avec
ansible-vault rekey. - Pas de mot de passe en CLI : un
ansible-playbook ... --vault-password "MonPass"(s’il existait) apparaîtrait dansps auxet l’historique shell.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
Decryption failed | Mauvais mot de passe ou fichier corrompu | Vérifier .vault_password, retenter ansible-vault view |
input is not vault encrypted data | Fichier non chiffré passé à view | Vérifier l’en-tête avec head -1 secret.yml |
Attempting to decrypt but no vault secrets found | --vault-password-file oublié | Ajouter l’option ou poser vault_password_file dans ansible.cfg |
Variable undefined au runtime | vars_files mal pointé | Vérifier le chemin relatif au playbook |
Secret apparaît dans -v | no_log: true manquant sur la tâche | Ajouter no_log: true sur la task qui manipule le secret |
À retenir
Section intitulée « À retenir »- Ansible Vault chiffre un fichier YAML avec AES-256 ; en-tête
$ANSIBLE_VAULT;1.1;AES256. .vault_password: mode0600, gitignored, jamais commité.- 5 commandes essentielles :
encrypt,view,edit,rekey,decrypt. - Consommation :
vars_files: [secret.yml]dans le playbook ; Ansible déchiffre automatiquement au runtime. no_log: truemasque la sortie pour ne pas exposer le secret en mode verbose.--vault-password-file>--ask-vault-passen CI/CD ; l’inverse en démo formation.