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.py

config.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: 5

inventory/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_ios

inventory/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

Un échec isolé n’interrompt pas la collecte sur les autres équipements Un échec isolé n’interrompt pas la collecte sur les autres équipements 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.yaml gé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.