Set-OPS-Public/scripts/socle_amorcage.py
Daniel Allaire c18debc25e
Some checks are pending
verifier / verifier (push) Waiting to run
resolution d'instance : une seule, partagee — au lieu de neuf copies
Cinq jours, cinq defauts, tous de la meme famille : « quelle instance, quel inventaire ? »
Neuf modules portaient chacun leur reponse.

- 18 aout : P03 comparait chaque instance a l'inventaire d'une AUTRE ;
- 19 aout : verifier_ports codait `principal/` en dur ; verifier_intrants et
  _frontiere_absente lisaient le symlink au lieu de la variable ;
- 20 aout : devis_placement rendait un verdict juste sur le mauvais tenant ;
- 22 aout : P35, puis P36 — la dixieme, trouvee par la preuve elle-meme.

Aucune n'etait une faute d'inattention : chacune avait ete ecrite de bonne foi, a un
moment ou le besoin semblait local. C'est le mode de panne de la duplication — pas
l'erreur, mais la DERIVE, invisible depuis l'interieur d'un fichier.

LA RESOLUTION UNIQUE. `inventory_rules` porte instance_courante(), inventaire_de(),
dossier_inventaire() et plan_de(). Trois niveaux de repli, dont le TROISIEME manquait a la
moitie des copies : un hosts.yml existant, puis un REPERTOIRE existant (instance neuve —
c'est ce qui faisait echouer `make instancier` sur le modele public), puis le defaut.
Vingt-huit modules y sont branches.

CE QUI REND CE REFACTOR SUR : avant de toucher quoi que ce soit, chaque module a ete
interroge sur ce qu'il resolvait, pour les DEUX ecosystemes. Apres refactor, meme mesure :
17 modules x 2 instances, diff VIDE. Aucune resolution n'a change — prouve, pas suppose.

P41 echoue des qu'un module reintroduit une copie. Eprouvee en negatif : une copie
replacee dans genome.py est signalee avec son numero de ligne. Trois exemptions nommees :
instances.py et inventory_gui.py manipulent le SYMLINK lui-meme (bascule d'instance), et
devis_opnsense lit deliberement quelle instance est ACTIVE. Elles parlent du lien, pas de
la resolution.

make verifier 41 OK, 0 echec, 0 saute ; make ci idem ; lint vert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 14:19:55 -04:00

55 lines
1.8 KiB
Python
Executable file

#!/usr/bin/env python3
"""Nomme les hotes qui doivent etre DEBOUT avant tous les autres, derives du plan.
Contrainte d'architecture posee le 2026-08-08 : « une PKI et un DNS fonctionnels avant
toute chose ». Sans eux, chaque VM qui monte reclame un certificat a une autorite absente
et un nom a un annuaire muet — et l'echec se lit comme un defaut du role, pas comme un
defaut d'ordre.
Les hotes ne sont PAS ecrits : ils se derivent de `applications.<app>.hote`. Deplacer
l'autorite dans le plan deplace l'amorcage avec elle.
python3 scripts/socle_amorcage.py # un nom d'hote par ligne, dans l'ordre
"""
from __future__ import annotations
import os
import sys
from pathlib import Path
import yaml
from inventory_rules import instance_courante # noqa: E402
RACINE = Path(__file__).resolve().parent.parent
# L'ordre compte et n'est pas alphabetique : le DNS a besoin d'un certificat, l'autorite
# n'a besoin de personne. Elle passe donc devant — c'est la seule dependance reelle
# entre les deux.
APPLICATIONS = ["step_ca", "powerdns"]
def main() -> int:
base = instance_courante()
plan = base / "plan" / "applications.yml"
if not plan.exists():
print(f"Plan introuvable : {plan}", file=sys.stderr)
return 2
apps = (yaml.safe_load(plan.read_text(encoding="utf-8")) or {}).get("applications") or {}
vus, sortie = set(), []
for nom in APPLICATIONS:
hote = (apps.get(nom) or {}).get("hote")
if not hote:
print(f"L'application « {nom} » n'est pas au plan : impossible d'amorcer le "
f"socle sans elle.", file=sys.stderr)
return 2
if hote not in vus: # PKI et DNS peuvent partager un hote
vus.add(hote)
sortie.append(hote)
print("\n".join(sortie))
return 0
if __name__ == "__main__":
raise SystemExit(main())