client_backup : un Icinga neuf recoit le premier rapport sans attendre dimanche

La copie de l'AC d'Icinga change quand Icinga ou le noeud est neuf : elle
declenche deposer, verifier le depot, verifier la restauration. Eprouve
sur web-frontal-01 de Technolibre ; second passage sans effet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-09-30 04:40:20 -04:00
parent 844568af08
commit b135b09488
4 changed files with 68 additions and 1 deletions

View file

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

View file

@ -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

View file

@ -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:

View file

@ -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 ------------------------------------------