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:
parent
844568af08
commit
b135b09488
4 changed files with 68 additions and 1 deletions
22
CHANGELOG.md
22
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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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 ------------------------------------------
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue