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.
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.
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.
db dans l'inventaire (au moins un serveur) :
# inventories/dev/inventory.yml
all:
children:
db:
hosts:
dev-lab:
ansible_host: < votre IP >
ansible-galaxy collection install community.mysql
mysqlDepuis la racine de votre projet ansible/ :
mkdir -p roles/mysql/{tasks,handlers,defaults,templates}
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)
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.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.
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
...
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.
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 commiter ~/.vault_pass dans Git. Ajoutez-le immédiatement à votre .gitignore.
ansible db -m shell -a "systemctl is-active mysql"
# attendu : active
ssh admin@< votre IP >
mysql -u admin -p -e "SHOW DATABASES;"
test1 doit apparaître dans la liste affichée.bind-address dans /etc/mysql/mysql.conf.d/mysqld.cnf).mysqldump + cron).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.