Exercice 08 : Projet Capstone - Automatisation et Supervision avec Bash
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Écrire un script Bash robuste avec
set -euo pipefail, fonctions et arguments - ✅ Extraire et transformer des données avec
awketsed - ✅ Planifier l'exécution automatique de scripts avec
cron - ✅ Créer un service
systemdpersonnalisé qui démarre au boot - ✅ Assembler un système de supervision complet qui surveille des services
Durée estimée : 1h
Difficulté : ⭐⭐⭐⭐⭐ (Expert)
Prérequis :
- Avoir complété les exercices 01 à 07
- Avoir suivi le module Linux Avancé (scripting Bash, awk, sed, cron, systemd)
- Un système Ubuntu/Debian avec accès
sudo
📖 Contexte
Vous êtes ingénieur DevOps dans une startup. L'équipe a besoin d'un système de supervision léger, 100 % ligne de commande, qui :
- Surveille l'état de plusieurs services
- Génère un rapport d'état toutes les heures
- Tourne en tant que service systemd au démarrage
- Enregistre les métriques dans un fichier CSV analysable
📋 Énoncé
Construisez ce système de supervision en 5 tâches. Chaque tâche produit un livrable concret.
🧭 Déroulement de l'exercice
Tâche 1 : Script de surveillance des services
Écrivez /opt/supervision/healthcheck.sh qui :
- Prend en argument une liste de services (
./healthcheck.sh nginx ssh cron) - Pour chaque service, vérifie s'il est actif avec
systemctl is-active - Affiche une ligne CSV :
timestamp,service,status(ex :2026-04-29T10:00:00,nginx,OK) - Ajoute chaque ligne à
/var/log/supervision/services.csv - Retourne un code de sortie non-nul si au moins un service est DOWN
Indice :
date -Isecondsproduit un timestamp ISO 8601.systemctl is-active --quiet serviceretourne 0 si actif. Structurez votre script avecset -euo pipefailet une fonctioncheck_service(). Créez le répertoire de log avecmkdir -psi absent.
Vérification : sudo bash /opt/supervision/healthcheck.sh nginx ssh && echo "Tous OK" doit afficher "Tous OK" et créer /var/log/supervision/services.csv.
Tâche 2 : Analyse du CSV avec awk et sed
Écrivez /opt/supervision/rapport.sh qui lit /var/log/supervision/services.csv et produit :
- Le nombre total de vérifications par service (
awk) - Le nombre de fois où chaque service était DOWN (
awk) - Un affichage nettoyé où
OKest remplacé par✓etDOWNpar✗(sed)
Indice : Le CSV a 3 colonnes séparées par des virgules.
awk -F','définit le séparateur. Pour compter :awk -F',' '{count[$2]++} END {for (s in count) print s, count[s]}'. Poursed:sed 's/,OK$/,✓/' | sed 's/,DOWN$/,✗/'.
Vérification : bash /opt/supervision/rapport.sh doit afficher les statistiques par service et le CSV formaté.
Tâche 3 : Planification avec cron
Configurez cron pour exécuter le healthcheck toutes les 5 minutes en vérifiant nginx, ssh et cron. Redirigez les erreurs vers /var/log/supervision/cron-errors.log.
Indice :
crontab -e(en root, doncsudo crontab -e) ouvre l'éditeur. Une entrée cron toutes les 5 min commence par*/5 * * * *. Redirigez stdout vers/dev/nullet stderr vers le fichier de log :>> /dev/null 2>> /var/log/supervision/cron-errors.log.
Vérification : sudo crontab -l | grep healthcheck doit afficher votre entrée cron.
Tâche 4 : Service systemd personnalisé
Créez un service systemd /etc/systemd/system/supervision.service qui :
- Lance
/opt/supervision/healthcheck.sh nginx ssh cronau démarrage - Se relance automatiquement en cas d'échec (
Restart=on-failure) - S'exécute en tant que
root - Démarre après le réseau (
After=network.target)
Activez et démarrez le service.
Indice : Un fichier unit systemd minimal a 3 sections :
[Unit],[Service]et[Install]. La directiveExecStart=définit la commande.WantedBy=multi-user.targetdans[Install]est le target standard pour les services système. Après création, rechargez systemd avecsystemctl daemon-reload.
Vérification : systemctl status supervision doit afficher "active (running)" ou "active (exited)".
Tâche 5 : Script de rapport quotidien
Écrivez /opt/supervision/rapport-quotidien.sh qui :
- Calcule le taux de disponibilité de chaque service (lignes OK / total lignes × 100)
- Alerte (affichage en rouge dans le terminal) si un service a un taux < 95 %
- Génère un fichier
/tmp/rapport-$(date +%Y%m%d).txtavec le résumé
Indice : Le taux de dispo en awk :
awk -F',' -v service="nginx" '$2==service {total++; if($3=="OK") ok++} END {printf "%.1f%%\n", (ok/total)*100}'. Pour coloriser en rouge dans le terminal :echo -e "\e[31mALERTE : ...\e[0m". La comparaison en bash pour les flottants :awk -v rate="$rate" 'BEGIN {exit (rate >= 95)}'.
Vérification : bash /opt/supervision/rapport-quotidien.sh doit afficher les taux et créer le fichier rapport.
🗂️ Mini-Projet : Système de supervision complet
Assemblez les 5 tâches en validant l'ensemble du système :
# 1. Préparer la structure
sudo mkdir -p /opt/supervision /var/log/supervision
# 2. Générer des données de test (simuler 10 vérifications)
for i in $(seq 1 10); do
sudo bash /opt/supervision/healthcheck.sh nginx ssh cron
sleep 1
done
# 3. Vérifier le CSV
head -5 /var/log/supervision/services.csv
# 4. Lancer l'analyse
bash /opt/supervision/rapport.sh
# 5. Vérifier cron
sudo crontab -l
# 6. Tester le service systemd
systemctl status supervision
# 7. Générer le rapport quotidien
bash /opt/supervision/rapport-quotidien.sh
cat /tmp/rapport-$(date +%Y%m%d).txtCheckpoints de validation :
/opt/supervision/healthcheck.shaccepte des arguments et produit un CSV valide/var/log/supervision/services.csvexiste et contient des lignestimestamp,service,OKbash /opt/supervision/rapport.shaffiche des statistiques par servicesudo crontab -l | grep "*/5"retourne l'entrée cron configuréesystemctl status supervisionaffiche "active"bash /opt/supervision/rapport-quotidien.shcrée/tmp/rapport-$(date +%Y%m%d).txt