Set-OPS-Public/docs/intrants-communs.md
Daniel Allaire 5bc3bceac1
Some checks failed
verifier / verifier (push) Has been cancelled
documentation : la tournee des 74 documents, parce qu un balayage ne lit pas
La revision a commence par un balayage par motifs — chemins morts, cibles make
absentes, comptes derives. Il a trouve une trentaine d ecarts et rate presque
tout le reste : un motif ne voit que ce qui s exprime en motif.

make hote-planifier en est l exemple. La cible EXISTE, donc le controle passait
au vert. C est une cible depreciee qui refuse et sort en 2, recommandee par
AGENTS.md, et qui contredit la REGLE D OR du meme fichier trois ecrans plus
haut. Il fallait lire pour la voir.

74 documents lus un par un. 66 corriges, 8 exacts.

CE QUI ETAIT FRANCHEMENT FAUX

AGENTS.md, la source d autorite, annoncait la flotte pas encore executee contre
des VM reelles. Elle a ete rasee et remontee depuis zero trois fois.
ecosysteme-chezlepro.md, le document montre a un client, portait la meme
phrase : il se sous-vendait gravement.

courriel-conception.md s ouvrait sur aucun role n est encore ecrit, au-dessus de
son propre paragraphe 1 qui les nomme. autorisation.md se terminait sur rien n
est construit alors qu il rapporte des mesures datees du role en fonctionnement.
hebergeur-exploitation.md disait rien n est fait d un depot qui existe.
filiation-emancipation.md se contredisait a deux ecrans de distance.

DES MODELES DECRITS D APRES UN MONDE ANTERIEUR

Le resolveur : cinq documents decrivaient un Unbound par VM en opt-in, trois le
donnaient en exemple d integration FACULTATIVE — il est universel depuis le
2026-08-24. L adressage de nomenclature-vm.md : reseau unique, VLAN 11-15, VMID
a cinq chiffres. Le nommage SDN de sdn-evpn.md contre le code : c est le wiki
qui avait raison.

CE QUI CASSE AU PREMIER ESSAI

Le nom du gabarit dore etait faux a quatre endroits, dont la procedure qui le
FABRIQUE et le critere R2 de l epreuve d operateur independant.
preparer-un-site-hebergeur.md avertissait qu une VM faite a la main serait
detruite : raser derive du plan, il ne la detruira jamais — le risque est l
inverse. Un mot de passe d essai en clair dans un depot public.

DEUX PREUVES ETENDUES, ET UNE QUI SE TROMPAIT ELLE-MEME

P57 couvre les groupes : elle a signale aussitot 29 groupes annonces au-dessus d
un tableau qui en cite 40. P29 confronte le tableau de authentification.md aux
declarations reelles : 12 annonces, 21 reels.

Et P57 imposait un chiffre faux — 56 preuves alors que le depot en porte 57, la
conditionnelle vivant hors de tout comptage. Un garde-fou qui fait respecter une
erreur ajoute l assurance a l erreur.

CE QUI RESTE, ET QU AUCUNE PREUVE NE TIENT

Deux comptes trouves a la main. Et une lacune reelle : rien ne garde les
meta/acces.yml — ni qu un service web-sso en porte un, ni que le groupe qu il
nomme existe. P29 tient les positions d authentification, personne ne tient les
habilitations.

make prouver : CONFORME, 56 OK, 0 echec, 1 saute. 0 lien mort.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-06 16:18:23 -04:00

7.7 KiB

Intrants communs de l'écosystème

Pour qui : le mainteneur — les valeurs partagées par tout l'écosystème, et qui les possède.

Recensement des intrants communs : les valeurs partagées par tout l'écosystème (par opposition aux valeurs propres à un seul hôte). Objectif : les saisir une fois, depuis un endroit unique, puis les laisser se dériver ou se propager.

Concept lié : meta-classe.md (une définition instancie la flotte) et dimensionnement-ressources.md.

1. Recensement par domaine

A. Identité de l'instance — group_vars/<env>/all.yml

  • domaine_interne — domaine DNS interne (ex. chezlepro.internal). Keystone : zones DNS, FQDN, base DN LDAP, expéditeurs courriel, URL AC en dérivent.
  • fuseau_horaire — fuseau (ex. America/Toronto).
  • setops_plan_dir — chemin du plan.

B. Réseau & nomenclature — plan/nomenclature.yml

  • index — le seed, et le seul champ d'adressage. Supernet, sous-réseaux, passerelles, VLAN et VMID en dérivent ; la preuve P20 refuse qu'on les y écrive.
  • cidr_hote, reservations, categories (libellés de zones), fonctions (catégorie + service).

Ce paragraphe listait supernet comme un intrant de la nomenclature jusqu'au 2026-09-06. C'est exactement ce que P20 interdit : un adressage stocké est un adressage qui peut contredire celui qu'on dérive.

C. Hyperviseur Proxmox — group_vars/proxmox.yml

  • proxmox_api_host, proxmox_api_user, proxmox_api_port, proxmox_validate_certs.
  • 🔒 proxmox_api_token_id, proxmox_api_token_secret — dans la voûte unique de l'instance, group_vars/all/vault.yml. proxmox.vault.yml n'est plus lue (retirée le 2026-08-03) : tolérée « en compatibilité », elle était restée le seul porteur du jeton chez un tenant — et comme *.vault.yml est gitignoré, ce jeton ne voyageait avec aucun dépôt. Une voûte unique qui ne l'était pas. Cf. docs/config-proxmox.md.
  • Golden template : proxmox_clone_vmid_modele, proxmox_clone_source_nom.
  • Placement par défaut : proxmox_clone_noeud, proxmox_clone_stockage, proxmox_clone_pont, format, complet, timeout, disque, interface, démarrer.

