Set-OPS-Public/scripts/socle_amorcage.py
Daniel Allaire 1295eeaf4e D-71 : PKI et DNS debout avant tout, et la zone inverse manquait
Contrainte de l'exploitant apres avoir vu backup-01 et collab-01 crees avant
l'AC et le DNS. Ma premiere reponse etait incomplete : un clone est bien
inerte, mais un echec a la 12e VM coute 40 minutes sans rien deployer, et le
journal donne l'impression que le moteur ignore ses couches.

Mesure avant de coder :
- enregistrements A : DEJA derives du plan (zone generee depuis hotes_actifs)
- zone inverse / PTR : n'existe NULLE PART, aucun role ne touche in-addr.arpa
- ordre d'amorcage : aucun, deployer-tout est par couches

Le premier point a reduit le travail de moitie — j'allais ecrire un enrolement
DNS par hote alors que la zone directe etait deja correcte.

Zone inverse derivee du supernet (27.10.in-addr.arpa), PTR issus de la MEME
source que les A : pas d'endroit ou elles puissent diverger. Vide si le
supernet n'est pas un /16.

_amorcer-socle monte l'AC puis le DNS completement avant deployer-tout ; les
deux derives de applications.<app>.hote, dans un ordre causal et non
alphabetique. Deux exceptions assumees : l'AC s'auto-signe, le DNS pose son
propre enregistrement.

P10 a attrape un handler que je venais d'inventer (Recharger PowerDNS au lieu
de Validate and reload PowerDNS) avant tout deploiement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 15:29:57 -04:00

53 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
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 = Path(os.environ.get("SETOPS_INSTANCE") or (RACINE / "instance"))
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())