From 40b38467e8758c02425c3f95dea679eaa16e7f73 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Mon, 28 Sep 2026 16:23:40 -0400 Subject: [PATCH] sonde disque : espace et inodes de chaque systeme de fichiers, sur tout noeud Seuls le cache apt et les depots de sauvegarde etaient surveilles. Declaree par serveur_debian, posee par client_sante (pas par common_packages, qui ferait un upgrade full de la flotte pour deposer un script). Seuils 80/90 pourcent. Co-Authored-By: Claude Opus 5.5 --- roles/client_sante/defaults/main.yml | 6 +++ roles/client_sante/tasks/main.yml | 21 ++++++++ .../client_sante/templates/sonde-disque.sh.j2 | 52 +++++++++++++++++++ roles/serveur_debian/meta/supervision.yml | 8 +++ 4 files changed, 87 insertions(+) create mode 100644 roles/client_sante/templates/sonde-disque.sh.j2 diff --git a/roles/client_sante/defaults/main.yml b/roles/client_sante/defaults/main.yml index d551634..21e2a0a 100644 --- a/roles/client_sante/defaults/main.yml +++ b/roles/client_sante/defaults/main.yml @@ -63,3 +63,9 @@ client_sante_delai_sonde: 20 client_sante_paquets: - curl - monitoring-plugins-basic + +# LA SONDE « disque » (2026-09-28) — pourcentage UTILISE, pour l'espace comme pour les +# inodes. Mesure le jour de sa pose : au plus 22 % d'espace et 7 % d'inodes sur les 35 +# machines ; ces seuils laissent donc voir une croissance longtemps avant la panne. +client_sante_disque_avert: 80 +client_sante_disque_crit: 90 diff --git a/roles/client_sante/tasks/main.yml b/roles/client_sante/tasks/main.yml index 67e8f6c..67b3000 100644 --- a/roles/client_sante/tasks/main.yml +++ b/roles/client_sante/tasks/main.yml @@ -142,6 +142,27 @@ {{ group_names | map('extract', client_sante_registre) | select('defined') | select('sequence') | flatten | map(attribute='nom') | list }} +# LA SONDE « disque » EST POSEE ICI, PAS PAR `common_packages` (2026-09-28). Elle est +# DECLAREE par `serveur_debian` — tout hote la porte — comme `correctifs`. Mais +# `common_packages` fait un `upgrade: full` a chaque passage : la poser par lui aurait +# impose une mise a jour de toute la flotte pour deposer un script. Ce role-ci execute +# deja les sondes, et se redeploie sans toucher au systeme. +- name: Assurer le repertoire des sondes + ansible.builtin.file: + path: /usr/local/lib/setops/sondes + state: directory + owner: root + group: root + mode: "0755" + +- name: Deposer la sonde de l'espace disque + ansible.builtin.template: + src: sonde-disque.sh.j2 + dest: /usr/local/lib/setops/sondes/disque.sh + owner: root + group: root + mode: "0750" + - name: Relever les sondes reellement posees ansible.builtin.find: paths: "{{ client_sante_repertoire_sondes | default('/usr/local/lib/setops/sondes') }}" diff --git a/roles/client_sante/templates/sonde-disque.sh.j2 b/roles/client_sante/templates/sonde-disque.sh.j2 new file mode 100644 index 0000000..cc15b2d --- /dev/null +++ b/roles/client_sante/templates/sonde-disque.sh.j2 @@ -0,0 +1,52 @@ +#!/bin/bash +# GENERE par Set-OPS (role client_sante). Ne pas editer a la main. +# +# SONDE « disque » — reste-t-il de la place, et des inodes, sur chaque systeme de fichiers ? +# +# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. +# Seuils : `client_sante_disque_avert` / `client_sante_disque_crit` (pourcentage utilise), +# les memes pour l'espace et pour les inodes. +# +# POURQUOI ELLE MANQUAIT (2026-09-28). Seuls les volumes du cache apt et des depots de +# sauvegarde etaient surveilles. Rien ne regardait le disque de la base, des boites, de +# Nextcloud, ni de Loki qui grossit chaque jour. Prometheus collecte bien l'occupation, +# mais aucune regle n'en fait une alerte : un disque plein arretait la base ou le courriel +# sans rien dire avant. Les INODES aussi : une file de courriel ou un cache de petits +# fichiers les epuise avec la moitie de l'espace libre, et le message d'erreur parle alors +# d'un disque « plein » qu'un `df` dit a moitie vide. +set -uo pipefail + +AVERT={{ client_sante_disque_avert }} +CRIT={{ client_sante_disque_crit }} +# Pas les pseudo-systemes : ils se remplissent et se vident par nature. +EXCLUS=(-x tmpfs -x devtmpfs -x squashfs -x overlay -x efivarfs) + +pire=0; pire_quoi=""; perf="" +lire() { # $1 = espace|inodes, puis la sortie de df -P[i] + local genre=$1 ligne pct mp + while read -r ligne; do + pct=$(awk '{print $5}' <<<"${ligne}" | tr -d '%') + mp=$(awk '{print $6}' <<<"${ligne}") + [[ "${pct}" =~ ^[0-9]+$ ]] || continue # `-` : pas d'inodes sur ce type + local etiq=${mp#/}; etiq=${etiq//\//_}; etiq=${etiq:-racine} + perf+="${genre}_${etiq}=${pct}%;${AVERT};${CRIT};0;100 " + if (( pct > pire )); then pire=${pct}; pire_quoi="${mp} (${genre}) a ${pct} %"; fi + done +} +lire espace < <(df -P "${EXCLUS[@]}" 2>/dev/null | tail -n +2) +lire inodes < <(df -Pi "${EXCLUS[@]}" 2>/dev/null | tail -n +2) + +if [[ -z "${pire_quoi}" ]]; then + echo "Aucun systeme de fichiers lisible par df." + exit 3 +fi +if (( pire >= CRIT )); then + echo "DISQUE CRITIQUE : ${pire_quoi} (seuil ${CRIT} %). | ${perf}" + exit 2 +fi +if (( pire >= AVERT )); then + echo "Disque en tension : ${pire_quoi} (seuil ${AVERT} %). | ${perf}" + exit 1 +fi +echo "Place suffisante : le plus rempli est ${pire_quoi}. | ${perf}" +exit 0 diff --git a/roles/serveur_debian/meta/supervision.yml b/roles/serveur_debian/meta/supervision.yml index fb2a153..ad3843e 100644 --- a/roles/serveur_debian/meta/supervision.yml +++ b/roles/serveur_debian/meta/supervision.yml @@ -26,6 +26,14 @@ # COMBIEN DE TEMPS. Le retard seul ne dit rien — c'est sa DUREE qui transforme un # correctif publie en exposition acceptee. sondes: + # POSEE PAR `client_sante` (voir ses taches) : la poser par `common_packages` aurait + # impose un `upgrade: full` de toute la flotte pour deposer un script. + - nom: disque + ttl: 5400 + raison: >- + Reste-t-il de la place, et des inodes, sur chaque systeme de fichiers ? Seuls le + cache apt et les depots de sauvegarde etaient surveilles : un disque plein arretait + la base ou le courriel sans prevenir. - nom: correctifs ttl: 5400 raison: >-