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)
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 :
- lit l’état des interfaces (
show ip interface brief,use_textfsm=True), - identifie les interfaces
administratively down, - active automatiquement celles qui devraient être up (à définir dans une liste Python), en envoyant
no shutdownuniquement 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.pyfonctionnel avec gestion d’erreurs.
Points de vérification
- La sortie
use_textfsm=Trueest correctement exploitée (accès par clé, pas par découpage manuel de texte). -
check_and_fix.pyne 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é.