Repo playbook – Routines opérationnelles d'un WordPress dockerisé. Ce repo est indépendant du rôle. Il l'installe via
requirements.yml.
┌─────────────────────────────────────────────────────────────────┐
│ ansible-role-wordpress-ops (repo rôle – réutilisable) │
│ ── defaults/ handlers/ tasks/ templates/ vars/ meta/ │
└─────────────────────────────┬───────────────────────────────────┘
│ référencé dans requirements.yml
▼
┌─────────────────────────────────────────────────────────────────┐
│ ansible-playbook-wordpress-ops (ce repo – spécifique env) │
│ ── site.yml │
│ ── requirements.yml │
│ ── ansible.cfg │
│ ── inventory/ │
│ ├── hosts.yml ← hosts et groupes │
│ └── group_vars/ │
│ ├── all.yml ← vars communes │
│ ├── wordpress_servers.yml ← vars du groupe │
│ └── vault.yml ← secrets chiffrés (ansible-vault)│
└─────────────────────────────────────────────────────────────────┘
all
└── wordpress_servers
├── prod
│ └── wp-prod-01 (1.2.3.4) s3_prefix: wordpress/prod
└── staging
└── wp-staging-01 (5.6.7.8) s3_prefix: wordpress/staging
git clone https://github.com/votre-org/ansible-playbook-wordpress-ops.git
cd ansible-playbook-wordpress-ops# Installer le rôle dans roles/ (depuis roles/requirements.yml)
ansible-galaxy install -r roles/requirements.yml -p roles/
# Installer les collections (depuis requirements.yml racine)
ansible-galaxy collection install -r requirements.yml# Créer le fichier vault directement
cat > inventory/group_vars/vault.yml << 'EOF'
---
# Correspondent aux variables MYSQL_* du fichier .env Docker
vault_mysql_user: "wordpress"
vault_mysql_password: "wordpress"
vault_mysql_root_password: "wordpress"
vault_mysql_database: "wordpress"
# Credentials AWS (laisser vide si IAM Role EC2)
vault_aws_access_key: ""
vault_aws_secret_key: ""
EOF
# Chiffrer le fichier
ansible-vault encrypt inventory/group_vars/vault.yml
# Stocker le mot de passe vault localement (jamais commité)
echo "votre_mot_de_passe_vault" > .vault_pass
chmod 600 .vault_passvi inventory/hosts.yml # Renseigner les IPs
vi inventory/group_vars/wordpress_servers.yml # Adapter s3_bucket, région, etc.┌──────────────────────────────────────────────────────────────────┐
│ repo-docker/ │
│ ├── docker-compose.yml → ${MYSQL_PASSWORD} (référence) │
│ ├── .env.example → template vide (commité ✅) │
│ └── .env → valeurs réelles (jamais commité ❌) │
│ │ │
│ │ mêmes valeurs │
│ ▼ │
│ repo-playbook/ │
│ └── inventory/group_vars/ │
│ ├── vault.yml → chiffré ansible-vault (commité ✅) │
│ └── wordpress_servers.yml → db_password: "{{ vault_* }}" │
└──────────────────────────────────────────────────────────────────┘
Règle fondamentale : les mots de passe ne doivent apparaître qu'à deux endroits :
.env(Docker) → sur le serveur, jamais dans gitvault.yml(Ansible) → dans git mais chiffré
Fichier .env Docker |
Fichier vault.yml Ansible |
Variable du rôle |
|---|---|---|
MYSQL_DATABASE |
vault_mysql_database |
db_name |
MYSQL_USER |
vault_mysql_user |
db_user |
MYSQL_PASSWORD |
vault_mysql_password |
db_password |
MYSQL_ROOT_PASSWORD |
vault_mysql_root_password |
db_root_password |
# Voir le contenu déchiffré
ansible-vault view inventory/group_vars/vault.yml --vault-password-file .vault_pass
# Éditer les secrets
ansible-vault edit inventory/group_vars/vault.yml --vault-password-file .vault_pass
# Changer le mot de passe du vault
ansible-vault rekey inventory/group_vars/vault.yml
# Déchiffrer temporairement (⚠️ à éviter en prod)
ansible-vault decrypt inventory/group_vars/vault.yml| Fichier | Dans git ? | Pourquoi |
|---|---|---|
inventory/group_vars/vault.yml |
✅ oui | chiffré par ansible-vault |
inventory/group_vars/wordpress_servers.yml |
✅ oui | pas de secrets (que des {{ vault_* }}) |
.vault_pass |
❌ jamais | mot de passe du vault en clair |
roles/wordpress_ops/ |
❌ ignoré | installé par ansible-galaxy |
backup_db ──► dump MySQL local ──► s3://bucket/wordpress/database/db_YYYY-MM-DD_HHMMSS.sql
backup_files ──► archive tar.gz local ──► s3://bucket/wordpress/files/files_YYYY-MM-DD_HHMMSS.tar.gz
(+ dump DB via handler, uploadé aussi)
Pour activer l'upload S3 :
# inventory/group_vars/wordpress_servers.yml
s3_enabled: true
s3_bucket: "mon-bucket-wordpress-backup"
s3_region: "eu-east-1"Légende
--vault-password-file .vault_pass: déchiffre les secrets automatiquement--limit prod: limite l'exécution au groupeprod(oustaging, ou un host précis)-e "var=val": surcharger une variable au runtime
# Backup DB sur TOUS les serveurs WordPress
ansible-playbook site.yml \
--tags backup_db \
--vault-password-file .vault_pass
# Backup DB uniquement sur prod
ansible-playbook site.yml \
--tags backup_db \
--limit prod \
--vault-password-file .vault_pass
# Backup DB sur staging
ansible-playbook site.yml \
--tags backup_db \
--limit staging \
--vault-password-file .vault_pass
# Backup DB sur un seul host
ansible-playbook site.yml \
--tags backup_db \
--limit wp-prod-01 \
--vault-password-file .vault_pass
# Backup DB SANS upload S3 (même si s3_enabled: true dans group_vars)
ansible-playbook site.yml \
--tags backup_db \
--limit prod \
-e "s3_enabled=false" \
--vault-password-file .vault_pass
# Backup DB avec rétention personnalisée
ansible-playbook site.yml \
--tags backup_db \
--limit prod \
-e "backup_retention_days=30" \
--vault-password-file .vault_passLe backup DB est déclenché automatiquement en amont via le handler. Les deux fichiers (DB + fichiers) sont uploadés sur S3.
# Backup fichiers (+ DB via handler) sur prod
ansible-playbook site.yml \
--tags backup_files \
--limit prod \
--vault-password-file .vault_pass
# Backup fichiers sur staging
ansible-playbook site.yml \
--tags backup_files \
--limit staging \
--vault-password-file .vault_pass
# Backup fichiers avec répertoire de backup personnalisé
ansible-playbook site.yml \
--tags backup_files \
--limit prod \
-e "backup_base_dir=/mnt/data/backups" \
--vault-password-file .vault_passRequiert :
restore_db_file(chemin absolu vers le .sql sur le host cible)
# Restaurer la DB depuis un fichier local sur le serveur
ansible-playbook site.yml \
--tags restore_db \
--limit prod \
-e "restore_db_file=/opt/backups/wordpress/database/db_2024-01-15_120000.sql" \
--vault-password-file .vault_pass
# Restaurer la DB depuis un backup S3 (télécharger d'abord manuellement)
# Étape 1 : télécharger depuis S3 sur le serveur cible
ssh [email protected] "aws s3 cp s3://mon-bucket/wordpress/database/db_2024-01-15_120000.sql /tmp/"
# Étape 2 : lancer la restauration
ansible-playbook site.yml \
--tags restore_db \
--limit prod \
-e "restore_db_file=/tmp/db_2024-01-15_120000.sql" \
--vault-password-file .vault_passRequiert les deux :
restore_files_archiveETrestore_db_fileLa DB est restaurée automatiquement en amont via le handler.
# Restauration complète (fichiers + DB via handler)
ansible-playbook site.yml \
--tags restore_files \
--limit prod \
-e "restore_files_archive=/opt/backups/wordpress/files/files_2024-01-15_120000.tar.gz" \
-e "restore_db_file=/opt/backups/wordpress/database/db_2024-01-15_120000.sql" \
--vault-password-file .vault_pass
# Restauration sur staging depuis des fichiers S3 (après téléchargement)
ansible-playbook site.yml \
--tags restore_files \
--limit staging \
-e "restore_files_archive=/tmp/files_2024-01-15_120000.tar.gz" \
-e "restore_db_file=/tmp/db_2024-01-15_120000.sql" \
--vault-password-file .vault_pass# Installer la dernière version disponible
ansible-playbook site.yml \
--tags install_plugin \
--limit prod \
-e "plugin_install_name=woocommerce" \
--vault-password-file .vault_pass
# Installer une version précise
ansible-playbook site.yml \
--tags install_plugin \
--limit prod \
-e "plugin_install_name=woocommerce plugin_install_version=8.5.2" \
--vault-password-file .vault_pass
# Installer sur staging uniquement
ansible-playbook site.yml \
--tags install_plugin \
--limit staging \
-e "plugin_install_name=debug-bar plugin_install_version=1.1.7" \
--vault-password-file .vault_passLe plugin est installé mais non activé. Pour l'activer ensuite :
--tags manage_plugin -e "plugin_name=woocommerce plugin_action=activate"
# Activer un plugin sur prod
ansible-playbook site.yml \
--tags manage_plugin \
--limit prod \
-e "plugin_name=woocommerce plugin_action=activate" \
--vault-password-file .vault_pass
# Désactiver un plugin sur prod
ansible-playbook site.yml \
--tags manage_plugin \
--limit prod \
-e "plugin_name=woocommerce plugin_action=deactivate" \
--vault-password-file .vault_pass
# Activer un plugin sur tous les serveurs WordPress
ansible-playbook site.yml \
--tags manage_plugin \
-e "plugin_name=akismet plugin_action=activate" \
--vault-password-file .vault_pass
# Activer sur staging uniquement
ansible-playbook site.yml \
--tags manage_plugin \
--limit staging \
-e "plugin_name=debug-bar plugin_action=activate" \
--vault-password-file .vault_passDésactive automatiquement le plugin s'il est actif avant de le supprimer.
# Désinstaller un plugin sur prod
ansible-playbook site.yml \
--tags uninstall_plugin \
--limit prod \
-e "plugin_name=woocommerce" \
--vault-password-file .vault_pass
# Désinstaller sur staging
ansible-playbook site.yml \
--tags uninstall_plugin \
--limit staging \
-e "plugin_name=debug-bar" \
--vault-password-file .vault_pass# Avec la liste définie dans group_vars/wordpress_servers.yml
ansible-playbook site.yml \
--tags update_plugins \
--limit prod \
--vault-password-file .vault_pass
# Avec la liste passée directement en CLI (sans toucher group_vars)
ansible-playbook site.yml \
--tags update_plugins \
--limit prod \
-e '{"plugins_to_update":[{"name":"woocommerce","version":"8.5.2"},{"name":"yoast-seo","version":"22.1"}]}' \
--vault-password-file .vault_passPour définir la liste dans
group_vars/wordpress_servers.yml:plugins_to_update: - name: woocommerce version: "8.5.2" - name: yoast-seo version: "22.1" - name: contact-form-7 version: "5.9.3"
# Nettoyer les backups > 7 jours (valeur par défaut)
ansible-playbook site.yml \
--tags cleanup \
--limit prod \
--vault-password-file .vault_pass
# Nettoyer avec rétention personnalisée (3 jours)
ansible-playbook site.yml \
--tags cleanup \
--limit prod \
-e "backup_retention_days=3" \
--vault-password-file .vault_pass
# Nettoyer sur tous les serveurs
ansible-playbook site.yml \
--tags cleanup \
--vault-password-file .vault_pass# Lister les tâches sans les exécuter
ansible-playbook site.yml --tags backup_db --list-tasks
# Lister les hosts ciblés sans exécuter
ansible-playbook site.yml --tags backup_db --limit prod --list-hosts
# Vérifier la syntaxe du playbook
ansible-playbook site.yml --syntax-check
# Exécution en mode verbeux (voir les détails)
ansible-playbook site.yml --tags backup_db --limit prod -vvv \
--vault-password-file .vault_pass
# Tester la connectivité aux serveurs
ansible wordpress_servers -m ping --vault-password-file .vault_pass
# Voir les variables résolues pour un host
ansible wp-prod-01 -m debug -a "var=hostvars[inventory_hostname]" \
--vault-password-file .vault_pass# Mettre à jour vers la dernière version du rôle
ansible-galaxy install -r roles/requirements.yml -p roles/ --force
# Mettre à jour vers une version spécifique
# → Modifier roles/requirements.yml : version: v1.2.0
# → Puis :
ansible-galaxy install -r roles/requirements.yml -p roles/ --forceansible-playbook-wordpress-ops/
├── site.yml ← Playbook principal
├── requirements.yml ← Collections Ansible (community.docker, amazon.aws)
├── ansible.cfg ← Configuration Ansible (roles_path = roles/)
├── .gitignore ← Exclut roles/* sauf roles/requirements.yml
├── .vault_pass ← NE PAS COMMITER (dans .gitignore)
├── roles/
│ ├── requirements.yml ← Déclare le rôle wordpress_ops (Git)
│ └── wordpress_ops/ ← Installé par ansible-galaxy (ignoré par git)
└── inventory/
├── hosts.yml ← Hosts et groupes (prod, staging)
└── group_vars/
├── all.yml ← Variables communes
├── wordpress_servers.yml ← Variables du groupe (S3, Docker, plugins…)
└── vault.yml ← Secrets chiffrés (ansible-vault)