Automatisation complète, avec Ansible, du déploiement de deux services sur des machines virtuelles Linux :
- un serveur web Apache2 en HTTPS (certificat autosigné, redirection HTTP → HTTPS) sur Ubuntu Server ;
- un serveur GLPI (gestion de parc et helpdesk) avec PHP et MariaDB sur AlmaLinux ;
- un playbook de mises à jour qui fonctionne sur toutes les distributions (apt ou dnf selon l'OS).
Aucune intervention manuelle n'est nécessaire : chaque playbook installe, configure, puis vérifie lui-même que le service répond.
Projet réalisé dans le cadre de mon programme en réseautique et cybersécurité (CÉGEP de Saint-Hyacinthe).
Toutes les VM sont sur un réseau NAT.
| Machine | OS | Rôle |
|---|---|---|
| Nœud de contrôle | Ubuntu Desktop | Ansible installé, lance les playbooks via SSH |
apache01 |
Ubuntu Server | Apache2 + HTTPS |
glpi01 |
AlmaLinux | Apache (httpd) + PHP + MariaDB + GLPI |
┌──────────────────────────┐
│ Ubuntu Desktop (Ansible)│
└────────────┬─────────────┘
SSH │ (clé)
┌───────────────┴───────────────┐
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ apache01 │ │ glpi01 │
│ Ubuntu Server │ │ AlmaLinux │
│ Apache2 :443 │ │ httpd :80 │
│ (80 → 443) │ │ PHP + MariaDB │
└─────────────────┘ └─────────────────┘
.
├── ansible.cfg
├── hosts.ini # inventaire : groupes [https] et [glpi]
├── requirements.yml # collection community.mysql
├── playbooks/
│ ├── https.yml # applique le rôle apache_https
│ ├── glpi.yml # applique le rôle glpi
│ └── update.yml # met à jour tous les serveurs (apt / dnf)
├── roles/
│ ├── apache_https/
│ │ ├── tasks/main.yml
│ │ ├── handlers/main.yml
│ │ ├── templates/vhost.conf.j2
│ │ └── files/index.html
│ └── glpi/
│ ├── defaults/main.yml # version GLPI, nom de la base, utilisateur
│ ├── tasks/main.yml
│ ├── handlers/main.yml
│ └── templates/
│ ├── glpi.conf.j2
│ └── config_db.php.j2
└── docs/
├── NOTES.md # explication bloc par bloc
└── captures/
- Installe
apache2,openssl,ssl-cert. - Active les modules
ssletheaders. - Génère un certificat autosigné RSA 2048 valide 1 an (Let's Encrypt est impossible : la VM est en NAT, donc injoignable depuis Internet).
- Crée le DocumentRoot et copie la page
index.html. - Déploie le VirtualHost à partir d'un template Jinja2 : port 443 en HTTPS + port 80 qui redirige tout vers HTTPS.
- Active le site, désactive le site par défaut, redémarre Apache via un handler.
- Valide automatiquement : HTTPS répond
200, HTTP répond301.
- Installe httpd, MariaDB, PHP et ses extensions (
dnf). - Démarre et active les services au boot.
- Crée la base
glpi(utf8) et l'utilisateur dédié (community.mysql). - Télécharge et décompresse GLPI (seulement s'il n'est pas déjà présent).
- Donne les droits à l'utilisateur
apacheet corrige les permissions (755 dossiers / 644 fichiers). - Déploie le VirtualHost (
AllowOverride Allpour les.htaccessde GLPI). - Génère
config_db.phpà partir d'un template. - Initialise la base en CLI :
php bin/console db:install --no-interaction. - Valide que GLPI répond.
Détecte la famille d'OS (ansible_os_family) : apt pour Debian/Ubuntu, dnf pour RHEL/AlmaLinux. Redémarre seulement si le système l'exige.
# 1. Installer la collection nécessaire
ansible-galaxy collection install -r requirements.yml
# 2. Vérifier la connexion SSH
ansible all -m ping
ansible all -a "ip a"
# 3. Déployer
ansible-playbook playbooks/https.yml --ask-become-pass
ansible-playbook playbooks/glpi.yml --ask-become-pass -e glpi_db_password='MotDePasseFort'
# 4. Mettre à jour tous les serveurs
ansible-playbook playbooks/update.yml --ask-become-passLe mot de passe de la base n'est pas stocké dans le dépôt : il se passe avec -e ou se chiffre avec ansible-vault.
Les playbooks sont idempotents : on peut les relancer autant de fois qu'on veut, Ansible ne refait que ce qui manque (state: present, creates:, handlers).
| Problème | Cause | Solution |
|---|---|---|
| GLPI affichait des erreurs d'écriture (logs, fichiers) | Les fichiers appartenaient à root après l'extraction / l'installation |
owner: apache récursif + permissions 755/644, appliqué aussi après db:install |
| Erreur « access config table » | GLPI ne trouvait pas sa connexion à la base | Générer config/config_db.php via template avant db:install |
| Avertissement utf8mb4 de GLPI | Encodage de la base | Base créée explicitement en utf8 / utf8_unicode_ci |
| Pas de certificat Let's Encrypt possible | VM en NAT, non joignable depuis Internet | Certificat autosigné généré par openssl |
- Organiser un projet Ansible en rôles réutilisables (tasks, templates, handlers, defaults).
- Utiliser des templates Jinja2 pour générer des fichiers de configuration par machine.
- Rendre un playbook idempotent et le faire se valider lui-même.
- Gérer deux familles de distributions (Debian/apt et RHEL/dnf) dans un même inventaire.
- Diagnostiquer des problèmes de permissions Linux et de configuration applicative (GLPI).
- Chiffrer les variables sensibles avec
ansible-vault. - Ajouter une tâche
firewalld(ouvrir 80/443) et gérer les contextes SELinux pour GLPI. - Passer GLPI en HTTPS lui aussi et utiliser le dossier
public/comme DocumentRoot. - Supprimer
install/install.phpaprès l'installation. - Passer la base en
utf8mb4.