Automatisation VXLAN avec Netbox
Introduction
Dans cet article, nous allons explorer comment automatiser le dĂ©ploiement d’une infrastructure VXLAN en nous appuyant sur Netbox comme source unique de vĂ©ritĂ© (Source of Truth) et sa fonctionnalitĂ© de “Render Config”.
L’idĂ©e principale de ce projet est de simplifier la gestion des configurations rĂ©seau en limitant le recours Ă des outils d’orchestration externes, qui peuvent parfois complexifier la gestion des inventaires. Nous allons dĂ©montrer comment Netbox peut gĂ©nĂ©rer automatiquement les configurations de nos Ă©quipements rĂ©seau Ă partir de modèles Jinja2, Ă condition de respecter un principe fondamental : la standardisation de notre infrastructure. đź’ˇ
Pour illustrer cette approche, nous allons prendre l’exemple d’un site fictif, “Paris”, conçu selon des règles de standardisation claires et prĂ©cises. Cette normalisation nous permettra de :
- ModĂ©liser l’ensemble de l’infrastructure du site “Paris” dans Netbox (bâtiments, clients, fabric).
- Générer les configurations des équipements réseau en se basant sur les informations centralisées dans Netbox.
- Valider le bon fonctionnement de cette infrastructure automatisĂ©e Ă l’aide d’un environnement de laboratoire NetLab sous ContainerLab.
Ă€ travers cet exemple concret, nous montrerons que la standardisation n’est pas une contrainte, mais le socle d’une automatisation rĂ©ussie et d’une gestion rĂ©seau simplifiĂ©e et efficace.
CookBook
L’ensemble des actions expliquĂ©es dans cet article sont dĂ©crites ici.
Cette article ne nous fournira pas un guide étape par étape, mais fournira les liens vers le Cookbook qui lui, le fourni.
Le concept du site standardisé
L’automatisation efficace d’une infrastructure rĂ©seau repose sur une base solide de standardisation. Pour illustrer ce principe, nous avons dĂ©fini un modèle de site standard, caractĂ©risĂ© par une structure et des règles de connectivitĂ© prĂ©cises. Notre site “Paris” sera une instance concrète de ce modèle standardisĂ©.
Structure type d’un site standard
Un site standard est défini par les éléments suivants :
- Une Salle Serveur Centrale : Unique au sein du site, elle hĂ©berge les deux spines de la fabric (Spine 1 et Spine 2), constituant le cĹ“ur de l’infrastructure rĂ©seau.
- Un Ă Cinq Bâtiments Plain-Pied : Chaque bâtiment est dĂ©diĂ© Ă l’hĂ©bergement d’un seul client (bien que les mĂŞmes clients puissent ĂŞtre rĂ©partis sur plusieurs bâtiments).
Chaque bâtiment standard est Ă©quipĂ© d’un switch d’accès pour la connectivitĂ© locale et d’un unique leaf pour la connexion Ă la fabric.
Connectivité standard des leafs
Dans un site standard, la connexion des équipements leaf aux spines suit les règles suivantes :
- Interface Eth1 du Leaf : SystĂ©matiquement connectĂ©e Ă l’interface Eth1 du Spine 1.
- Interface Eth2 du Leaf : SystĂ©matiquement connectĂ©e Ă l’interface Eth2 du Spine 2.
- Interface Eth3 du Leaf : SystĂ©matiquement dĂ©diĂ©e Ă la connexion au switch d’accès prĂ©sent dans le mĂŞme bâtiment.
Simplification pour le POC
Pour les besoins de ce Proof of Concept, nous avons opté pour une architecture simplifiée sans redondance avancée au niveau des connexions leaf-spine.
L’objectif principal est de dĂ©montrer l’automatisation basĂ©e sur cette structure standardisĂ©e.
Plan d’adressage IP pour le site “Paris”
Pour notre site “Paris”, nous allons utiliser les conteneurs de prĂ©fixes Netbox suivants, qui s’inscrivent dans notre stratĂ©gie d’adressage globale :
- Location :
- Région : Europe
- Ville : Paris
- Conteneurs de Préfixes :
- UnderlayContainer (Paris) :
- CIDR :
172.16.0.0/16 - Description : “PrĂ©fixe conteneur pour le rĂ©seau Underlay du site de Paris”
- CIDR :
- LoopbackContainer (Paris) :
- CIDR :
192.168.100.0/24 - Description : “PrĂ©fixe conteneur pour les adresses Loopback des Ă©quipements du site de Paris”
- CIDR :
- CustomersContainer (Paris) :
- CIDR :
10.0.0.0/8 - Description : “PrĂ©fixe conteneur pour l’adressage des clients du site de Paris”
- CIDR :
- UnderlayContainer (Paris) :
Ces prĂ©fixes de type “Conteneur” sont spĂ©cifiques au site de “Paris” et seront utilisĂ©s par nos scripts d’automatisation pour attribuer les adresses IP aux diffĂ©rents Ă©quipements et clients de ce site, en respectant la structure standard que nous avons dĂ©finie.
Le site “Paris” : une instance de notre modèle standardisĂ©
Notre site “Paris” suit scrupuleusement la structure et les règles dĂ©finies dans notre modèle de site standard. Il comprendra donc une salle serveur avec les deux spines et pourra accueillir jusqu’Ă cinq bâtiments plain-pied, chacun Ă©quipĂ© d’un leaf et d’un switch d’accès, connectĂ©s selon les conventions Ă©tablies. L’adressage IP de “Paris” sera issu des conteneurs de prĂ©fixes standard que nous avons dĂ©finis.
Cette standardisation est la clĂ© qui nous permettra d’automatiser la crĂ©ation et la configuration de l’infrastructure de notre site “Paris” Ă l’aide des scripts que nous allons prĂ©senter ensuite.
Environnement de test
Le POC se joue sur ContainerLab, il est donc nĂ©cessaire de se rĂ©fĂ©rer Ă cet article pour reproduire facilement l’installation et les outils.
Nous utiliserons :
- ContainerLab
- Arista cEOS pour la partie Switch/routeur
- Netbox
- Plugin : netbox_topology_views
Pour plus de dĂ©tails, voici la documentation d’installation
Scripting : l’automatisation en action
Maintenant, on entre dans le vif du sujet : comment on utilise des scripts pour automatiser la crĂ©ation de notre fabric VXLAN en s’appuyant sur Netbox. On va voir deux scripts principaux qui font le gros du boulot !
Étape 1 : on prépare Netbox avec import.py
Avant de construire notre rĂ©seau, il faut prĂ©parer notre “Source of Truth”, Netbox. Le script import.py est lĂ pour ça ! Il va injecter dans Netbox les infos de base de notre site “Paris” et les modèles de nos Ă©quipements.
Les ingrédients du script :
Devices/devices_model.yml: La carte d’identitĂ© de nos Ă©quipements (spines, leafs, access cEOS) avec leurs caractĂ©ristiques (nombre d’interfaces, types, etc.).IPAM/subnet.yml: Les infos de notre site “Paris” (rĂ©gion Europe, ville Paris) et les plans de nos blocs d’adresses IP (pour l’underlay, les loopbacks et nos clients).
Ce que fait le script :
- Il lit le fichier
devices_model.ymlet crĂ©e les modèles d’Ă©quipements correspondants dans Netbox. C’est comme enregistrer les types de matĂ©riel qu’on va utiliser. - Il lit le fichier
IPAM/subnet.ymlet crĂ©e :- La rĂ©gion “Europe” et le site “Paris”.
- Les blocs d’adresses IP qu’on va utiliser pour notre rĂ©seau Ă Paris (nos “prĂ©fixes conteneurs”).
Comment on lance la machine :
On ouvre notre terminal et on tape la commande :
uv run import.py http://localhost:8080 YOUR_TOKEN Devices/devices_model.yml IPAM/subnet.ymlRemplace bien http://localhost:8080 par l’adresse de ton Netbox et YOUR_TOKEN par ton jeton d’API Netbox ! Une fois lancĂ©, ce script met en place les fondations de notre automatisation.
Tip
Lien vers le Cookbook ici
Étape 2 : on monte la fabric VXLAN avec Create_Fabric/main.py
Maintenant que Netbox est prĂŞt, on passe Ă la construction de notre rĂ©seau avec le script Create_Fabric/main.py. Ce script va crĂ©er tous les Ă©quipements, les connecter et leur attribuer des adresses IP, le tout en suivant notre modèle standardisĂ© pour le site “Paris”.
Les étapes du script :
- VĂ©rification prĂ©alable. Le script commence par vĂ©rifier si tout ce dont il a besoin existe dans Netbox (les rĂ´les des Ă©quipements, les rĂ´les IP, les types d’Ă©quipements). On ne veut pas commencer Ă construire sur des bases instables.
- Choix du site : “Paris” Ă©videmment. Le script nous demande sur quel site on travaille. On sĂ©lectionne “Paris”, notre site standard. Son petit nom “PA” va servir de base pour nommer nos Ă©quipements.
- On sort les spines (x2). Le script crĂ©e nos deux spines dans Netbox, en utilisant le bon modèle et le rĂ´le “spine”. Ils sont baptisĂ©s
padc_sp1_00etpadc_sp2_00. - Les paires leaf/access par bâtiment. Pour chaque bâtiment de “Paris” (jusqu’Ă 5), le script crĂ©e une “location” Netbox et y installe un leaf (par exemple
pa01_lf1_00) et un switch d’accès (par exemplepa01_sw1_00). - Câblage automatique. Le script connecte virtuellement les Ă©quipements dans Netbox en suivant nos règles :
Eth1du leaf versEth*n*du Spine 1,Eth2du leaf versEth*n*du Spine 2, etEth3du leaf versEth1de l’access switch. Plus besoin de s’embrouiller avec les câbles. - Distribution des IPs. Le script pioche dans les blocs d’adresses IP de “Paris” et attribue automatiquement les IPs aux interfaces (des /31 pour les liens entre les Ă©quipements et des /32 pour les loopbacks).
- Attribution des ASNs. Pour finir, le script donne un numĂ©ro d’AS Ă chaque spine et Ă chaque leaf pour le routage BGP. Ces numĂ©ros sont enregistrĂ©s dans un champ spĂ©cial “ASN” dans Netbox.
uv run Create_Fabric/main.py
NetBox URL: http://localhost:8080
NetBox API Token:
Number of buildings (1-5): 4
Spine device type slug: ceos
Leaf device type slug: ceos
Access switch device type slug: ceos
Existing Sites:
1. Paris (slug=paris)
Choose site number or 'new': 1Le rĂ©sultat ? En lançant ce script, on se retrouve avec toute notre infrastructure VXLAN de “Paris” créée et connectĂ©e dans Netbox, prĂŞte Ă ĂŞtre configurĂ©e.
Netbox Plugin
La configuration est facilement visualisable avec l’aide du plugin : netbox_topology_views

