110 lines
4.9 KiB
Markdown
110 lines
4.9 KiB
Markdown
|
|
# Supervision dérivée des rôles
|
||
|
|
|
||
|
|
> **Pour qui :** celui qui ajoute un rôle à Set-OPS et se demande comment sa supervision
|
||
|
|
> arrive dans Icinga — et celui qui exploite et veut savoir d'où sortent les services
|
||
|
|
> qu'il voit.
|
||
|
|
|
||
|
|
> **La règle en une phrase.** Un rôle déclare les sondes de sa propre supervision ; le
|
||
|
|
> moteur en dérive les objets Icinga, la permission d'API et les preuves. Comme
|
||
|
|
> `meta/flux.yml` engendre nftables *et* OPNsense.
|
||
|
|
|
||
|
|
## Pourquoi
|
||
|
|
|
||
|
|
Le 2026-09-09, mesure du dépôt sur lui-même :
|
||
|
|
|
||
|
|
```
|
||
|
|
au 2026-09-09 :
|
||
|
|
39 rôles déclarent leurs flux -> nftables + OPNsense, dérivés
|
||
|
|
32 déclarent leur empreinte -> ressources des VM, dérivées
|
||
|
|
32 déclarent leur authentification -> habilitations, dérivées
|
||
|
|
19 groupes déclarent `surveillance:` -> RIEN
|
||
|
|
```
|
||
|
|
|
||
|
|
Au 2026-09-09, les dix-neuf lignes `surveillance:` de `docs/dependances-groupes.yml` sont écrites,
|
||
|
|
versionnées, relues — et **aucune n'est exécutée**. Icinga surveillait deux choses :
|
||
|
|
`sauvegarde` et `sante`.
|
||
|
|
|
||
|
|
C'est la classe d'échec que ce dépôt nomme partout ailleurs, en version documentaire : la
|
||
|
|
carte dit ce qui est surveillé, et personne ne surveille. *Une intention écrite n'est pas
|
||
|
|
une mesure.*
|
||
|
|
|
||
|
|
## Le contrat d'une sonde
|
||
|
|
|
||
|
|
Une sonde est un **script local**, déposé par le rôle qui la possède, dans
|
||
|
|
`/usr/local/lib/setops/sondes/<nom>.sh` (0750, root).
|
||
|
|
|
||
|
|
| | |
|
||
|
|
|---|---|
|
||
|
|
| **sortie standard** | une ligne, le message lisible par un humain |
|
||
|
|
| **code de sortie** | `0` OK · `1` AVERTISSEMENT · `2` CRITIQUE |
|
||
|
|
| **réseau** | aucun besoin : c'est le porteur qui pousse le résultat |
|
||
|
|
| **durée** | courte ; le porteur passe toutes les 15 min |
|
||
|
|
|
||
|
|
Le rôle qui possède la sonde la **déploie lui-même** : il connaît ses chemins, ses
|
||
|
|
secrets, sa vérité de terrain. Il la **déclare** dans `meta/supervision.yml`, et c'est
|
||
|
|
cette déclaration que le moteur lit.
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
# roles/<rôle>/meta/supervision.yml
|
||
|
|
sondes:
|
||
|
|
- nom: certificat
|
||
|
|
ttl: 5400
|
||
|
|
raison: "..."
|
||
|
|
```
|
||
|
|
|
||
|
|
## Passif, et à durée de vie — jamais actif
|
||
|
|
|
||
|
|
Un contrôle **actif** ne voit pas la machine **muette** : si elle ne répond plus, la sonde
|
||
|
|
échoue et on met ça sur le compte du réseau. Ici c'est le nœud qui parle, et le `ttl` de
|
||
|
|
son envoi fait la fraîcheur — sans nouvelle, Icinga périme le service tout seul.
|
||
|
|
|
||
|
|
**Le silence alerte autant que l'échec.** C'est exactement ce qui a manqué à
|
||
|
|
`openipmi.service` : une unité en échec à chaque démarrage pendant une semaine, et
|
||
|
|
`systemctl --failed` à zéro partout parce qu'aucune machine n'avait redémarré.
|
||
|
|
|
||
|
|
C'est aussi ce qu'impose *la vérification suit la clé* : la sonde tourne là où vit la
|
||
|
|
vérité, pas sur le superviseur. Un dépôt de sauvegarde chiffré côté client ne peut être
|
||
|
|
jugé que par qui détient la clé.
|
||
|
|
|
||
|
|
## Ce qui n'a rien à faire ici
|
||
|
|
|
||
|
|
Une **métrique à seuil** — durée de collecte, volume de journaux, taux d'occupation —
|
||
|
|
appartient à Prometheus et Grafana. Icinga répond à une seule question : *est-ce cassé ?*
|
||
|
|
Mélanger les deux rendrait les deux moins lisibles.
|
||
|
|
|
||
|
|
## Chaque sonde vient avec son contrôle négatif
|
||
|
|
|
||
|
|
Une sonde qu'on n'a jamais vue échouer n'est pas une sonde, c'est une habitude. Dix-neuf
|
||
|
|
voyants verts non éprouvés seraient un recul par rapport à deux voyants prouvés : ils
|
||
|
|
rassureraient.
|
||
|
|
|
||
|
|
Toute sonde ajoutée doit donc être accompagnée de la manière de la faire échouer
|
||
|
|
**pour de vrai**, et cette manière doit être rejouée au moins une fois, sur une machine
|
||
|
|
réelle. Le CHANGELOG en porte la trace.
|
||
|
|
|
||
|
|
**Et contre un état sain, tout autant.** La première version de la sonde du certificat a
|
||
|
|
rendu **14 machines sur 14 en CRITIQUE** — sur une PKI qui se portait très bien. Elle
|
||
|
|
utilisait `openssl verify -CAfile racine`, alors que nos certificats sont signés par un
|
||
|
|
*intermédiaire* que seul `step certificate verify` sait retrouver. Une alarme toujours
|
||
|
|
allumée ne vaut pas mieux qu'une alarme jamais allumée : elle apprend à ne plus regarder.
|
||
|
|
Une sonde se prouve donc **deux fois** — verte sur le sain, rouge sur le cassé.
|
||
|
|
|
||
|
|
## Un contrôle négatif ne doit pas pouvoir abîmer
|
||
|
|
|
||
|
|
Éprouver la sonde du certificat, le 2026-09-09, a consisté à **remplacer le certificat
|
||
|
|
d'hôte** par un auto-signé. La sonde a bien viré au rouge — et le script de synchronisation
|
||
|
|
a propagé ce certificat vers `node_exporter`, dont la clé était restée l'ancienne :
|
||
|
|
|
||
|
|
```
|
||
|
|
failed to load X509KeyPair: tls: private key does not match public key
|
||
|
|
```
|
||
|
|
|
||
|
|
Un service réel est tombé pour éprouver une sonde. Le contrôle avait un **rayon d'action**
|
||
|
|
que je ne lui avais pas donné volontairement.
|
||
|
|
|
||
|
|
La règle qui en découle : un contrôle négatif se fait sur une **copie**, ou sur un chemin
|
||
|
|
que la sonde accepte en paramètre — jamais en substituant l'artefact que d'autres
|
||
|
|
consomment. Quand c'est impossible, on le fait sur la machine la moins critique, on
|
||
|
|
l'annonce, et on vérifie l'état des consommateurs **après**, pas seulement celui de la
|
||
|
|
sonde.
|