LE CONSTAT. 39 roles declarent leurs flux, 32 leur empreinte, 32 leur authentification — tous derives. Et 19 groupes sur 19 declaraient une surveillance en prose que RIEN n executait ; Icinga en surveillait deux. La carte disait ce qui etait surveille, et personne ne surveillait. LE MECANISME. Un role declare ses sondes dans meta/supervision.yml et depose lui-meme son script dans /usr/local/lib/setops/sondes/. Le porteur client_sante les fait toutes tourner et pousse un resultat passif par sonde, sans savoir ce qu elles mesurent. serveur_icinga derive les objets Service ET le filtre de permission d API des memes declarations. Ajouter une sonde ne demande de toucher ni au porteur ni a Icinga. PREMIERE SONDE : client_pki/certificat. Heures restantes sur le certificat reellement pose, chaine verifiee, et empreinte SERVIE comparee au disque quand un service le consomme. 14/14 au tenant, 7/7 au site. QUATRE OBSTACLES, ET TROIS SONT LA MEME LECON. La sonde a rendu 14/14 en CRITIQUE sur une PKI saine : openssl verify -CAfile racine ne trouve pas l intermediaire qui signe nos certificats. step certificate verify, lui, repond VALIDE. Deployee au site, elle a rendu 5/7 : le seuil d avertissement (12 h) etait AU-DESSUS du point de renouvellement (8 h, le tiers restant). Elle criait avant que le mecanisme ne soit cense agir. Seuils ramenes a 6 h et 3 h. Un seuil se DERIVE du moment ou le mecanisme surveille agit. Une alarme toujours allumee ne vaut pas mieux qu une alarme jamais allumee : elle apprend a ne plus regarder. Une sonde se prouve DEUX FOIS, verte sur le sain et rouge sur le casse. Le filtre d API etait ecrit avant la lecture des declarations : les services auraient existe et Icinga aurait refuse leurs resultats. Et mon controle negatif a casse un service reel : substituer le certificat d hote a fait propager un cert sans sa clef vers node_exporter. Un controle negatif se fait sur une COPIE. P64 tient les deux bouts : declaree sans etre deposee, ou deposee sans etre declaree. Trois controles negatifs rejoues. make prouver : CONFORME, 64 OK, 0 echec, 0 saute. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
34 lines
1.3 KiB
Django/Jinja
34 lines
1.3 KiB
Django/Jinja
/*
|
|
* Gere par Set-OPS (role serveur_icinga). Ne pas editer a la main.
|
|
*
|
|
* LES SONDES QUE LES ROLES DECLARENT — voir docs/supervision-conception.md.
|
|
*
|
|
* Rien ici n'est ecrit a la main : chaque service vient d'un `meta/supervision.yml`, et
|
|
* s'attache aux hotes qui portent le role qui le declare. Ajouter une sonde a un role la
|
|
* fait apparaitre ici sans toucher a ce fichier — comme un flux declare devient une
|
|
* regle nftables.
|
|
*
|
|
* CE QUE CA REMPLACE : dix-neuf lignes `surveillance:` en prose dans
|
|
* `docs/dependances-groupes.yml`, ecrites, versionnees, relues — et qu'aucun mecanisme
|
|
* n'executait. La carte disait ce qui etait surveille, et personne ne surveillait.
|
|
*
|
|
* Les HOTES sont definis dans `setops-hotes.conf` : ici, rien que des services.
|
|
*/
|
|
|
|
{% for role, sondes in (serveur_icinga_sondes | default({})) | dictsort %}
|
|
{% for hote in (groups[role] | default([])) | sort %}
|
|
{% for sonde in sondes %}
|
|
object Service "{{ sonde.nom }}" {
|
|
host_name = "{{ hote }}"
|
|
check_command = "setops-passif"
|
|
enable_active_checks = false
|
|
enable_passive_checks = true
|
|
volatile = false
|
|
max_check_attempts = 1
|
|
vars.setops_source = "{{ hote }}"
|
|
vars.setops_role = "{{ role }}"
|
|
vars.setops_raison = "{{ (sonde.raison | default('')) | replace('"', "'") | replace('\n', ' ') | trim }}"
|
|
}
|
|
{% endfor %}
|
|
{% endfor %}
|
|
{% endfor %}
|