nommage : bifrost-N, où N est le dernier octet (D-60 ; D-12 renversée)

Les deux commutateurs deviennent bifrost-3 et bifrost-4, avec 10.0.0.3 et
10.0.0.4. Tout l'ensemble de bordure porte un seul nom, et son numéro est son
adresse : bifrost-1 = .1, bifrost-4 = .4. Plus de table de correspondance.

D-12 disait « bifrost aux frontières, sleipnir à la fabric » — le nom portait le
type de la machine. C'est le champ `role` qui le fait, et lui seul pilote le
devis : aucune logique ne dépendait du nom, seulement des données et un
commentaire. Le devis a suivi seul, jusqu'aux marqueurs de ports.

Inconvénient assumé : bifrost-3 ne dit plus « commutateur », il faut lire `role`.
La partie B du devis s'en charge à l'affichage.

30 preuves OK.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-08-04 20:01:10 -04:00
parent 89f33c5b43
commit e6c259be4d
5 changed files with 37 additions and 7 deletions

View file

@ -1,5 +1,34 @@
# CHANGELOG — Set-OPS
## 2026-08-04 (suite 4) — le numéro est l'adresse
Les deux commutateurs deviennent **`bifrost-3`** et **`bifrost-4`**, avec leurs adresses
`10.0.0.3` et `10.0.0.4`. Tout l'ensemble de bordure porte désormais un seul nom, et
**N est son dernier octet** :
```
bifrost-1 frontiere 10.0.0.1 · 10.0.4.1 ← passerelle
bifrost-2 frontiere 10.0.0.2 · 10.0.4.2
bifrost-3 switch 10.0.0.3 ← racine du spanning-tree
bifrost-4 switch 10.0.0.4
```
Plus de table de correspondance : `bifrost-4`, c'est `.4`.
**D-12 est renversée.** Elle disait « `bifrost` aux frontières, `sleipnir` à la fabric » —
le nom portait le type de la machine. Or c'est le champ **`role`** qui le fait, et lui
seul pilote le devis : aucune logique ne dépendait du nom, seulement des données et un
commentaire. Ce qui survit de D-12, c'est l'idée qu'un nom doit se retenir — elle passe
maintenant par le numéro.
Le devis a suivi seul, jusqu'aux marqueurs de ports (`<PORT-VERS-BIFROST-4>`).
Inconvénient assumé : `bifrost-3` ne dit plus « commutateur ». Il faut lire `role`. En
pratique le devis s'en charge — sa partie B s'intitule « SWITCHES D'ACCÈS (L2 pur) :
bifrost-4 ».
30 preuves OK.
## 2026-08-04 (suite 3) — le VNet d'une VM se dérive, et un hyperviseur a plusieurs pattes
### Le pont n'était pas seulement non portable : il était faux

View file

@ -43,7 +43,7 @@ sont les seules vérifiables.
| **D-11** | La **sortie générale est déclarée** dans le registre des flux | `block out` est un vrai default-deny ; un besoin oublié ne se manifeste pas par un refus clair | `frontiere-opnsense.md` §8 | P09 |
| **D-29** | L'**overlay EVPN plafonne à 1450** ; le transport doit donc dépasser 1500 | choix d'exploitation ; l'encapsulation VXLAN coûte 50 octets | `sdn-evpn.md` §5 | P23 (MTU du transport) |
| **D-30** | L'**ICMP « fragmentation nécessaire » est déclaré**, dans les deux sens | à 1450, tout ce qui traverse la frontière dépend de la découverte de MTU de chemin ; une bordure en default-deny la casse en silence | `roles/serveur_debian/meta/flux.yml` | P09 |
| **D-12** | Nommage : **`bifrost`** aux frontières, **`sleipnir`** à la fabric | Bifröst est le pont vers l'extérieur ; Sleipnir traverse les mondes sans en sortir | `frontiere-opnsense.md` §6 | — |
| **D-60** | Nommage : tout l'ensemble de bordure est **`bifrost-N`**, et **N est son dernier octet** | on retient un chiffre au lieu d'une table ; le nom ne dit plus le type de la machine, c'est le champ `role` qui le fait — et lui seul pilote le devis | `underlay.yml` | — |
## 2. Qui possède quoi
@ -113,6 +113,7 @@ qui semblent inutiles.
| L'`underlay.yml` vit à la racine du moteur, gitignoré | 2026-07-24 → 08-02 | `0eae97c` | consommé par deux générateurs, validé par une preuve, versionné nulle part | `SETOPS_UNDERLAY` permet toujours de le pointer ailleurs |
| **D-05** — un seul commutateur route, les autres en L2 pur | 2026-07-07 → 08-04 | 2026-08-04 | deux décisions séparées (EVPN, puis fusion du lien de sortie) ont vidé le rôle sans qu'on regarde leur effet cumulé : les trois SVI n'avaient plus aucun consommateur | le moteur sait toujours émettre des SVI — le modèle public s'en sert |
| **D-03** — le `/29` de transit, SVI en `.6`, `.3` réservée CARP | 2026-07-24 → 08-04 | 2026-08-04 | élargi en `/24` pour y loger les nœuds de sortie ; l'exemption d'invariant sous le `/24` tombe alors, et le `.1` revient à la passerelle | le plan `.1` passerelle / `.2 .3` pare-feux survit, décalé d'un cran |
| **D-12**`bifrost` aux frontières, `sleipnir` à la fabric | 2026-07-24 → 08-04 | 2026-08-04 | le nom portait le type de la machine, ce que le champ `role` fait déjà et mieux ; et `sleipnir` ne plaisait pas | l'idée qu'un nom doit se retenir survit — mais elle passe par le **numéro**, aligné sur l'adresse |
> **Ce que ces renversements ont en commun.** Aucun ne vient d'un changement d'avis : les trois
> viennent d'un fait découvert **après** la décision — une commande absente de l'aide du

