Set-OPS-Public/docs/dependances-groupes.yml
Daniel Allaire 6d23121dc2 supervision : systemctl --failed entre dans Icinga (role client_sante)
CE QU IL FERME. openipmi.service echouait a chaque demarrage sur les
quatorze machines depuis le 2026-09-02, et systemctl --failed rendait ZERO
partout : non parce qu elles allaient bien, mais parce qu aucune n avait
redemarre depuis. Il a fallu qu un humain redemarre une machine pour que
le defaut existe aux yeux de quelqu un. Un controle qui ne peut echouer
qu au demarrage ne mesure rien tant que rien ne demarre.

PASSIF, ET A DUREE DE VIE. Un controle actif ne voit pas la machine MUETTE.
Ici c est le noeud qui parle, et le ttl de son envoi fait la fraicheur :
sans nouvelle, Icinga perime le service tout seul. Le silence alerte autant
que l echec. Le minuteur declenche AU DEMARRAGE autant que toutes les 15
min : les echecs de cette famille naissent au boot.

CRITIQUE DES LA PREMIERE UNITE, jamais un seuil — une unite en echec est
soit un vrai probleme soit du bruit a retirer, et un seuil ferait vivre le
bruit. Les tolerances se nomment une par une, vide par defaut.

CONTROLE NEGATIF. Unite factice sur obs-01, etat relu dans IcingaDB :
CRITICAL, et le verdict NOMME l unite. Les treize autres OK. Apres
nettoyage : 14/14 OK.

UN CONFLIT EVITE. setops-sauvegardes.conf definissait les object Host ; un
second fichier de controle aurait redefini les memes, et Icinga refuse un
objet en double — la configuration entiere aurait ete rejetee, donc AUCUNE
supervision, en voulant en ajouter. Les hotes vivent maintenant dans
setops-hotes.conf, definis une fois.