D. Identité initiale des VM — group_vars/modeles_vm.yml, creer-vm

  • Clé publique SSH (cloud-init) — accès admin de toute la flotte.
  • Compte technique ansible (sudo_ansible_admin_user) + sudo NOPASSWD, ciuser.
  • Politiques SSH communes (port, password auth off, root login off, grace/auth tries).

E. Socle durci commun — group_vars/modeles_vm.yml

nftables baseline · fail2ban SSH · auditd · AppArmor · sysctl · unattended-upgrades · journald (rétention) · core_dumps · systemd_ssh_auto.

F. Endpoints des services centraux (les rôles client_* en dérivent)

  • DNS interne : plancher /etc/hosts (hosts_statiques) + PowerDNS (autoritatif) + serveur_resolveur (LE récursif du tenant), désigné sur chaque nœud par client_resolveur — intégration universelle, pas opt-in.
  • AC/PKI (client_pki_ca_url → infra-pki, provisioner).
  • IdM/LDAP : annuaire résolu par resoudre_annuaire (hôte + base DN dérivés du domaine).
  • Relais courriel (client_smtp_relais → edge-mta, MTA Postfix, port 25).
  • Métriques (node_exporter :9100).
  • Journaux (client_journal_loki_url → obs).
  • Temps (NTP) : implicite (pool Debian par défaut — aucun intrant configuré).

G. Dépôts APT tiers communs

  • Smallstep (step-cli) — client_pki ↔ serveur_step_ca.
  • Grafana (alloy/loki/grafana) — client_journal ↔ serveur_loki/serveur_grafana.

H. Secrets Vault communs 🔒 — voûte unique group_vars/all/vault.yml

Tous les secrets de l'instance dans un seul fichier chiffré par environnement (inventories/<env>/group_vars/all/vault.yml), gabarit exemples/vault.exemple.yml. Un mot de passe, un endroit. Édité via ansible-vault edit (jamais par le GUI). La liste ne s'écrit pas ici. Elle se recense, depuis le plan, les rôles des groupes actifs et les group_vars :

python3 scripts/voute.py lister     # chaque secret exigé + d'où vient l'exigence
make prouver                        # P18 : le gabarit les couvre-t-il tous ?

C'est la même source que le rappel « Secrets attendus » du panneau d'intrants. Trois copies manuelles de cette liste ont existé et toutes ont divergé — elles annonçaient vault_ldap_sssd, qu'aucun rôle ne consomme, et vault_step_ca_fingerprint, que client_pki dérive à chaud depuis l'AC plutôt que de la lire.

Mot de passe du Vault lui-même : saisi au déploiement.

I. Exposition publique — plan/domaines.yml

domaines publics, edge, autorité DNS, FQDN exposés.

2. Classification proposée : constante vs défaut surchargeable

Proposition à valider. « Constante » = une seule valeur, pas de surcharge (diverger casserait le modèle). « Défaut surchargeable » = valeur globale qui ressurgit comme défaut là où l'intrant réapparaît (hôte / groupe / application).

Intrant Classe Surcharge où ?
domaine_interne Constante —
Nomenclature (index, CIDR d'hôte, catégories, fonctions) Constante — (le seed est la loi ; l'adressage en dérive)
Accès Proxmox (API host/user/port/token) Constante — (un seul cluster)
Golden template (vmid_modele, source_nom) Constante —
Secrets Vault Constante 🔒 — (gérés à part, jamais en clair)
fuseau_horaire Défaut par hôte (rare)
proxmox_clone_noeud / stockage / pont Défaut par hôte (serveurs.yml)
DNS internes (plancher /etc/hosts + PowerDNS) Défaut par hôte / groupe
Politiques durcissement (SSH, nftables, fail2ban, journald…) Défaut par hôte / groupe
Relais SMTP, TLS internes Défaut par hôte / groupe
ciuser, compte ansible Défaut rarement surchargé

3. Saisie unique dans le GUI (cible)

Un panneau « Intrants de base » dans le GUI :

  • édite les constantes et les défauts au même endroit ;
  • pour un défaut, la valeur globale apparaît pré-remplie (et signalée comme « héritée ») là où l'intrant réapparaît dans le plan, surchargeable sur place ;
  • les secrets ne sont jamais stockés en clair par le GUI (cf. §H) — il en gère au plus les références, l'édition réelle restant côté Vault.

Persistance : les fichiers de l'instance (group_vars/all/10-intrants.yml — forme dossier ; la forme plate group_vars/all.yml reste lue en compatibilité —, proxmox.yml, modeles_vm.yml, plan/nomenclature.yml). À détailler dans la note de conception de la fonctionnalité GUI.

4. Incohérences repérées — soldées

Les deux écarts que cette section signalait n'existent plus (vérifié le 2026-09-06), et le modèle « deux environnements » qui les portait non plus :

  • fuseau_horaire défini en lab seulement, absent de production — il est dans group_vars/all/10-intrants.yml (America/Toronto), avec domaine_interne.
  • group_vars/serveur_debian.yml référencé mais absent — plus aucune référence.

Il n'y a plus d'« environnements ». Ce document parle de <env> par endroits : c'est le vocabulaire d'avant la séparation par instance. Une instance = un dépôt, avec un inventaire (le moteur en résout le nom, cf. plan-et-generation.md). « Lab » et « production » ne sont pas deux environnements d'un même écosystème : ce sont deux écosystèmes, chacun avec son plan, son inventaire et sa voûte.