Ansible Vault
Stocker des secrets en clair dans un dépôt Git est une faute de sécurité élémentaire. Ansible Vault chiffre les données sensibles avec AES-256, directement dans les fichiers YAML ou sous forme de chaînes inlinées. Les playbooks fonctionnent sans modification : Vault est transparent à l'exécution.
Chiffrer un fichier entier
# Chiffrer un fichier existant
ansible-vault encrypt inventory/prod/group_vars/all/vault.yml
# Créer un nouveau fichier chiffré
ansible-vault create inventory/prod/group_vars/all/vault.yml
# Éditer un fichier chiffré (déchiffrement temporaire en mémoire)
ansible-vault edit inventory/prod/group_vars/all/vault.yml
# Visualiser sans modifier
ansible-vault view inventory/prod/group_vars/all/vault.yml
# Déchiffrer un fichier (crée un fichier en clair)
ansible-vault decrypt inventory/prod/group_vars/all/vault.yml
# Changer le mot de passe
ansible-vault rekey inventory/prod/group_vars/all/vault.ymlencrypt_string : secrets inline
Pour chiffrer une seule valeur dans un fichier YAML non chiffré :
ansible-vault encrypt_string 'motdepassesecret' --name 'db_password'Résultat à coller dans un fichier YAML :
db_password: !vault |
$ANSIBLE_VAULT;1.1;AES256
61383838633730613932396463623261386530326631306464636233323763373432386161316663
...Fournir le mot de passe
# Interactif (prompt)
ansible-playbook site.yml --ask-vault-pass
# Fichier de mot de passe (chmod 600, hors git)
ansible-playbook site.yml --vault-password-file ~/.vault_pass
# Via ansible.cfg (évite de le passer à chaque commande)
# [defaults]
# vault_password_file = ~/.vault_pass
# Via variable d'environnement
ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass ansible-playbook site.ymlMultiple Vault IDs
Quand on gère plusieurs environnements avec des mots de passe Vault différents :
# Chiffrer avec un ID spécifique
ansible-vault encrypt_string 'secret' --name 'api_key' --vault-id prod@~/.vault_prod
# Exécuter avec plusieurs vault IDs
ansible-playbook site.yml --vault-id prod@~/.vault_prod --vault-id staging@~/.vault_stagingConvention recommandée
Pour chaque groupe dans group_vars/, utiliser deux fichiers : un fichier en clair (vars.yml) et un fichier chiffré (vault.yml) :
group_vars/
└── db/
├── vars.yml # variables en clair, référence les variables vault
└── vault.yml # secrets chiffrés# vars.yml — visible dans git, aucun secret
db_host: db01.example.com
db_port: 5432
db_name: myapp
db_user: myapp_user
db_password: "{{ vault_db_password }}" # référence la variable vault
# vault.yml — chiffré, contient les secrets
vault_db_password: MonMotDePasseSuperSecretCette convention permet de voir les noms des variables sensibles sans exposer leurs valeurs, et de faire des git diff significatifs sur vars.yml.
Ansible Vault en CI/CD
# GitLab CI : stocker le mot de passe dans une variable CI/CD protégée
# Variable : ANSIBLE_VAULT_PASSWORD
# Dans .gitlab-ci.yml :
deploy:
script:
- echo "$ANSIBLE_VAULT_PASSWORD" > .vault_pass
- chmod 600 .vault_pass
- ansible-playbook -i inventory/prod/ playbooks/site.yml
--vault-password-file .vault_pass
after_script:
- rm -f .vault_passAlternativement, des outils comme HashiCorp Vault ou AWS Secrets Manager peuvent être utilisés comme source de secrets via des plugins de lookup, évitant complètement de stocker des secrets dans le dépôt.