Some checks failed
verifier / verifier (push) Has been cancelled
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
133 lines
7.7 KiB
Markdown
133 lines
7.7 KiB
Markdown
# 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`](meta-classe.md) (une définition instancie la flotte)
|
|
> et [`dimensionnement-ressources.md`](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`](../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` :
|
|
|
|
```sh
|
|
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.
|