Linux

Ansible — Déployer MySQL avec Vault

Installer MySQL Server, créer automatiquement une base et un utilisateur dédiés, sécuriser l'instance et chiffrer le mot de passe avec Ansible Vault.

← Retour aux tutoriels Linux
📚 Ce qu'on va faire

Installer MySQL sur un ou plusieurs serveurs, créer une base de données et un utilisateur dédié — le tout via Ansible. Et surtout : on apprend à stocker le mot de passe MySQL chiffré (avec Ansible Vault) au lieu de le laisser en clair dans le code.

ⓘ C'est quoi Ansible Vault ?

Vault est l'outil intégré à Ansible pour chiffrer des secrets (mots de passe, clés API…). Vous définissez une passphrase une bonne fois, vos secrets sont chiffrés en AES-256, et vous pouvez versionner vos fichiers dans Git sans risque : seul celui qui connaît la passphrase peut les déchiffrer.

⚠ Prérequis
  • Avoir suivi le tuto Ansible — Introduction.
  • Avoir un groupe db dans l'inventaire (au moins un serveur) :
    # inventories/dev/inventory.yml
    all:
      children:
        db:
          hosts:
            dev-lab:
              ansible_host: < votre IP >
  • Installer la collection community.mysql (modules MySQL d'Ansible) :
    ansible-galaxy collection install community.mysql
📚 Documentation officielle

Créer la structure du rôle mysql

Depuis la racine de votre projet ansible/ :

mkdir -p roles/mysql/{tasks,handlers,defaults,templates}

Déclarer les variables par défaut

Fichier roles/mysql/defaults/main.yml. On laisse les valeurs vides : elles seront remplies depuis le playbook au moment de l'exécution. Ça rend le rôle réutilisable pour créer n'importe quelle base.

---
mysql_db_1: ""           # nom de la base à créer
mysql_user_1: ""         # nom de l'utilisateur MySQL
mysql_pass_user_1: ""    # mot de passe (sera chiffré à l'étape 4)

Écrire les tâches du rôle

Fichier roles/mysql/tasks/main.yml. Sept tâches : installer MySQL et son driver Python, le démarrer, créer la base, créer l'utilisateur, et nettoyer les comptes anonymes (sécurité).

---
- name: apt update
  apt:
    update_cache: yes

- name: install mysql
  apt:
    name: mysql-server
    state: present

- name: install pymysql
  apt:
    name: python3-pymysql
    state: present

- name: enable and start mysql
  service:
    name: mysql
    state: started
    enabled: yes

- name: Create databases -{{ mysql_db_1 }}-
  community.mysql.mysql_db:
    name:
      - "{{ mysql_db_1 }}"
    state: present
    login_unix_socket: /run/mysqld/mysqld.sock

- name: Create -{{ mysql_user_1 }}- user with password, all privileges in -{{ mysql_db_1 }}-
  community.mysql.mysql_user:
    state: present
    name: "{{ mysql_user_1 }}"
    password: "{{ mysql_pass_user_1 }}"
    priv:
      "{{ mysql_db_1 }}.*: ALL"
    login_unix_socket: /run/mysqld/mysqld.sock

- name: Removes all anonymous user accounts
  community.mysql.mysql_user:
    name: ''
    host_all: true
    state: absent
    login_unix_socket: /run/mysqld/mysqld.sock

Décryptage des points spécifiques :

  • python3-pymysql — bibliothèque Python nécessaire aux modules MySQL d'Ansible. Sans elle, vous aurez l'erreur « The PyMySQL module is required ».
  • login_unix_socket — permet à Ansible de se connecter à MySQL en local via le socket Unix, sans mot de passe root (l'authentification Linux suffit).
  • {{ variable }} — syntaxe Jinja2 : Ansible remplace par la valeur de la variable au moment de l'exécution.

Chiffrer le mot de passe avec Ansible Vault

On ne veut jamais voir un mot de passe en clair dans un fichier Git. La commande ci-dessous chiffre une chaîne et génère un bloc à coller dans le playbook.

# Le mot de passe en clair est 'changeme' (remplacez-le par le vôtre)
ansible-vault encrypt_string 'changeme' --name 'mysql_pass_user_1'

Ansible vous demande une passphrase (le « mot de passe du coffre », à retenir et ne pas oublier). Résultat :

mysql_pass_user_1: !vault |
      $ANSIBLE_VAULT;1.1;AES256
      37333664323063323666376137323766663737323038373630336662666537623461386635353032
      3038636238633830383463383233373130313231383738340a323936343131316261326434393737
      ...

Copiez tout ce bloc (de mysql_pass_user_1: jusqu'à la dernière ligne hexa) : vous le collerez dans le playbook à l'étape suivante.

Écrire le playbook

Créez le fichier playbooks/deploy_mysql.yml :

---
- name: Deploy mysql Server
  hosts: db
  become: true
  roles:
    - mysql
  vars:
    mysql_db_1: "test1"
    mysql_user_1: "admin"
    # ↓ Collez ici le bloc !vault généré à l'étape 4 (mot de passe : changeme — attention à l'indentation : 6 espaces)
    mysql_pass_user_1: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          37333664323063323666376137323766663737323038373630336662666537623461386635353032
          3038636238633830383463383233373130313231383738340a323936343131316261326434393737
          ...
⚠ Piège d'indentation YAML

Le bloc !vault | doit être indenté de manière cohérente (généralement 6 à 10 espaces selon votre contexte). Si Ansible vous insulte avec « YAML error », c'est presque toujours ça.

Lancer le déploiement

Comme votre playbook contient maintenant un secret chiffré, il faut fournir la passphrase à Ansible :

# Méthode 1 — saisie interactive (recommandé au début)
ansible-playbook playbooks/deploy_mysql.yml --ask-vault-pass

# Méthode 2 — passphrase stockée dans un fichier (pour l'automatisation)
echo "MaPassphraseSecrete" > ~/.vault_pass
chmod 600 ~/.vault_pass
ansible-playbook playbooks/deploy_mysql.yml --vault-password-file ~/.vault_pass
⚠ À ne JAMAIS faire

Ne jamais commiter ~/.vault_pass dans Git. Ajoutez-le immédiatement à votre .gitignore.

Vérifier le résultat

  1. Vérifier que le service MySQL tourne sur chaque cible :
    ansible db -m shell -a "systemctl is-active mysql"
    # attendu : active
  2. Se connecter à MySQL avec l'utilisateur créé (depuis le serveur DB) :
    ssh admin@< votre IP >
    mysql -u admin -p -e "SHOW DATABASES;"
  3. La base test1 doit apparaître dans la liste affichée.
⚠ À faire avant la mise en production
  • Restreindre l'écoute MySQL au réseau local (bind-address dans /etc/mysql/mysql.conf.d/mysqld.cnf).
  • Activer SSL/TLS pour les connexions distantes.
  • Faire des sauvegardes régulières (voir mysqldump + cron).
✓ Bravo, c'est fait !

MySQL tourne sur vos serveurs db, votre base et utilisateur sont créés, et votre mot de passe reste chiffré dans Git grâce à Vault.