TROIS OBSTACLES. ${#tableau[@]} contient {# que Jinja lit comme un debut de
commentaire (remede : comment_start_string en tete du gabarit). Ma premiere
sonde a traduit un 403 « Missing permission: objects/query/service » en
« 0 service » — encore un echec qui ecrasait permission ; l etat se lit
dans IcingaDB. Et un echec apt transitoire sur mon-01, local et disparu au
second essai : mesure avant conclusion.

NON FAIT : le SITE n a pas recu client_sante.

make prouver : CONFORME, 63 OK, 0 echec, 0 saute.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-09 20:32:08 -04:00

161 lines
7.6 KiB
YAML

---
groupes:
client_pki:
requiert_groupes_actifs:
- serveur_step_ca
raison: "La confiance CA et ACME client dependent de l'autorite interne."
surveillance: "Verifier validite CA, emission ACME et expiration des certificats."
client_metrique:
requiert_groupes_actifs:
- serveur_prometheus
raison: "Les exporters clients doivent etre collectes par Prometheus."
surveillance: "Verifier targets Prometheus, scrape duration et erreurs de collecte."
client_sante:
requiert_groupes_actifs:
- serveur_icinga
raison: "Le rapport de sante depose un resultat passif sur l'API d'Icinga."
surveillance: "Verifier que chaque noeud rapporte : un service `sante` EXPIRE vaut un echec."
client_journal:
requiert_groupes_actifs:
- serveur_loki
raison: "L'expedition des journaux depend du collecteur central Loki."
surveillance: "Verifier ingestion Loki, retard et volume de journaux."
client_smtp:
requiert_groupes_actifs:
- serveur_postfix
raison: "Les notifications locales doivent relayer vers un MTA actif (Postfix)."
surveillance: "Verifier file d'attente, relais SMTP et echecs de livraison."
serveur_postfix:
requiert_groupes_actifs:
- serveur_dovecot
raison: "Postfix remet le courrier local via LMTP a Dovecot (mailstore) ; la remise exige Dovecot actif."
surveillance: "Verifier file d'attente, remise LMTP (status=sent) et rejets."
serveur_keycloak:
requiert_groupes_actifs:
- serveur_postgresql
- serveur_openldap
raison: "Keycloak persiste dans PostgreSQL et federe l'annuaire OpenLDAP (resoudre_annuaire_uri)."
surveillance: "Verifier connexion base, federation LDAP, etat realm et disponibilite OIDC."
serveur_dovecot:
requiert_groupes_actifs:
- serveur_openldap
raison: "Dovecot resout ses utilisateurs (userdb/passdb) sur l'annuaire OpenLDAP (resoudre_annuaire_*)."
surveillance: "Verifier bind LDAP, authentification IMAP et remise LMTP."
serveur_grafana:
requiert_groupes_actifs:
- serveur_prometheus
- serveur_loki
raison: "Grafana est utile comme interface aux metriques et journaux centraux."
surveillance: "Verifier datasources Prometheus/Loki et authentification."
serveur_icinga:
requiert_groupes_actifs:
- serveur_postgresql
raison: "La plateforme Icinga Web/BPM depend d'une base relationnelle."
surveillance: "Verifier moteur Icinga, base, interface web et notifications."
serveur_icingaweb2:
requiert_groupes_actifs:
- serveur_icinga
- serveur_postgresql
- serveur_openldap
raison: "Frontal web d'Icinga : lit IcingaDB (base), affiche le moteur Icinga et authentifie sur l'annuaire OpenLDAP (resoudre_annuaire)."
surveillance: "Verifier acces IcingaDB, connexion Icinga et authentification LDAP."
serveur_forgejo:
requiert_groupes_actifs:
- serveur_postgresql
- serveur_nginx
# UNE EXIGENCE PEUT ETRE CONDITIONNELLE (2026-08-22). Depuis que le role sait tenir sa
# base dans un fichier, exiger un serveur PostgreSQL est faux pour qui a choisi SQLite
# — et bloquait le deploiement d'un ecosysteme parfaitement coherent.
sauf_si:
serveur_postgresql: { variable: serveur_forgejo_bd, vaut: sqlite }
# UTILISE SI PRESENT : Forgejo envoie des notifications quand un MTA existe, et s'en
# passe sinon. Ce n'etait pas une EXIGENCE — le confondre avec une exigence obligeait
# une forge a deployer une pile courriel pour exister.
utilise_si_present:
- serveur_postfix
raison: "Forgejo depend d'une base (serveur ou fichier) et d'une publication HTTP(S) ; le courriel est un agrement."
surveillance: "Verifier HTTP(S), base, files Git et envoi courriel."
serveur_ops:
requiert_groupes_actifs:
- serveur_forgejo
# LE POSTE LIT LE GENOME SUR LA FORGE DE SON PROPRE ECOSYSTEME — c'est ce qui le rend
# autonome : il ne redemande rien a son parent. Sans forge, il n'a aucune source.
#
# Une forge EXTERNE reste possible (un ecosysteme peut lire le genome ailleurs) : il
# suffit de surcharger `serveur_ops_forge_url`. L'exigence tombe alors, comme pour
# toute exigence conditionnelle du registre.
sauf_si:
serveur_forgejo: { variable: serveur_ops_forge_externe, vaut: true }
# UTILISE SI PRESENT : sans confiance PKI, `git clone` refuse le certificat de la
# forge — et il a raison de refuser. Ce n'est pas une exigence du groupe : une forge
# a certificat public se cloner sans client_pki.
utilise_si_present:
- serveur_step_ca
raison: "Le poste d'exploitation clone le genome depuis la forge de l'ecosysteme ; sans elle, il n'a pas de source."
surveillance: "Verifier que les depots clones suivent leur amont et qu'ansible repond dans le venv."
client_artefacts:
requiert_groupes_actifs:
- serveur_artefacts
# L'INTEGRATION SUIT L'EXISTENCE DU SERVICE. Un ecosysteme sans source d'artefacts
# prend ses paquets a l'amont : c'est un choix valide, pas une panne. Le role se
# desactive alors seul (`client_artefacts_actif` derive de l'inventaire) et RETIRE la
# direction posee auparavant -- sans quoi les hotes resteraient braques sur une
# machine disparue.
sauf_si:
serveur_artefacts: { variable: client_artefacts_actif, vaut: false }
raison: "Un hote ne peut prendre ses paquets chez lui que si l'ecosysteme heberge une source."
surveillance: "Verifier que le cache repond sur 3142 et que les hotes le designent bien."
serveur_artefacts:
requiert_groupes_actifs: []
raison: "Un cache apt ne depend d'aucun service de l'ecosysteme : il ne fait que relayer et retenir."
surveillance: "Verifier l'ecoute sur 3142, le taux de service depuis le journal, et l'espace du cache."
serveur_ops_tenant:
requiert_groupes_actifs:
- serveur_ops
# LE RUNNER DE TENANT EST ADDITIF, comme celui du site : il suppose le poste
# d'exploitation en place, dont il reutilise la racine, l'utilisateur, les depots
# clones et le lien `instance`. Seul, il ne ferait que deposer un secret sur une
# machine qui n'a pas le plan qu'il ouvre.
raison: "Le runner de tenant n'ajoute qu'un pouvoir a un poste d'exploitation existant : sans lui, rien a quoi l'attacher."
surveillance: "Verifier que la voute de l'ecosysteme est presente ET CHIFFREE sous son dossier d'inventaire."
serveur_ops_site:
requiert_groupes_actifs:
- serveur_ops
# LE RUNNER DE SITE EST ADDITIF : il suppose le poste d'exploitation en place, dont il
# reutilise la racine, l'utilisateur et les depots clones. Seul, il n'aurait ni carte
# de la fabric ni moteur pour agir.
raison: "Le runner de site n'ajoute qu'un pouvoir a un poste d'exploitation existant : sans lui, rien a quoi l'attacher."
surveillance: "Verifier que la voute du site est presente ET CHIFFREE, et que la carte de la fabric est lisible."
serveur_resolveur:
requiert_groupes_actifs:
- serveur_powerdns
# Le resolveur prend la zone souveraine en STUB-ZONE : sans autoritatif, il ne saurait
# resoudre aucun nom de l'ecosysteme, et sa propre validation echouerait.
raison: "Le resolveur du tenant delegue la zone souveraine a l'autoritatif ; sans lui, il ne sait rien de l'ecosysteme."
surveillance: "Verifier qu'il repond pour la zone interne ET pour un nom de l'Internet."
serveur_nextcloud:
requiert_groupes_actifs:
- serveur_postgresql
- serveur_keycloak
- serveur_collabora
raison: "Nextcloud persiste dans PostgreSQL (verify-full), federe l'identite par OIDC (Keycloak) et valide WOPI contre Collabora (edition en ligne)."
surveillance: "Verifier base, decouverte OIDC, autodetection WOPI et acces web."