TP 13 : Netmiko – Le pont vers le réseau Legacy

Module : 4 – Approche NetDevOps et Orchestration globale Durée indicative : 2h Prérequis : partie théorique du Module 4, le routeur Cisco IOS-XE des TP 9/10 accessible en SSH, Python 3, pip install netmiko

Objectifs

  • Automatiser un équipement via sa CLI (SSH), sans API moderne.
  • Extraire (scraper) des états opérationnels à partir de texte.
  • Appliquer une configuration conditionnelle selon l’état lu.

Contexte

Simule un équipement legacy dépourvu d’API : seule la CLI est disponible. Vous réutilisez le routeur Cisco IOS-XE des TP précédents en l’administrant uniquement en SSH, comme s’il n’exposait ni RESTCONF ni NETCONF.

Étape 1 – Connexion et commande simple

from netmiko import ConnectHandler

device = {
    "device_type": "cisco_ios",
    "host": "192.168.1.1",
    "username": "api-user",
    "password": "VotreMotDePasse",
}

with ConnectHandler(**device) as conn:
    output = conn.send_command("show ip interface brief")
    print(output)

Étape 2 – Extraction structurée (scraping)

Sortie CLI brute vs sortie structurée via TextFSM Sortie CLI brute vs sortie structurée via TextFSM TextFSM transforme un texte brut non structuré en liste de dictionnaires Python exploitables par clé.

Netmiko peut retourner une sortie déjà parsée grâce à TextFSM (templates communautaires ntc-templates) :

with ConnectHandler(**device) as conn:
    parsed = conn.send_command("show ip interface brief", use_textfsm=True)
    for iface in parsed:
        print(iface["intf"], iface["ipaddr"], iface["status"])

Comparez la sortie brute (étape 1) et la sortie structurée (étape 2) : notez la différence de facilité d’exploitation.

Étape 3 – Configuration via CLI

config_commands = [
    "interface Loopback300",
    "description Configured by Netmiko",
    "ip address 10.30.30.1 255.255.255.255",
]
with ConnectHandler(**device) as conn:
    output = conn.send_config_set(config_commands)
    print(output)
    conn.save_config()

Étape 4 – Configuration conditionnelle

Écrivez un script check_and_fix.py qui :

  1. lit l’état des interfaces (show ip interface brief, use_textfsm=True),
  2. identifie les interfaces administratively down,
  3. active automatiquement celles qui devraient être up (à définir dans une liste Python), en envoyant no shutdown uniquement si nécessaire (idempotence).

Étape 5 – Gestion des erreurs et robustesse

Ajoutez une gestion des exceptions Netmiko (NetmikoTimeoutException, NetmikoAuthenticationException) autour de la connexion, avec un message clair en cas d’échec.

from netmiko import NetmikoTimeoutException, NetmikoAuthenticationException

try:
    with ConnectHandler(**device) as conn:
        ...
except NetmikoTimeoutException:
    print("Équipement injoignable")
except NetmikoAuthenticationException:
    print("Authentification refusée")

Rendu attendu

  • Scripts Python versionnés (connexion simple, scraping structuré, configuration conditionnelle).
  • Une capture comparant sortie brute vs sortie structurée (TextFSM).
  • Le script check_and_fix.py fonctionnel avec gestion d’erreurs.

Points de vérification

  • La sortie use_textfsm=True est correctement exploitée (accès par clé, pas par découpage manuel de texte).
  • check_and_fix.py ne modifie que les interfaces réellement en écart par rapport à l’état désiré.
  • Les exceptions de connexion sont interceptées et un message clair est affiché.