--- 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."