Set-OPS-Public/roles/serveur_web_frontal/templates/sonde-sites-servis.sh.j2

58 lines
2.5 KiB
Text
Raw Normal View History

supervision : les huit derniers roles, et deux defauts que l epreuve a trouves Les 33 roles serveur_* declarent maintenant une sonde. Les huit qui manquaient sont ceux dont la verite ne ressemble pas a « ce service repond-il ». Quatre marqueurs du site : ce que tasks/main.yml verifie UNE FOIS au deploiement cesse d etre vrai sans que rien ne tombe. La racine du cache se retrouve chainee, la forge du genome repond en n ayant plus rien dedans, un locataire n est plus admis a resoudre, l isolation d un depot glisse. serveur_ops_site ne sert rien : il detient un pouvoir. La sonde verifie que la carte est la, que la voute du site est chiffree et que sa cle est en 0600 — sans lire le contenu d aucun des trois. serveur_icingaweb2 surveille la vitrine de la supervision elle-meme : si la console meurt, tout reste vert et l exploitant est aveugle. DEFAUT 1 — quatre gabarits qu Ansible aurait refuse de rendre. Jinja lit le {# de ${#tableau[@]} comme un debut de commentaire. Le depot connaissait le remede et l appliquait la ou quelqu un s etait fait prendre, nulle part ailleurs. P76 rend desormais chaque gabarit de role, avec les delimiteurs qu Ansible en tirerait — pas une recherche de motif. DEFAUT 2 — la doctrine promettait 54 greffons et citait check_pgsql. La flotte a monitoring-plugins-basic : 53, sans check_pgsql ni check_dns ni check_ldap. Le paquet qui les porte traine samba et snmp sur chaque machine. Un greffon absent sort en 127, qui n est pas un code Nagios. 21 controles negatifs sur les machines reelles du site. ansible-lint production 0/91, harnais 75 OK. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-14 15:43:52 -04:00
#jinja2: comment_start_string:'{=#', comment_end_string:'#=}'
#!/bin/bash
# (Le gabarit redefinit le delimiteur de commentaire Jinja : `${#tableau[@]}` contient
# la sequence `{#`, que Jinja lirait comme un debut de commentaire. Le shell en a
# besoin ; c'est donc Jinja qui cede. Meme geste que `client_sante/setops-sante.sh.j2`
# et `serveur_nginx/sonde-edge.sh.j2`.)
# GENERE par Set-OPS (role serveur_web_frontal). Ne pas editer a la main.
#
# SONDE « sites-servis » — chacun des sites declares se sert-il encore ?
#
# UNE BOUCLE AUTOUR D'UN GREFFON, PAS UN GREFFON REECRIT. Chaque site est mesure par
# `check_http` — qui gere les delais, les redirections et vingt ans de cas limites. Ce que
# la boucle ajoute est la seule chose que le greffon ne sait pas : la LISTE des sites que
# cet hebergeur doit servir, qui vient du plan.
#
# `-H <server_name> -I 127.0.0.1` : on frappe la machine en boucle locale, mais avec
# l'en-tete `Host` du site. C'est ainsi que nginx choisit son vhost — sans cet en-tete on
# mesurerait le serveur par defaut, c'est-a-dire n'importe quoi d'autre.
set -uo pipefail
PORT={{ serveur_web_frontal_sonde_port }}
noms=({% for s in serveur_web_frontal_sites | default([]) %}'{{ s.server_name }}' {% endfor %})
etiquettes=({% for s in serveur_web_frontal_sites | default([]) %}'{{ s.nom }}' {% endfor %})
if (( ${#noms[@]} == 0 )); then
# PAS UN VERT MUET. Un hebergeur sans site declare est un etat legitime — le dire vaut
# mieux que rendre un succes qui laisserait croire qu'on a verifie quelque chose.
echo "Aucun site declare sur cet hebergeur : rien a servir, rien a verifier."
exit 0
fi
muets=()
for i in "${!noms[@]}"; do
nom=${noms[$i]}
etiquette=${etiquettes[$i]}
sortie=$(/usr/lib/nagios/plugins/check_http -H "${nom}" -I 127.0.0.1 -p "${PORT}" -u / -t 10 2>&1)
code=$?
# LE GREFFON REND PARFOIS DEUX LIGNES — la cause, puis son verdict. Icinga ne
# garde que la premiere pour resume : sans repliage, la moitie du message
# disparait de la vue qu'on regarde en premier.
resume=${sortie%%|*}
resume=${resume//$'\n'/ }
if (( code != 0 )); then
# LE MESSAGE DU GREFFON EST CONSERVE, pas resume. C'est lui qui distingue un 404 d'un
# delai depasse ou d'un socket ferme — et ces trois-la n'appellent pas le meme geste.
muets+=("${etiquette} (${nom}) : ${resume}")
fi
done
if (( ${#muets[@]} > 0 )); then
liste=$(printf '%s; ' "${muets[@]}"); liste=${liste%; }
echo "Site(s) qui ne se servent plus — ${liste}"
exit 2
fi
echo "Sites statiques : ${#noms[@]} servi(s) — ${etiquettes[*]}."
exit 0