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:
parent
89f33c5b43
commit
e6c259be4d
5 changed files with 37 additions and 7 deletions
29
CHANGELOG.md
29
CHANGELOG.md
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"])
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue