
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é.
# 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, fichier de secrets chiffre 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.
Mettre en pratique
Section intitulée « Mettre en pratique »Les cinq commandes de base ne se retiennent qu'après les avoir enchaînées sur un même fichier. Le lab vous fait chiffrer un fichier de variables, le relire, le modifier sans jamais le laisser en clair sur disque, changer son mot de passe de chiffrement, puis le consommer depuis un playbook avec vars_files. La vérification contrôle l'en-tête $ANSIBLE_VAULT du fichier, l'accès aux variables à l'exécution et l'exclusion du mot de passe du dépôt Git ; le challenge final demande de combiner deux fichiers chiffrés dans un même playbook.
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.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Vault-id multiples (dev/prod) : Un mot de passe par environnement, pour qu'une fuite en dev n'ouvre pas la prod.
- Playbooks mixtes : Le pattern recommandé : variables publiques et secrets séparés dans chaque group_vars.
- HashiCorp Vault / OpenBao : Quand le mot de passe partagé devient ingérable, la récupération dynamique prend le relais.