La bordure devient un artefact dérivé, comme le devis switch — et le chemin
qui y mène est enfin déclaré.
`make devis-opnsense` (+ preuve P24) dérive la politique de bordure du
registre des flux : les flux `pair: externe`, que `resoudre_flux.py` saute
volontairement parce qu'ils relèvent de la frontière et non du pare-feu
d'hôte. Aucun port, aucune adresse, aucun nom d'hôte dans le générateur.
Le lien manquait dans tous les fichiers : le devis switch ne contenait pas
une seule `ip route`. Un réseau underlay portant `passerelle_sortie` le
déclare — il vit dans l'underlay et non dans un tenant parce que la
frontière route vers TOUS les supernets tenants par le même saut, donc il
ne peut dériver d'aucun `index`. `devis-reseau` en tire deux routes :
l'aller (sortie générale) et le retour vers l'administration, dont l'absence
a coûté la passe de déploiement du 2026-07-29 — la réponse revient au
pare-feu par une autre interface que celle où l'état a été créé, et se fait
jeter en silence.
Les réseaux d'administration viennent de l'intrant `nftables_admin_ssh` :
même source unique que la garde anti-lockout des nftables et l'alias
SETOPS_ADMIN. Les trois pare-feux et les routes ne peuvent plus diverger.
La frontière est réglable depuis la console (section « Frontière » du
panneau Intrants) ; les identifiants d'API restent interdits d'écriture par
le GUI et vivent dans la voûte.
Correctifs de la même passe :
- le panneau refusait d'enregistrer les intrants de la frontière : le
garde-fou confondait une référence de voûte `{{ vault_* }}` préservée
avec un secret soumis. Il regarde désormais la valeur, pas le nom.
- `supprimer_vm_debian.yml` ne chargeait que `proxmox.vault.yml` pour ses
secrets ; retirer ce reliquat aurait cassé `make detruire`. Aligné sur le
playbook de clonage, voûte unique en dernier.
- documentation : la voûte est unique, `proxmox.vault.yml` n'est qu'un
reliquat de compatibilité.
Preuves : 24 OK, 0 échec. Cas de rejet du validateur d'underlay exercés un
par un ; résolution du jeton Proxmox vérifiée en exécution réelle.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6 KiB
Intrants communs de l'écosystème
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) etdimensionnement-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
supernet,cidr_hote,reservations,categories(VLAN/sous-réseau/passerelle),fonctions(catégorie + service).
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. (L'ancienneproxmox.vault.ymlreste lue en compatibilité si elle existe encore ; 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 +client_unbound(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), gabaritexemples/vault.exemple.yml. Un mot de passe, un endroit. Édité viaansible-vault edit(jamais par le GUI).proxmox_api_token_id/secret,vault_step_ca_password,vault_step_ca_fingerprint,vault_step_ca_provisioner_password,vault_openldap_admin,vault_ldap_sssd,vault_keycloak_admin,vault_postgresql_keycloak,vault_bd_keycloak,vault_forgejo_admin,vault_forgejo_secret_key,vault_forgejo_internal_token,vault_bd_forgejo,vault_grafana_admin,vault_redis,vault_bd_icingadb. 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 (supernet, CIDR, catégories, fonctions) | Constante | — (le plan réseau est la loi) |
| 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 + client_unbound) |
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 (à corriger)
fuseau_horairedéfini en lab seulement, absent de production.group_vars/serveur_debian.ymlréférencé (commentaire de prodall.yml) mais absent des deux environnements.