TP 14 : Nornir – Orchestration Multi-Constructeurs
Module : 4 – Approche NetDevOps et Orchestration globale
Durée indicative : 2h30
Prérequis : TP 5 (MikroTik), TP 9 (Cisco) et TP 12 (VyOS) accessibles simultanément, Python 3, pip install nornir nornir_netmiko nornir_utils
Objectifs
- Construire un inventaire Nornir décrivant un parc hétérogène.
- Exécuter une tâche identique en parallèle sur plusieurs constructeurs.
- Collecter et agréger les résultats d’une topologie hétérogène.
Contexte
Vous orchestrez en une seule exécution les trois équipements utilisés séparément dans les TP précédents : MikroTik CHR, VyOS et Cisco IOS-XE, tous administrables en SSH.
Étape 1 – Structure du projet
nornir-lab/
├── config.yaml
├── inventory/
│ ├── hosts.yaml
│ ├── groups.yaml
│ └── defaults.yaml
└── collect_inventory.pyconfig.yaml :
inventory:
plugin: SimpleInventory
options:
host_file: "inventory/hosts.yaml"
group_file: "inventory/groups.yaml"
defaults_file: "inventory/defaults.yaml"
runner:
plugin: threaded
options:
num_workers: 5inventory/hosts.yaml :
mikrotik1:
hostname: 192.168.56.10
groups: [mikrotik]
vyos1:
hostname: 192.168.56.20
groups: [vyos]
cisco1:
hostname: 192.168.56.30
groups: [cisco]inventory/groups.yaml :
mikrotik:
platform: mikrotik_routeros
vyos:
platform: vyos
cisco:
platform: cisco_iosinventory/defaults.yaml :
username: api-user
password: VotreMotDePasseÉtape 2 – Première tâche : collecte de version
from nornir import InitNornir
from nornir_netmiko.tasks import netmiko_send_command
from nornir_utils.plugins.functions import print_result
nr = InitNornir(config_file="config.yaml")
VERSION_CMD = {
"mikrotik": "/system resource print",
"vyos": "show version",
"cisco": "show version",
}
def get_version(task):
cmd = VERSION_CMD[task.host.groups[0].name]
task.run(task=netmiko_send_command, command_string=cmd)
result = nr.run(task=get_version)
print_result(result)Étape 3 – Filtrage par groupe
Exécutez une tâche uniquement sur les équipements Cisco :
cisco_hosts = nr.filter(platform="cisco_ios")
result = cisco_hosts.run(task=netmiko_send_command, command_string="show ip interface brief")
print_result(result)Étape 4 – Collecte d’inventaire simultanée
Écrivez collect_inventory.py qui interroge en parallèle les 3 équipements (adresses IP, interfaces actives) et regroupe le résultat dans un fichier inventaire_reseau.yaml structuré par équipement.
Étape 5 – Gestion des échecs partiels
vyos1 injoignable :
result.failed et result[host].exception signalent l’échec sans arrêter le script.
Simulez la panne d’un équipement (arrêtez temporairement la VM VyOS), relancez collect_inventory.py : le script doit continuer sur les deux autres équipements et signaler clairement l’échec du troisième (result.failed, result[host].exception).
Rendu attendu
- Le projet
nornir-lab/versionné (inventaire + scripts). - Le fichier
inventaire_reseau.yamlgénéré. - Une capture montrant la gestion d’un échec partiel sans interruption du script global.
Points de vérification
- Les trois plateformes répondent à la tâche de collecte de version avec la bonne commande par groupe.
- Le filtrage par groupe (
nr.filter) fonctionne correctement. - Un équipement injoignable n’interrompt pas la collecte sur les autres.