reconstruire-locataire : eprouve d'armer a bilan ; le suivi ne duplique plus le journal

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-09-30 15:24:28 -04:00
parent 14bf977bd6
commit 5a6d0f28f6
2 changed files with 24 additions and 3 deletions

View file

@ -1,5 +1,25 @@
# CHANGELOG — Set-OPS # CHANGELOG — Set-OPS
## 2026-09-30 (52) — `make reconstruire-locataire` : une commande, du site à la recette
Les reconstructions du jour passaient par cinq endroits — poste, runner du site, poste,
runner du locataire, poste — avec des commandes SSH tapées à la main. La séquence vit
désormais dans `scripts/reconstruire_locataire.py`, lancé depuis le POSTE (seul à tenir à la
fois la voûte du locataire et l'accès au runner du site) :
`sauvegarder` → `raser` → `creer` → `inseminer` (runner du site) → `armer` (poste ; pause,
sauf `ARMER=oui`) → `monter` (`make monter-flotte` sur le runner du locataire, suivi toutes
les 30 s) → `parefeu` (`--flotte`) → `bilan` (ce que chaque jeu d'état est devenu).
Le nom de l'écosystème s'écrit en toutes lettres (`INSTANCE=`), comme pour `raser`, qui
n'a pas d'autre condition. Arrêt à la première étape en échec, avec la commande de reprise
(`DEPUIS=<étape>`) ; journal complet dans `<locataire>/logs/`.
**Éprouvé sur Technolibre de `armer` à `bilan`** (les étapes non destructives) : 26 min,
0 échec — armement, flotte montée et recettée, pare-feu 13/13 sans flux perdu, bilan.
Un défaut de forme corrigé : chaque relevé de suivi recopiait tout le journal distant ; seul
le nouveau y va désormais. Reste l'épreuve entière, destruction comprise.
## 2026-09-30 (51) — Ce qui était fait à la main dans les reconstructions entre dans le code ## 2026-09-30 (51) — Ce qui était fait à la main dans les reconstructions entre dans le code
**Le bilan de l'exploitant** : aucune des deux reconstructions du jour n'est allée au bout **Le bilan de l'exploitant** : aucune des deux reconstructions du jour n'est allée au bout

View file

@ -83,11 +83,11 @@ def sur_site(args, commande: str, filtre: tuple[str, ...] = ()) -> int:
"sudo -u setops bash -lc " + shlex.quote(distante)], filtre=filtre) "sudo -u setops bash -lc " + shlex.quote(distante)], filtre=filtre)
def sur_locataire(ip: str, commande: str, filtre: tuple[str, ...] = ()) -> tuple[int, str]: def sur_locataire(ip: str, commande: str, journaliser: bool = True) -> tuple[int, str]:
distante = "sudo -u setops bash -lc " + shlex.quote(commande) distante = "sudo -u setops bash -lc " + shlex.quote(commande)
r = subprocess.run(SSH_NEUF + [f"ansible@{ip}", distante], capture_output=True, text=True, r = subprocess.run(SSH_NEUF + [f"ansible@{ip}", distante], capture_output=True, text=True,
stdin=subprocess.DEVNULL) stdin=subprocess.DEVNULL)
if JOURNAL: if JOURNAL and journaliser:
with JOURNAL.open("a", encoding="utf-8") as f: with JOURNAL.open("a", encoding="utf-8") as f:
f.write(r.stdout + r.stderr) f.write(r.stdout + r.stderr)
return r.returncode, r.stdout return r.returncode, r.stdout
@ -194,7 +194,8 @@ def main() -> int:
time.sleep(30) time.sleep(30)
_, sortie = sur_locataire(runner_ip, f"pgrep -u setops -x make >/dev/null && echo EN_COURS; " _, sortie = sur_locataire(runner_ip, f"pgrep -u setops -x make >/dev/null && echo EN_COURS; "
f"grep -E '^=== |^make.*Error|failed=[1-9]' " f"grep -E '^=== |^make.*Error|failed=[1-9]' "
f"{args.racine_runner}/monter-flotte.log") f"{args.racine_runner}/monter-flotte.log",
journaliser=False) # le releve se repete : seul le NOUVEAU va au journal
for ligne in sortie.splitlines(): for ligne in sortie.splitlines():
if ligne.startswith("===") or "Error" in ligne or "failed=" in ligne: if ligne.startswith("===") or "Error" in ligne or "failed=" in ligne:
if ligne not in vu: if ligne not in vu: