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 # 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 ## 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 ### 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-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-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-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 ## 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 | | 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-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-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 > **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 > 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. 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 **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, 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 il vient de `reservations.passerelle` dans la nomenclature, et `make underlay` (**preuve
P23**) refuse une passerelle qui s'en écarte. P23**) refuse une passerelle qui s'en écarte.
@ -166,7 +166,7 @@ sur ce lien :
- nom: transit-frontiere - nom: transit-frontiere
vlan: 40 vlan: 40
sous_reseau: 10.0.4.0/29 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 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.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.3` | libre, réservée à une IP virtuelle CARP si les deux passent en HA |
| `10.0.4.4-.5` | libres | | `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 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 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. 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 **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 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 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 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 | | Supervision des hyperviseurs, commutateurs, frontière | personne |
| Journaux de ces équipements | personne | | Journaux de ces équipements | personne |
| Sauvegarde de leurs configs (`running-config`, `config.xml`, `/etc/pve`) | 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 | | Certificats pour leurs interfaces web | personne |
Ce n'est pas un oubli de conception : ces besoins tombaient entre les chaises. Ils ne sont 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"]) vlans_underlay = [str(r["vlan"])
for r in vlans_du_role(underlay, "hyperviseur")] for r in vlans_du_role(underlay, "hyperviseur")]
# Les liens INTER-SWITCH portent tout l'underlay de la fabric, pas seulement ce # 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 # perdraient leur propre adresse de gestion. Un port terminal porte ce que son hote
# declare ; un lien de fabric porte ce qui doit traverser. # declare ; un lien de fabric porte ce qui doit traverser.
vlans_fabric = [str(r["vlan"]) vlans_fabric = [str(r["vlan"])