Tip
Lien vers le Cookbook ici
Étape 3 : on configure nos clients avec Create_Fabric/add_customers.py
Ă€ ce niveau, la fabric est fonctionnelle, mais aucun client n’est configurĂ©. Qu’est-ce que cela signifie ? Cela veut dire que l’underlay – la base de notre rĂ©seau – est configurĂ© sur Netbox, et qu’il est possible de gĂ©nĂ©rer une configuration pour dĂ©ployer le BGP et configurer les AS. Cependant, les switches d’accès et les leafs ne sont pas encore prĂŞts Ă accueillir des utilisateurs ou des services clients. Aucune information dans Netbox ne nous le permet encore.
Dans notre approche standardisĂ©e, chaque bâtiment est conçu pour accueillir un “client”. Un client peut ĂŞtre, par exemple, une Ă©quipe spĂ©cifique au sein de l’entreprise ou un prestataire externe. Ă€ chaque client, nous attribuerons un VLAN (et dans notre fabric VXLAN, un VNI correspondant).
Pour réaliser cette configuration client, nous utilisons un script dédié : Create_Fabric/add_customers.py. Celui-ci va nous guider pas à pas en nous demandant le VLAN et le VNI à attribuer, ainsi que le ou les bâtiments où sont basés nos clients. Voici un exemple de son exécution :
❯ uv run Create_Fabric/add_customers.py
Enter NetBox URL: http://localhost:8080
Enter NetBox API Token: 4e58e40e6b19d7f6cc53ae5665ca7ddd00558e71
Enter Customer Name: Orange
Enter VLAN ID (1-4094): 10
Enter VNI ID: 10010
Available Locations:
0: PA1
1: PA2
2: PA3
3: PA4
Select locations (comma-separated indices): 0,2
❯ uv run Create_Fabric/add_customers.py
Enter NetBox URL: http://localhost:8080
Enter NetBox API Token: 4e58e40e6b19d7f6cc53ae5665ca7ddd00558e71
Enter Customer Name: Purple
Enter VLAN ID (1-4094): 10
Enter VNI ID: 10010
Available Locations:
0: PA1
1: PA2
2: PA3
3: PA4
Select locations (comma-separated indices): 1,3Une fois ces informations fournies, le script se charge d’automatiser plusieurs actions dans Netbox :
- La création du tenant (représentant le client).
- L’attribution des bâtiments (locations) au tenant.
- L’allocation d’un prĂ©fixe /24 pour l’adressage IP du client.
- La configuration logique des éléments VXLAN/VLAN associés.
- L’attribution des interfaces spĂ©cifiques sur les Ă©quipements d’accès pour ce client.
Une fois Netbox correctement renseignĂ© avec toutes ces donnĂ©es clients, il devient alors possible d’en extraire la configuration rĂ©seau finale prĂŞte Ă l’emploi.
Générer les configurations avec Netbox et Jinja2
Maintenant qu’on a notre inventaire rĂ©seau au top dans Netbox, comment on dit Ă nos Ă©quipements comment se configurer ? C’est lĂ qu’interviennent les Render Config et les templates Jinja2 !
Templates
Les templates utilisés sont présents ici.
Les templates Jinja : nos recettes de configuration
-
Les Render Config, kĂ©sako ? Imagine Netbox comme un chef cuisinier qui a tous les ingrĂ©dients (nos Ă©quipements, leurs interfaces, leurs IPs, etc.). Les Render Config, c’est sa manière de transformer ces ingrĂ©dients en plats prĂ©parĂ©s, c’est-Ă -dire des fichiers de configuration pour nos Ă©quipements rĂ©seau.
-
Jinja2 : notre langage de recettes. Pour Ă©crire ces “recettes” de configuration, Netbox utilise un moteur puissant appelĂ© Jinja2, un peu comme un langage de programmation simple qui nous permet de crĂ©er des modèles de configuration dynamiques. On peut y mettre des “trous” (des variables) qui seront remplis par les informations de nos Ă©quipements dans Netbox.
-
Un petit coup d’Ĺ“il Ă une recette. Prenons un exemple de template Jinja2 pour un de nos leafs :
hostname {{ device.name }} {% if device.custom_fields.ASN %} router bgp {{ device.custom_fields.ASN }} router-id {{ device.primary_ip4.address.split('/')[0] }} {% endif %} interface Loopback0 ip address {{ device.primary_ip4.address }} {% for interface in device.interfaces %} interface {{ interface.name }} description {{ interface.description }} {% if interface.connected_interface %} no shutdown {% endif %} {% endfor %}Vous voyez les trucs entre doubles accolades
{{ ... }}? Ce sont nos variables ! Par exemple,{{ device.name }}sera remplacé par le nom de notre leaf, et{{ interface.name }}par le nom de chaque interface. On peut même faire des conditions ({% if ... %}) et des boucles ({% for ... %}) pour adapter la configuration. -
Comment Netbox prépare le plat. Quand on demande à Netbox de générer la configuration pour un équipement (disons, notre
pa01_lf1_00), voici ce qu’il se passe :- Il va chercher toutes les infos sur ce leaf : son nom, ses interfaces, ses IPs, ses connexions, son ASN, etc.
- Il prend le template Jinja2 qu’on a associĂ© au rĂ´le “leaf”.
- Il remplit tous les “trous” (les variables Jinja2) du template avec les infos spĂ©cifiques de notre
pa01_lf1_00. - Et hop ! Il nous sort un fichier de configuration texte prêt à être utilisé.
Tip
Lien vers le Cookbook ici
De Netbox au lab : on fait Ă la main pour l’instant
Maintenant qu’on sait comment Netbox gĂ©nère les configurations, voyons comment on les utilise dans notre lab Containerlab.
-
On jette un Ĺ“il Ă la configuration dans Netbox. Pour voir la configuration gĂ©nĂ©rĂ©e par Netbox pour un Ă©quipement, c’est simple :
- Dans l’interface de Netbox, on va dans Devices.
- On clique sur l’Ă©quipement qui nous intĂ©resse (par exemple, un de nos leafs).
- Et là , on a un onglet magique : Render Config ! En cliquant dessus, on voit la configuration que Netbox a générée pour cet équipement en utilisant le template Jinja2 et ses propres données.

