8.1 : Ansible Vault : chiffrer un fichier ou une variable

On l’a promis en 7.1 : le moment est venu de traiter proprement les mots de passe. Jusqu’ici, chaque fois qu’on a mentionné une valeur sensible (le mot de passe root MariaDB du lab découverte, ou le hash de mot de passe d’un compte en 7.1), on l’a laissée en clair dans le playbook. En dehors d’un lab de formation, c’est une faute grave : un playbook versionné dans Git avec un mot de passe en clair, c’est un secret qui traîne dans tout l’historique du dépôt, accessible à quiconque y a accès, pour toujours.

Ansible Vault résout ça : il chiffre tout ou partie d’un fichier, qui ne redevient lisible qu’avec un mot de passe (ou une clé) que vous seul détenez.

Chiffrer un fichier entier

Imaginons un fichier group_vars/databases.yml qui contient le mot de passe root de MariaDB :

# group_vars/databases.yml
mysql_root_password: SuperRoot123!

On le chiffre avec ansible-vault :

ansible-vault encrypt group_vars/databases.yml

Ansible demande un mot de passe de chiffrement (à ne surtout pas oublier), puis transforme le fichier en un bloc illisible :

$ANSIBLE_VAULT;1.1;AES256
66386439653236336462626566653063336164663966303231363934653561363864363633623766
3562633465356563326330313837623461373966336366350a626438346336353564383562303734
...

Ce fichier peut désormais être commité dans Git sans risque : personne ne peut en extraire SuperRoot123! sans le mot de passe du Vault.

Utiliser un playbook avec un fichier chiffré

Rien ne change dans le playbook lui-même : mysql_root_password reste utilisable exactement comme avant. La différence se joue uniquement à l’exécution, où Ansible a besoin du mot de passe pour déchiffrer temporairement le fichier en mémoire :

ansible-playbook playbook_mariadb.yaml -i inventaire.yaml --ask-vault-pass

--ask-vault-pass demande le mot de passe de façon interactive, à chaque exécution.

Voir ou modifier un fichier chiffré

Deux commandes essentielles au quotidien :

# Afficher le contenu déchiffré, sans le modifier
ansible-vault view group_vars/databases.yml

# Ouvrir le fichier en édition (déchiffré le temps de l'édition, rechiffré à la sauvegarde)
ansible-vault edit group_vars/databases.yml

⚠️ Ne jamais déchiffrer un fichier « à la main » avec ansible-vault decrypt pour l’éditer, puis oublier de le rechiffrer avant de committer dans Git. ansible-vault edit évite complètement ce risque en gérant le cycle chiffrement/déchiffrement pour vous.

Chiffrer une seule variable, pas tout le fichier

Chiffrer un fichier entier est parfois excessif : si group_vars/databases.yml contient dix variables et qu’une seule est sensible, chiffrer tout le fichier rend illisible des informations qui n’avaient pourtant rien de secret (comme mysql_port: 3306).

ansible-vault encrypt_string permet de ne chiffrer qu’une valeur précise :

ansible-vault encrypt_string 'SuperRoot123!' --name 'mysql_root_password'
mysql_root_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66386439653236336462626566653063336164663966303231363934653561...

Ce bloc se colle directement dans un fichier group_vars en clair, mélangé à d’autres variables non sensibles :

# group_vars/databases.yml
mysql_port: 3306
mysql_root_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66386439653236336462626566653063336164663966303231363934653561...

Le reste du fichier reste parfaitement lisible en clair — seule la ligne sensible est protégée.

Reprendre le mot de passe hashé de la section 7

Rappelez-vous la leçon 7.1, où on générait un hash de mot de passe directement en clair dans le playbook :

password: "{{ 'MonMotDePasse123!' | password_hash('sha512') }}"

Avec Vault, cette même logique devient enfin utilisable sereinement en production :

ansible-vault encrypt_string 'MonMotDePasse123!' --name 'alice_password_clair'
# host_vars/nrd-web1.yml (ou group_vars, selon le besoin)
alice_password_clair: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66386439653236336462626566653063336164663966303231363934653561...
- name: Créer le compte avec mot de passe vaulté
  ansible.builtin.user:
    name: alice
    password: "{{ alice_password_clair | password_hash('sha512') }}"

Ce qu’il faut retenir

  • ansible-vault encrypt chiffre un fichier entier ; encrypt_string ne chiffre qu’une variable précise.
  • ansible-vault edit/view gèrent le cycle chiffrement/déchiffrement automatiquement — jamais de decrypt manuel qu’on pourrait oublier de rechiffrer.
  • Un fichier ou une variable chiffrée peut être commitée dans Git sans risque, tant que le mot de passe du Vault reste secret.
  • --ask-vault-pass est nécessaire à chaque exécution d’un playbook qui dépend d’une valeur vaultée.

Dans la prochaine leçon, on va plus loin sur l’utilisation pratique : jongler avec plusieurs mots de passe Vault (dev/prod), et éviter d’avoir à le retaper à chaque exécution.