Skip to content

eazytraining/ansible-playbook-wordpress-ops

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ansible-playbook-wordpress-ops

Repo playbook – Routines opérationnelles d'un WordPress dockerisé. Ce repo est indépendant du rôle. Il l'installe via requirements.yml.


Architecture – 2 repos séparés

┌─────────────────────────────────────────────────────────────────┐
│  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)│
└─────────────────────────────────────────────────────────────────┘

Groupes et hosts (inventory/hosts.yml)

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

Installation & premier lancement

1. Cloner ce repo

git clone https://github.com/votre-org/ansible-playbook-wordpress-ops.git
cd ansible-playbook-wordpress-ops

2. Installer le rôle et les collections

# 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

3. Configurer le vault (secrets)

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

4. Adapter l'inventaire

vi inventory/hosts.yml                         # Renseigner les IPs
vi inventory/group_vars/wordpress_servers.yml  # Adapter s3_bucket, région, etc.

Gestion des informations sensibles

Vue d'ensemble – où vivent les secrets

┌──────────────────────────────────────────────────────────────────┐
│  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 git
  • vault.yml (Ansible) → dans git mais chiffré

Correspondance des variables

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

Commandes vault du quotidien

# 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

Ce qui est commité vs ignoré

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

Flux S3 – Comment ça marche

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"

Commandes par routine

Légende

  • --vault-password-file .vault_pass : déchiffre les secrets automatiquement
  • --limit prod : limite l'exécution au groupe prod (ou staging, ou un host précis)
  • -e "var=val" : surcharger une variable au runtime

🗄️ Routine 1 – Backup de la base de données

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

📁 Routine 2 – Backup des fichiers du site

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

🔄 Routine 3 – Restauration de la base de données

Requiert : 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_pass

🔄 Routine 4 – Restauration des fichiers du site

Requiert les deux : restore_files_archive ET restore_db_file La 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

📦 Routine 5 – Installation d'un plugin (sans activation)

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

Le plugin est installé mais non activé. Pour l'activer ensuite : --tags manage_plugin -e "plugin_name=woocommerce plugin_action=activate"


🔧 Routine 6 – Activation / désactivation d'un plugin

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

🗑️ Routine 7 – Désinstallation d'un plugin

Dé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

🔄 Routine 8 – Mise à jour ciblée de plugins (avec version)

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

Pour 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"

🧹 Routine 9 – Nettoyage des anciens backups

# 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

Commandes utiles pour déboguer

# 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

Mise à jour du rôle

# 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/ --force

Structure du repo

ansible-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)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors