diff --git a/CHANGELOG.md b/CHANGELOG.md index e968581..fcefc25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # CHANGELOG — Set-OPS +## 2026-09-30 (49) — Un Icinga neuf entend les nœuds tout de suite + +**Le défaut** (45, point 4) : un Icinga neuf marque `sauvegarde` et `restauration` +CRITIQUES tant qu'aucun rapport n'est arrivé — voulu : le silence doit alerter. Mais les +minuteurs ne rapportent que toutes les 4 h (dépôt) et le DIMANCHE (restauration) : après +chaque reconstruction, Icinga restait rouge jusqu'à une semaine, et on déclenchait les +contrôles à la main (Technolibre, puis Chezlepro, ce 2026-09-30). + +**Le signal retenu** : le compte de rapport d'un nœud ne sait que DÉPOSER, il ne peut pas +demander à Icinga s'il l'a déjà entendu. Mais chaque nœud recopie l'AC d'Icinga : un Icinga +refait a une AC neuve, un nœud refait n'en a pas encore de copie. Dans les deux cas, cette +copie change — et elle seule notifie « Premier rapport a Icinga » : déposer, vérifier le +dépôt, vérifier la restauration, dans cet ordre. Une retouche de gabarit ne le déclenche +pas : elle ne dit rien de ce qu'Icinga a reçu. + +**Éprouvé** sur `web-frontal-01` de Technolibre, copie de l'AC retirée (Icinga « neuf ») : +les trois unités tournent (04:39:37, :40, :42), rc=0 — donc acceptées par Icinga, le script +échouant sinon. Second passage : aucun gestionnaire, `changed=0`. Garde statique ajoutée à +`test_restauration.py`. + ## 2026-09-30 (48) — Chezlepro rasée et reconstruite par les runners : l'état est revenu, à l'identique **La preuve visée** : que (47) remette réellement l'état, sur une vraie reconstruction. @@ -165,7 +185,7 @@ pare-feu Proxmox VM par VM (procédure éprouvée : 13/13, flux identiques avant 3. **Keycloak : un client absent faisait échouer les mappers de groupes et de rôles** — sous `set -euo pipefail`, `grep` sans correspondance sortait avant la branche « client absent ». Jamais vu tant qu'un client `forgejo` subsistait d'une époque où le locataire avait une forge. -4. **(conception, non corrigé)** Un Icinga neuf marque aussitôt `sauvegarde` et `restauration` +4. **(conception — corrigé en (49))** Un Icinga neuf marque aussitôt `sauvegarde` et `restauration` critiques (« jamais rapporté ») ; la restauration n'étant vérifiée que le dimanche, elle resterait rouge jusque-là après chaque reconstruction. Ici : sauvegarde, vérification du dépôt et contrôle de restauration déclenchés à la main sur la flotte reconstruite. diff --git a/roles/client_backup/handlers/main.yml b/roles/client_backup/handlers/main.yml index 34a9aca..41aff23 100644 --- a/roles/client_backup/handlers/main.yml +++ b/roles/client_backup/handlers/main.yml @@ -2,3 +2,27 @@ - name: Recharger systemd ansible.builtin.systemd: daemon_reload: true + +# PREMIER RAPPORT A UN ICINGA QUI NE NOUS A JAMAIS ENTENDUS — voir `tasks/verifier.yml`. +# Trois temps, dans cet ordre (les gestionnaires s'executent dans l'ordre de ce fichier) : +# deposer, pour que le depot porte un instantane de CETTE incarnation ; verifier le depot ; +# verifier qu'il se restaure. Les unites sont `oneshot` : chacune rend la main une fois son +# rapport parti, et echoue — bruyamment — si la sauvegarde refuse (etat d'avant non remis) +# ou si Icinga ne prend pas le resultat. +- name: Premier depot + ansible.builtin.systemd: + name: setops-sauvegarde.service + state: started + listen: Premier rapport a Icinga + +- name: Premier controle du depot + ansible.builtin.systemd: + name: setops-verification-depot.service + state: started + listen: Premier rapport a Icinga + +- name: Premier controle de restauration + ansible.builtin.systemd: + name: setops-verification-restauration.service + state: started + listen: Premier rapport a Icinga diff --git a/roles/client_backup/tasks/verifier.yml b/roles/client_backup/tasks/verifier.yml index 7c72ced..a9c12e5 100644 --- a/roles/client_backup/tasks/verifier.yml +++ b/roles/client_backup/tasks/verifier.yml @@ -37,6 +37,16 @@ delegate_to: "{{ client_backup_icinga_hote }}" register: client_backup_ca_icinga +# UN ICINGA QUI NE NOUS A JAMAIS ENTENDUS (2026-09-30). Ses services `sauvegarde` et +# `restauration` sont CRITIQUES tant qu'aucun rapport n'est arrive — c'est voulu, le silence +# doit alerter. Mais les minuteurs ne rapportent que toutes les 4 h (depot) et le DIMANCHE +# (restauration) : apres chaque reconstruction, Icinga restait rouge jusqu'a une semaine, +# et on declenchait les controles a la main. +# +# Le noeud ne peut pas demander a Icinga s'il l'a deja entendu : son compte ne sait que +# DEPOSER. Le signal fiable est ICI — l'AC d'Icinga que le noeud recopie. Un Icinga refait a +# une AC neuve ; un noeud refait n'en a pas encore de copie. Dans les deux cas cette tache +# change, et le noeud rapporte aussitot (voir les gestionnaires). - name: Déposer l'AC d'Icinga pour la vérification du pair when: client_backup_ca_presente.stat.exists ansible.builtin.copy: @@ -45,6 +55,7 @@ owner: root group: root mode: "0644" + notify: Premier rapport a Icinga - name: Installer curl pour le rapport passif ansible.builtin.apt: diff --git a/scripts/tests/test_restauration.py b/scripts/tests/test_restauration.py index df30fd1..a9abced 100644 --- a/scripts/tests/test_restauration.py +++ b/scripts/tests/test_restauration.py @@ -58,6 +58,18 @@ def couverture() -> None: f"{g} inclut son point de restauration (restaurer.yml)") verifier("{#" not in GABARIT.read_text(), "le gabarit ne contient aucune sequence accolade-diese") + # UN ICINGA NEUF ENTEND LE NOEUD TOUT DE SUITE (2026-09-30) : sinon `restauration` reste + # rouge jusqu'au dimanche apres chaque reconstruction. + taches = yaml.safe_load((RACINE / "roles/client_backup/tasks/verifier.yml").read_text()) + depot_ac = [t for t in taches if "AC d'Icinga pour la" in t.get("name", "")] + verifier(bool(depot_ac) and depot_ac[0].get("notify") == "Premier rapport a Icinga", + "la copie de l'AC d'Icinga (Icinga neuf ou noeud neuf) declenche le premier rapport") + gest = yaml.safe_load((RACINE / "roles/client_backup/handlers/main.yml").read_text()) + ordre = [g["ansible.builtin.systemd"]["name"] for g in gest if g.get("listen") == "Premier rapport a Icinga"] + verifier(ordre == ["setops-sauvegarde.service", "setops-verification-depot.service", + "setops-verification-restauration.service"], + f"premier rapport : deposer, puis verifier le depot, puis la restauration ({ordre})") + # --- 2. L'outil de noeud, avec des doublures ------------------------------------------