-
La touche humaine dans Containerlab. Pour l’instant, on n’a pas de script qui envoie automatiquement ces configurations Ă nos Ă©quipements dans Containerlab. Donc, on va faire Ă l’ancienne (mais c’est bien suffisant pour la dĂ©mo) :
- On se connecte Ă chaque Ă©quipement cEOS de notre lab via SSH (par exemple, en utilisant l’extension VSCode Containerlab comme on l’a vu dans le cookbook).
- On copie la configuration qu’on a visualisĂ©e dans Netbox (l’onglet Render Config).
- Et on la colle dans l’interface de ligne de commande de l’Ă©quipement cEOS (en mode configuration, bien sĂ»r !).
-
Et après ? Cette Ă©tape de copier-coller n’est pas le sommet de l’automatisation, mais c’est une première Ă©tape pour voir comment Netbox peut devenir notre cerveau central. Plus tard, des outils comme Ansible ou NAPALM pourraient se connecter Ă Netbox, rĂ©cupĂ©rer ces configurations gĂ©nĂ©rĂ©es et les appliquer automatiquement Ă nos Ă©quipements.
Validation de la communication
Ping
Dans le cookbook, nous avons fait le choix de configurer 2 clients chacun dans 2 bâtiments différents, ce qui nous permet de réaliser un ping, pour rappel :
-
Orange :
- Sous-réseau : 10.0.0.0/24
- Hosts :
- PA1 : 10.0.0.10
- PA3 : 10.0.0.20
-
Purple
- Sous Réseau: 10.0.1.0/24
- Hosts:
- PA2: 10.0.1.10
- PA4: 10.0.1.20
Un simple “ping” nous permet de valider la connectivitĂ© entre les 2 sites :
/ # ifconfig eth1
eth1 Link encap:Ethernet HWaddr AA:C1:AB:49:55:B6
inet addr:10.0.0.10 Bcast:0.0.0.0 Mask:255.255.255.0
...
/ # ping 10.0.0.20
PING 10.0.0.20 (10.0.0.20): 56 data bytes
64 bytes from 10.0.0.20: seq=0 ttl=64 time=15.378 ms
64 bytes from 10.0.0.20: seq=1 ttl=64 time=4.349 ms
...Capture de paquet
Afin d’aller plus loin, il est aussi possible d’utiliser wireshark prĂ©sent de base dans le devcontainer avec l’aide de Edgeshark.
Pour plus d’information, je vous renvoie Ă l’article sur Mon premier Lab
Et ensuite, via VSCode, il est possible de lancer wireshark directement :


Conclusion
Netbox devient un alliĂ© solide pour automatiser le rĂ©seau VXLAN. La clĂ©, c’est de partir d’une base standardisĂ©e : c’est ce qui permet Ă Netbox de gĂ©nĂ©rer nos configurations presque tout seul grâce aux templates Jinja2.
On fait encore un peu de copier-coller sur la dernière étape, mais centraliser toutes nos infos dans Netbox est la première étape pour simplifier la gestion de notre réseau et ouvrir la porte à une automatisation complète. La suite : déployer ces configurations automatiquement et gérer des réseaux plus complexes.