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:
parent
14bf977bd6
commit
5a6d0f28f6
2 changed files with 24 additions and 3 deletions
20
CHANGELOG.md
20
CHANGELOG.md
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue