
Ansible Vault chiffre vos fichiers sensibles avec AES-256 et un mot de passe que vous gardez hors du dépôt Git. Cette page vous fait passer de zéro à un premier playbook qui consomme un fichier de secrets chiffré, en 5 commandes : encrypt, view, edit, rekey, decrypt. Public visé : tout opérateur Ansible qui n’a jamais utilisé Vault et veut adopter le pattern minimal recommandé en 2026.
À la fin, vous saurez créer un secret.yml chiffré, le versionner sans risque, le modifier sans le déchiffrer manuellement, et le consommer depuis un playbook avec vars_files.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Créer un fichier chiffré avec
ansible-vault encrypt. - Lire son contenu sans le modifier (
view). - Modifier un fichier chiffré (
edit) sans déchiffrer/rechiffrer manuellement. - Rotater le mot de passe sans toucher aux données (
rekey). - Consommer un fichier chiffré depuis un playbook avec
vars_files. - Sécuriser le mot de passe lui-même (mode 0600,
.gitignore, env var).
Prérequis
Section intitulée « Prérequis »- Ansible 2.18+ installé (voir Installation).
- Un cible SSH joignable (lab
web1.labou équivalent). - Comprendre les
vars_filesetvarsdans un playbook (voir Premier playbook).
Pourquoi Ansible Vault, vraiment
Section intitulée « Pourquoi Ansible Vault, vraiment »Trois constats motivent Ansible Vault :
- Un mot de passe en clair dans Git est compromis : Git garde l’historique, un revert ne supprime rien. GitHub indexe et propose ce contenu via
git logà toute personne ayant accès en lecture. - Le
.gitignoren’est pas une stratégie de sécurité : c’est juste un filtre. Ungit add fichier.yml -fou un fichier renommé qui sort du pattern, et le secret part. - Ansible Vault rend le fichier illisible sans le mot de passe : même committé, le contenu reste protégé tant que le mot de passe vault est correctement isolé.
Le format chiffré commence par une ligne d’en-tête caractéristique :
$ANSIBLE_VAULT;1.1;AES25633623037333362623432636361663137...C’est ce 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 fichier de mot de passe vault
Section intitulée « Étape 1 — Créer un fichier de mot de passe vault »La pratique recommandée : un fichier de mot de passe sur disque, en mode 0600, jamais commité.
cd /home/bob/Projets/ansible-training/labs/vault/introduction/
# Générer un mot de passe fort et le poser dans .vault_passwordecho "DemoPassword2026!Lab77" > .vault_passwordchmod 600 .vault_password
# Bloquer toute possibilité de commit accidentelecho ".vault_password" >> ../../.gitignorePourquoi ce pattern ? Trois raisons :
- Mode 0600 : seul votre user lit/écrit. Un autre utilisateur du serveur (CI runner partagé) ne peut pas le lire.
- Hors du dépôt : impossible à committer accidentellement, et chaque environnement (laptop, CI, prod) en a sa propre copie.
- Rejouable :
--vault-password-file=.vault_passworddispense de retaper le mot de passe à chaque commande.
Étape 2 — Chiffrer un premier fichier
Section intitulée « Étape 2 — Chiffrer un premier fichier »Créer un fichier YAML simple, puis le chiffrer.
cat > secret.yml <<'EOF'db_password: "SuperSecretLab77!"api_token: "tok_lab77_xyz_abc"EOF
ansible-vault encrypt secret.yml --vault-password-file=.vault_passwordSortie attendue :
Encryption successfulVérifier 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 3 — Lire, modifier, rotater
Section intitulée « Étape 3 — Lire, modifier, rotater »Quatre commandes couvrent 95 % des cas d’usage quotidiens.
-
Lire le contenu sans modifier le fichier sur disque :
Fenêtre de terminal ansible-vault view secret.yml --vault-password-file=.vault_passwordAffiche le YAML déchiffré dans le terminal. Idéal pour relire rapidement.
-
Modifier le fichier — Ansible le déchiffre en
$EDITOR, vous éditez, il rechiffre à la fermeture :Fenêtre de terminal ansible-vault edit secret.yml --vault-password-file=.vault_passwordAucune copie en clair ne reste sur disque. Ne jamais
view > tmp.yml, éditer, puisencrypt— ce détour laisse une fenêtre où le secret existe en clair. -
Rotater le mot de passe Vault sans toucher au contenu :
Fenêtre de terminal ansible-vault rekey secret.yml \--vault-password-file=.vault_password \--new-vault-password-file=.vault_password.newLe contenu reste identique, seul le mot de passe de chiffrement change. Pratique en cas de suspicion de fuite du mot de passe ancien.
-
Déchiffrer définitivement (rare, sauf migration) :
Fenêtre de terminal ansible-vault decrypt secret.yml --vault-password-file=.vault_passwordLe fichier redevient lisible en clair. À éviter en pratique : si vous voulez juste lire, utilisez
view.
Étape 4 — Consommer le secret depuis un playbook
Section intitulée « Étape 4 — Consommer le secret depuis un playbook »Le pattern le plus simple : vars_files qui pointe sur le fichier chiffré.
- name: Lab 77 — Premier playbook avec Ansible Vault hosts: web1.lab become: true gather_facts: false
vars_files: - secret.yml # Ansible déchiffre automatiquement
tasks: - name: Pose un fichier qui prouve que les variables sont accessibles ansible.builtin.copy: dest: /tmp/lab77-vault-demo.txt content: | Vault demo — lab `vault/introduction` db_password length: {{ db_password | length }} api_token starts: {{ api_token[:8] }} mode: "0600"Lancer le playbook :
ansible-playbook playbook.yml \ --vault-password-file=.vault_passwordSortie attendue :
PLAY [Lab 77 — Premier playbook avec Ansible Vault] ***TASK [Pose un fichier...] ***changed: [web1.lab]
PLAY RECAP ***web1.lab : ok=1 changed=1 unreachable=0 failed=0Vérification côté cible :
ssh ansible@web1.lab "sudo cat /tmp/lab77-vault-demo.txt"Le fichier sur web1.lab affiche db_password length: 18 et le préfixe du token, sans jamais avoir exposé la valeur claire dans la sortie Ansible.
Lab pratique
Section intitulée « Lab pratique »Le lab vault/introduction du repo ansible-training reproduit cette page pas à pas, avec 5 tests pytest qui vérifient :
- Le fichier
secret.ymlest bien au format Vault ($ANSIBLE_VAULT). - Le playbook accède aux variables chiffrées sans les afficher en clair.
- Le mot de passe vault n’est pas commité (vérification
.gitignore). - Un challenge final demande de combiner deux fichiers chiffrés (
db_secrets.yml+api_secrets.yml) sur un même playbook.
Suivre le lab : labs/vault/introduction/README.md.
Sécurité — bonnes pratiques
Section intitulée « Sécurité — bonnes pratiques ».vault_passworden mode0600et dans.gitignoredès la création du dépôt.ansible.cfg: poservault_password_file = .vault_passworddans[defaults]pour éviter de répéter--vault-password-fileà chaque commande.- Rotation du mot de passe vault tous les 6 à 12 mois, ou immédiatement en cas de suspicion de fuite (
ansible-vault rekey). no_log: truesur toute tâchecommand:,shell:,uri:qui manipule un secret en argument.- CI/CD : le mot de passe vient d’un secret manager (GitHub Secrets, GitLab CI variables), jamais en dur dans
.gitlab-ci.yml. - Limiter le périmètre : un fichier
secret.ymlpartagé entre 50 projets est un risque, préférer un fichier par projet ou par groupe d’inventaire.
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
ERROR! Decryption failed | Mauvais mot de passe ou fichier corrompu | Vérifier .vault_password, retenter view |
ERROR! input is not vault encrypted data | Fichier non chiffré passé à view | Vérifier l’en-tête $ANSIBLE_VAULT avec head -1 |
Variables vault_* non résolues | vars_files oublié dans le playbook | Ajouter vars_files: [secret.yml] |
| Le playbook demande le mot de passe interactivement | --vault-password-file non passé ou ignoré | Vérifier le chemin, ou poser vault_password_file dans ansible.cfg |
À retenir
Section intitulée « À retenir »- Ansible Vault chiffre un fichier YAML avec AES-256 ; l’en-tête commence par
$ANSIBLE_VAULT. - Le mot de passe vit dans
.vault_password(mode0600,.gitignore), jamais dans Git. - 5 commandes essentielles :
encrypt,view,edit,rekey,decrypt. - Consommation :
vars_files: [secret.yml]dans le playbook ; Ansible déchiffre automatiquement. no_log: truesur toute tâche manipulant un secret en argument shell.- Rotation :
ansible-vault rekeychange le mot de passe sans toucher au contenu.