Set-OPS-Public/roles/serveur_ops/templates/sonde-runner.sh.j2

52 lines
2.3 KiB
Text
Raw Normal View History

sondes : quatorze, une par role, derivees en objets Icinga boites (dovecot) · cache-apt (artefacts) · certificat (client_pki, 14/14) collaboration (nextcloud) · collecte (prometheus) · file-courriel (postfix) forge (forgejo) · identite (keycloak) · ingestion (loki) · moteur (icinga) resolution (resolveur) · runner (serveur_ops) · tableaux (grafana) voute (ops_tenant) — toutes vertes, sans une ligne ecrite dans Icinga. DEUX PRINCIPES QUE LA PREMIERE SONDE A IMPOSES. Une sonde doit pouvoir etre mise en defaut PAR PARAMETRE : cible et seuils sont des variables du role, on prouve le rouge avec un port ferme ou un seuil impossible, sans rien casser. Et la sonde vit LA OU VIT LA VERITE : « ce noeud est-il collecte ? » appartient a prometheus, pas au client — une seule y voit les N noeuds, et surtout elle voit le cas SILENCIEUX. ON DEMANDE AU SERVICE CE QU IL PENSE DE LUI-MEME quand il sait le dire (healthz, /ready, status.php, decouverte OIDC). Quand il ne sait pas, on va chercher la verite de terrain : « moteur » ne regarde ni le service ni le port, il demande a la base depuis combien de temps elle n a pas ete rafraichie — la lecon des sauvegardes appliquee a la supervision. QUATRE FOIS J AI ECRIT LA SONDE AVANT DE MESURER, QUATRE FOIS ELLE A EU TORT. La forge : port et chemin des depots inventes, elle ecoute en 3000 derriere l edge et n a legitimement aucun depot. Loki : « panne persistante » conclue sur deux lectures a quelques secondes d intervalle juste apres un redemarrage — deux mesures rapprochees ne distinguent pas un etat d un instant. Keycloak : vise en 8443, il ecoute en 8080. Le runner : git en root refuse un depot d un autre proprietaire. A chaque fois le remede est le meme — lire la verite du role, ne pas la supposer. Et le meme piege Jinja qu avec client_sante : ${#tableau[@]} contient {#. Le remede etait deja au depot ; je l ai reecrit au lieu de le chercher. RESTE : client_smtp, client_artefacts, client_journal, icingaweb2 et ops_site. Ce sont des chemins de report, dont la panne se voit deja par le silence des sondes qu ils portent. make prouver : CONFORME, 64 OK, 0 echec, 0 saute (P64 : 14 sondes). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 03:00:21 -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 a Jinja de s'ecarter.)
# GENERE par Set-OPS (role serveur_ops). Ne pas editer a la main.
#
# SONDE « runner » — depots propres sur leur branche, et Ansible repond
#
# Contrat : docs/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2.
# Mise en defaut PAR PARAMETRE : `serveur_ops_sonde_venv` (chemin inexistant).
set -uo pipefail
VENV={{ serveur_ops_sonde_venv }}
BRANCHE={{ serveur_ops_sonde_branche }}
frontiere posee, et cinq sondes qui disaient faux Application de ce que l entree precedente avait prepare : 49 regles creees, 5 retirees. Cibles Prometheus 2/8 -> 8/8, hotes dans Loki 1/7 -> 7/7. Puis correction de ce que l application a revele. Cinq defauts, tous de la meme famille : un reglage qui ne suit pas l interrupteur dont il depend. - la sonde de Loki interrogeait en HTTPS un Loki servant en clair ; - la sonde de la forge visait http:// sur un port 443 chiffre, puis validait un certificat emis pour le FQDN en interrogeant 127.0.0.1 ; - la sonde du runner comparait six depots a UNE branche quand le plan en declare une par depot. Elle contredisait la declaration qu elle etait censee verifier : elle n accusait pas la machine, elle s accusait elle-meme. Le tenant restait juste dans les cinq cas. C est le site, qui deploie ces roles autrement, qui les a tous reveles d un coup. La sonde des journaux, elle, avait deux defauts a la naissance. Elle criait une perte deja reparee, faute de dire sur QUELLE fenetre - un ecart sans sa fenetre n est pas une mesure, c est un nombre. Et elle alertait sur la cicatrice plutot que sur la plaie : le compteur d Alloy est cumulatif, donc six machines restaient orange pour toujours. Ce qui alerte est desormais la CROISSANCE. En echange, un cas muet leve maintenant : zero envoi et zero rejet n est pas la sante, c est un agent qui ne fait rien. Enfin, le runner ne pouvait plus cloner le genome. Defaut PREEXISTANT, revele par le redeploiement et non cause par lui - le diff des regles generees le montre. generer_nftables(site=True) lisait le plan du TENANT : derive se resolvait donc a 3000, le port que Forgejo ecoute derriere un edge, alors que le plan du site dit 443 et explique pourquoi. La forge ouvrait un port que personne n ecoute et laissait 443 ferme a toute la flotte. Mesure finale : Icinga 51/51, Prometheus 8/8, Loki 7/7, prouver 64 OK, lint 0 defaut sur 82 fichiers. Controles negatifs sur des COPIES des sondes : les quatre rendent CRITICAL. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 10:27:12 -04:00
# La branche ATTENDUE de chaque depot, telle que le plan la declare. Un depot absent de
# cette table retombe sur `BRANCHE` — c'est le cas de ceux qui ne declarent rien.
declare -A BRANCHES=(
{% for _d, _b in (serveur_ops_sonde_branches | default({})).items() %}
["{{ _d }}"]="{{ _b }}"
{% endfor %}
)
sondes : quatorze, une par role, derivees en objets Icinga boites (dovecot) · cache-apt (artefacts) · certificat (client_pki, 14/14) collaboration (nextcloud) · collecte (prometheus) · file-courriel (postfix) forge (forgejo) · identite (keycloak) · ingestion (loki) · moteur (icinga) resolution (resolveur) · runner (serveur_ops) · tableaux (grafana) voute (ops_tenant) — toutes vertes, sans une ligne ecrite dans Icinga. DEUX PRINCIPES QUE LA PREMIERE SONDE A IMPOSES. Une sonde doit pouvoir etre mise en defaut PAR PARAMETRE : cible et seuils sont des variables du role, on prouve le rouge avec un port ferme ou un seuil impossible, sans rien casser. Et la sonde vit LA OU VIT LA VERITE : « ce noeud est-il collecte ? » appartient a prometheus, pas au client — une seule y voit les N noeuds, et surtout elle voit le cas SILENCIEUX. ON DEMANDE AU SERVICE CE QU IL PENSE DE LUI-MEME quand il sait le dire (healthz, /ready, status.php, decouverte OIDC). Quand il ne sait pas, on va chercher la verite de terrain : « moteur » ne regarde ni le service ni le port, il demande a la base depuis combien de temps elle n a pas ete rafraichie — la lecon des sauvegardes appliquee a la supervision. QUATRE FOIS J AI ECRIT LA SONDE AVANT DE MESURER, QUATRE FOIS ELLE A EU TORT. La forge : port et chemin des depots inventes, elle ecoute en 3000 derriere l edge et n a legitimement aucun depot. Loki : « panne persistante » conclue sur deux lectures a quelques secondes d intervalle juste apres un redemarrage — deux mesures rapprochees ne distinguent pas un etat d un instant. Keycloak : vise en 8443, il ecoute en 8080. Le runner : git en root refuse un depot d un autre proprietaire. A chaque fois le remede est le meme — lire la verite du role, ne pas la supposer. Et le meme piege Jinja qu avec client_sante : ${#tableau[@]} contient {#. Le remede etait deja au depot ; je l ai reecrit au lieu de le chercher. RESTE : client_smtp, client_artefacts, client_journal, icingaweb2 et ops_site. Ce sont des chemins de report, dont la panne se voit deja par le silence des sondes qu ils portent. make prouver : CONFORME, 64 OK, 0 echec, 0 saute (P64 : 14 sondes). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 03:00:21 -04:00
RACINE={{ serveur_ops_sonde_racine }}
# `safe.directory` : les depots appartiennent au compte d'exploitation, la sonde tourne en
# root. Sans cela git refuse — « proprietaire douteux » — et la sonde rendrait un echec
# qui parle de git au lieu de parler du depot.
git_() { git -c safe.directory='*' -C "$1" "${@:2}" 2>/dev/null; }
ennuis=(); n=0
for d in "${RACINE}"/*/; do
[[ -d "${d}.git" ]] || continue
n=$((n+1)); nom=$(basename "${d}")
b=$(git_ "${d}" rev-parse --abbrev-ref HEAD)
frontiere posee, et cinq sondes qui disaient faux Application de ce que l entree precedente avait prepare : 49 regles creees, 5 retirees. Cibles Prometheus 2/8 -> 8/8, hotes dans Loki 1/7 -> 7/7. Puis correction de ce que l application a revele. Cinq defauts, tous de la meme famille : un reglage qui ne suit pas l interrupteur dont il depend. - la sonde de Loki interrogeait en HTTPS un Loki servant en clair ; - la sonde de la forge visait http:// sur un port 443 chiffre, puis validait un certificat emis pour le FQDN en interrogeant 127.0.0.1 ; - la sonde du runner comparait six depots a UNE branche quand le plan en declare une par depot. Elle contredisait la declaration qu elle etait censee verifier : elle n accusait pas la machine, elle s accusait elle-meme. Le tenant restait juste dans les cinq cas. C est le site, qui deploie ces roles autrement, qui les a tous reveles d un coup. La sonde des journaux, elle, avait deux defauts a la naissance. Elle criait une perte deja reparee, faute de dire sur QUELLE fenetre - un ecart sans sa fenetre n est pas une mesure, c est un nombre. Et elle alertait sur la cicatrice plutot que sur la plaie : le compteur d Alloy est cumulatif, donc six machines restaient orange pour toujours. Ce qui alerte est desormais la CROISSANCE. En echange, un cas muet leve maintenant : zero envoi et zero rejet n est pas la sante, c est un agent qui ne fait rien. Enfin, le runner ne pouvait plus cloner le genome. Defaut PREEXISTANT, revele par le redeploiement et non cause par lui - le diff des regles generees le montre. generer_nftables(site=True) lisait le plan du TENANT : derive se resolvait donc a 3000, le port que Forgejo ecoute derriere un edge, alors que le plan du site dit 443 et explique pourquoi. La forge ouvrait un port que personne n ecoute et laissait 443 ferme a toute la flotte. Mesure finale : Icinga 51/51, Prometheus 8/8, Loki 7/7, prouver 64 OK, lint 0 defaut sur 82 fichiers. Controles negatifs sur des COPIES des sondes : les quatre rendent CRITICAL. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 10:27:12 -04:00
attendue="${BRANCHES[${nom}]:-${BRANCHE}}"
[[ "${b}" == "${attendue}" ]] || ennuis+=("${nom} sur « ${b:-?} » au lieu de « ${attendue} »")
sondes : quatorze, une par role, derivees en objets Icinga boites (dovecot) · cache-apt (artefacts) · certificat (client_pki, 14/14) collaboration (nextcloud) · collecte (prometheus) · file-courriel (postfix) forge (forgejo) · identite (keycloak) · ingestion (loki) · moteur (icinga) resolution (resolveur) · runner (serveur_ops) · tableaux (grafana) voute (ops_tenant) — toutes vertes, sans une ligne ecrite dans Icinga. DEUX PRINCIPES QUE LA PREMIERE SONDE A IMPOSES. Une sonde doit pouvoir etre mise en defaut PAR PARAMETRE : cible et seuils sont des variables du role, on prouve le rouge avec un port ferme ou un seuil impossible, sans rien casser. Et la sonde vit LA OU VIT LA VERITE : « ce noeud est-il collecte ? » appartient a prometheus, pas au client — une seule y voit les N noeuds, et surtout elle voit le cas SILENCIEUX. ON DEMANDE AU SERVICE CE QU IL PENSE DE LUI-MEME quand il sait le dire (healthz, /ready, status.php, decouverte OIDC). Quand il ne sait pas, on va chercher la verite de terrain : « moteur » ne regarde ni le service ni le port, il demande a la base depuis combien de temps elle n a pas ete rafraichie — la lecon des sauvegardes appliquee a la supervision. QUATRE FOIS J AI ECRIT LA SONDE AVANT DE MESURER, QUATRE FOIS ELLE A EU TORT. La forge : port et chemin des depots inventes, elle ecoute en 3000 derriere l edge et n a legitimement aucun depot. Loki : « panne persistante » conclue sur deux lectures a quelques secondes d intervalle juste apres un redemarrage — deux mesures rapprochees ne distinguent pas un etat d un instant. Keycloak : vise en 8443, il ecoute en 8080. Le runner : git en root refuse un depot d un autre proprietaire. A chaque fois le remede est le meme — lire la verite du role, ne pas la supposer. Et le meme piege Jinja qu avec client_sante : ${#tableau[@]} contient {#. Le remede etait deja au depot ; je l ai reecrit au lieu de le chercher. RESTE : client_smtp, client_artefacts, client_journal, icingaweb2 et ops_site. Ce sont des chemins de report, dont la panne se voit deja par le silence des sondes qu ils portent. make prouver : CONFORME, 64 OK, 0 echec, 0 saute (P64 : 14 sondes). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 03:00:21 -04:00
# UN DEPOT SALE SUR LE RUNNER EST UNE DIVERGENCE SILENCIEUSE : ce qui s'applique a la
# flotte n'est plus ce que le depot contient, et personne ne le sait.
[[ -z "$(git_ "${d}" status --porcelain)" ]] || ennuis+=("${nom} MODIFIE localement")
done
(( n > 0 )) || { echo "Aucun depot sous ${RACINE} — le runner n'a rien a appliquer."; exit 2; }
v=$("${VENV}/bin/ansible" --version 2>/dev/null | head -1)
[[ -n "${v}" ]] || { echo "Ansible ne repond pas dans ${VENV} — le runner ne peut rien appliquer."; exit 2; }
if (( ${#ennuis[@]} > 0 )); then
echo "Runner : ${ennuis[*]} — ce qui s'applique diverge du depot.|depots=${n}"
exit 2
fi
frontiere posee, et cinq sondes qui disaient faux Application de ce que l entree precedente avait prepare : 49 regles creees, 5 retirees. Cibles Prometheus 2/8 -> 8/8, hotes dans Loki 1/7 -> 7/7. Puis correction de ce que l application a revele. Cinq defauts, tous de la meme famille : un reglage qui ne suit pas l interrupteur dont il depend. - la sonde de Loki interrogeait en HTTPS un Loki servant en clair ; - la sonde de la forge visait http:// sur un port 443 chiffre, puis validait un certificat emis pour le FQDN en interrogeant 127.0.0.1 ; - la sonde du runner comparait six depots a UNE branche quand le plan en declare une par depot. Elle contredisait la declaration qu elle etait censee verifier : elle n accusait pas la machine, elle s accusait elle-meme. Le tenant restait juste dans les cinq cas. C est le site, qui deploie ces roles autrement, qui les a tous reveles d un coup. La sonde des journaux, elle, avait deux defauts a la naissance. Elle criait une perte deja reparee, faute de dire sur QUELLE fenetre - un ecart sans sa fenetre n est pas une mesure, c est un nombre. Et elle alertait sur la cicatrice plutot que sur la plaie : le compteur d Alloy est cumulatif, donc six machines restaient orange pour toujours. Ce qui alerte est desormais la CROISSANCE. En echange, un cas muet leve maintenant : zero envoi et zero rejet n est pas la sante, c est un agent qui ne fait rien. Enfin, le runner ne pouvait plus cloner le genome. Defaut PREEXISTANT, revele par le redeploiement et non cause par lui - le diff des regles generees le montre. generer_nftables(site=True) lisait le plan du TENANT : derive se resolvait donc a 3000, le port que Forgejo ecoute derriere un edge, alors que le plan du site dit 443 et explique pourquoi. La forge ouvrait un port que personne n ecoute et laissait 443 ferme a toute la flotte. Mesure finale : Icinga 51/51, Prometheus 8/8, Loki 7/7, prouver 64 OK, lint 0 defaut sur 82 fichiers. Controles negatifs sur des COPIES des sondes : les quatre rendent CRITICAL. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-10 10:27:12 -04:00
echo "Runner : ${n} depot(s) propres sur leur branche declaree, ${v}.|depots=${n}"