View file

@ -128,7 +128,7 @@ ne passe pas, et rien ne l'explique. Le devis le signale dès qu'une source RFC1
le WAN — c'est un réglage d'interface, donc invisible dans les règles elles-mêmes.
**Invariant du dernier octet.** Un point de routage porte **le même dernier octet sur tous
les sous-réseaux où il participe** — on retient une adresse, pas treize. `sleipnir-01` est
les sous-réseaux où il participe** — on retient une adresse, pas treize. `le commutateur` est
donc `.1` partout : `10.0.0.1`, `10.27.16.1`, `10.27.21.1`… Le chiffre n'est pas codé en dur,
il vient de `reservations.passerelle` dans la nomenclature, et `make underlay` (**preuve
P23**) refuse une passerelle qui s'en écarte.
@ -166,7 +166,7 @@ sur ce lien :
- nom: transit-frontiere
vlan: 40
sous_reseau: 10.0.4.0/29
passerelle: 10.0.4.6 # SVI du switch L3 (sleipnir-01)
passerelle: 10.0.4.6 # SVI du switch L3 (le commutateur)
passerelle_sortie: 10.0.4.1 # bifrost-1 = sortie par défaut de la flotte
```
@ -178,14 +178,14 @@ sur ce lien :
| `10.0.4.2` | `bifrost-2` — seconde frontière |
| `10.0.4.3` | libre, réservée à une IP virtuelle CARP si les deux passent en HA |
| `10.0.4.4-.5` | libres |
| `10.0.4.6` | SVI du switch routeur (`sleipnir-01`) |
| `10.0.4.6` | SVI du switch routeur (`le commutateur`) |
Le jour où les deux OPNsense passent en haute disponibilité, `passerelle_sortie` devra
pointer sur l'**IP virtuelle CARP** et non sur un boîtier nommé — c'est le seul changement
que la bascule exigera, et il se fait à un endroit.
**Nommage.** `bifrost-1` et `bifrost-2` désignent les deux frontières — Bifröst est le pont
vers l'extérieur. La fabric interne porte un autre nom, `sleipnir-01…03` : le cheval qui
vers l'extérieur. La fabric interne porte un autre nom, `le commutateur…03` : le cheval qui
traverse les mondes, pas le pont qui en sort. Les deux boîtiers sont déclarés comme hôtes du
lien de transit ; ils sont **hors flotte Ansible**, la déclaration ne sert qu'à documenter le
lien et à réserver les noms. Le devis switch ne leur adresse aucune ligne — sa partie B ne

View file

@ -40,7 +40,7 @@ Ansible**, et rien ne sauvegarde leurs configurations.
| Supervision des hyperviseurs, commutateurs, frontière | personne |
| Journaux de ces équipements | personne |
| Sauvegarde de leurs configs (`running-config`, `config.xml`, `/etc/pve`) | personne |
| Résolution des noms d'underlay (`asgard`, `sleipnir-01`, `bifrost-1`) | personne |
| Résolution des noms d'underlay (`asgard`, `bifrost-3`, `bifrost-1`) | personne |
| Certificats pour leurs interfaces web | personne |
Ce n'est pas un oubli de conception : ces besoins tombaient entre les chaises. Ils ne sont

View file

@ -691,7 +691,7 @@ def generer(tenants: list[tuple[str, str, dict]], dialecte: str | None = None) -
vlans_underlay = [str(r["vlan"])
for r in vlans_du_role(underlay, "hyperviseur")]
# Les liens INTER-SWITCH portent tout l'underlay de la fabric, pas seulement ce
# dont les hyperviseurs ont besoin : sans le VLAN de management, sleipnir-02 et -03
# dont les hyperviseurs ont besoin : sans le VLAN de management, les commutateurs d'acces
# perdraient leur propre adresse de gestion. Un port terminal porte ce que son hote
# declare ; un lien de fabric porte ce qui doit traverser.
vlans_fabric = [str(r["vlan"])