Passer au contenu principal

Production (Ansible)

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.yml

encrypt_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.yml

Multiple 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_staging

Convention 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: MonMotDePasseSuperSecret

Cette 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_pass

Alternativement, 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.