#jinja2: comment_start_string:'{=#', comment_end_string:'#=}' #!/bin/bash # GENERE par Set-OPS (role serveur_nginx). Ne pas editer a la main. # # SONDE « edge » — l'edge ecoute, sa configuration tient, et ce qu'il publie REPOND # # Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2. # Mise en defaut PAR PARAMETRE : `serveur_nginx_sonde_ports` (port qui n'ecoute pas). set -uo pipefail PORTS="{{ serveur_nginx_sonde_ports }}" systemctl is-active --quiet nginx || { echo "L'edge (nginx) n'est pas actif."; exit 2; } # LA CONFIGURATION SUR DISQUE, PAS SEULEMENT CELLE EN MEMOIRE. nginx garde la derniere # configuration VALIDE et continue de servir ; une configuration cassee ne se voit qu'au # prochain redemarrage — c'est-a-dire au pire moment, souvent des mois plus tard. nginx -t >/dev/null 2>&1 \ || { echo "L'edge sert, mais sa configuration sur disque est INVALIDE : le prochain demarrage echouera."; exit 2; } manquants=() for p in ${PORTS}; do ss -ltn 2>/dev/null | grep -qE "[:.]${p}[[:space:]]" || manquants+=("${p}") done if (( ${#manquants[@]} > 0 )); then echo "L'edge n'ecoute pas sur : ${manquants[*]} — ce qui est publie derriere est injoignable." exit 2 fi # CE QUI EST PUBLIE REPOND-IL ? (2026-09-28) Ecouter n'est pas servir : un service publie # dont l'amont est tombe rend 502, et l'edge reste « valide, a l'ecoute ». On interroge chaque # exposition EN LOCAL — son nom et son SNI, vers 127.0.0.1 — : on teste ce que l'EDGE sert, # sans dependre de la resolution de qui que ce soit. `-k` : le certificat est l'affaire de la # sonde `certificat` ; ici, la question est la reponse. Une redirection (302 vers la # connexion) est une reponse saine ; un 5xx ou un silence ne l'est pas. {=# LE MEME FILTRE QUE LES VHOSTS (`expositions.conf.j2`) : un hote connu, une adresse, un port. Une exposition sans port web (`dns`, `pki`, `sauvegarde` au site) n'a pas de vhost : l'attendre ici faisait crier la sonde pour trois noms que l'edge ne publie pas. #=} {% set publiees = [] %} {% for expo in serveur_nginx_expositions | default([]) %} {% if expo.hote in hostvars and hostvars[expo.hote].ansible_host is defined and expo.port %} {% set _ = publiees.append(expo.fqdn) %} {% endif %} {% endfor %} EXPOSITIONS="{{ publiees | unique | sort | join(' ') }}" en_defaut=(); servies=0 for n in ${EXPOSITIONS}; do code=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 8 --resolve "${n}:443:127.0.0.1" "https://${n}/" 2>/dev/null) if [[ "${code}" =~ ^[234][0-9][0-9]$ ]]; then servies=$((servies + 1)); else en_defaut+=("${n}=${code:-000}"); fi done perf="| expositions=${servies};;;0; en_defaut=${#en_defaut[@]}" if (( ${#en_defaut[@]} > 0 )); then echo "L'edge ecoute, mais des expositions ne sont PAS servies : ${en_defaut[*]} (000 = silence, 5xx = amont en defaut). ${perf}" exit 2 fi echo "Edge : configuration valide, ecoute sur ${PORTS}, ${servies} exposition(s) servie(s). ${perf}"