#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_dorsal). 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 -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_dorsal_sites_port }} noms=({% for s in serveur_web_dorsal_sites | default([]) %}'{{ s.server_name }}' {% endfor %}) etiquettes=({% for s in serveur_web_dorsal_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