Script Python réseau : comment automatiser vos switchs Cisco

Script Python réseau : comment automatiser vos switchs Cisco

Image by: Brett Sayles

Pourquoi la programmabilité réseau transforme votre métier

Saviez-vous que 78% des pannes réseau sont causées par des erreurs de configuration manuelle selon Gartner? Dans un monde où les infrastructures gagnent en complexité, la programmabilité réseau avec Python devient un impératif pour les administrateurs système. Imaginez exécuter des tâches répétitives sur des centaines d’appareils en quelques secondes plutôt qu’en heures. Ce tutoriel vous guide pas à pas dans l’automatisation réseau via la bibliothèque Netmiko, spécialement conçue pour interagir avec les équipements Cisco, Juniper et autres. Vous apprendrez à configurer votre environnement, développer un script robuste de sauvegarde de configurations, et sécuriser vos accès SSH. Une compétence indispensable pour moderniser votre pratique et gagner en efficacité opérationnelle.

Configuration de votre environnement python pour netmiko

Avant de plonger dans l’automatisation, préparons votre station de travail. Netmiko repose sur Python 3.6+ et nécessite quelques dépendances clés. Commencez par installer Python via le site officiel, en cochant « Add to PATH » durant l’installation. Ouvrez ensuite votre terminal et créez un environnement virtuel :

  1. python -m venv netmiko-env (crée un environnement isolé)
  2. netmiko-env\Scripts\activate (Windows) ou source netmiko-env/bin/activate (Linux/macOS)
  3. pip install netmiko cryptography (cryptography chiffrera vos identifiants)

Vérifiez l’installation avec un script test :

import netmiko
print(netmiko.__version__) # Doit afficher 4.1.2 ou supérieur

Netmiko supporte plus de 25 fournisseurs réseau. Voici sa compatibilité avec les principaux OS :

Constructeur OS supportés Protocol
Cisco IOS, IOS-XE, NX-OS, ASA SSH/Telnet
Juniper Junos SSH
HP ProCurve, Comware SSH
Fortinet FortiOS SSH

Dépannage courant

Si pip échoue sur Windows, installez les outils de build C++. Les erreurs de dépendances se résolvent généralement par pip install -U setuptools wheel.

Écriture d’un script de sauvegarde automatique

Automatiser les sauvegardes de configuration prévient les catastrophes. Voici un script complet qui récupère les configurations via SSH et les stocke localement avec horodatage :

from netmiko import ConnectHandler
from datetime import datetime

# Définition des paramètres de l’appareil
switch = {
  ‘device_type’: ‘cisco_ios’,
  ‘host’: ‘192.168.1.1’,
  ‘username’: ‘admin’, # À remplacer par des identifiants sécurisés
  ‘password’: ‘secret’,
  ‘port’: 22,
}

try:
  # Connexion SSH
  with ConnectHandler(**switch) as net_connect:
    # Exécution de la commande
    output = net_connect.send_command(‘show running-config’)
    
    # Génération du nom de fichier
    date_str = datetime.now().strftime(« %Y%m%d_%H%M%S »)
    filename = f »config_{switch[‘host’]}_{date_str}.txt »
    
    # Sauvegarde locale
    with open(filename, ‘w’) as backup_file:
      backup_file.write(output)
    print(f »Backup réussi : {filename} »)

except Exception as e:
  print(f »Échec de sauvegarde : {str(e)} »)

Étapes clés expliquées

  • ConnectHandler : Établit la connexion SSH avec le dictionnaire de paramètres
  • send_command : Exécute toute commande en mode enable
  • Gestion des erreurs : Le bloc try/except capture les échecs de connexion ou timeout
  • Horodatage : Garantit l’unicité des fichiers avec la date/heure exacte

Pour étendre ce script à plusieurs appareils, créez une liste de dictionnaires et une boucle. Consultez notre guide d’automatisation avancée pour des techniques d’exécution parallèle.

Gestion sécurisée des identifiants ssh

Stocker des mots de passe en clair dans les scripts est inacceptable. Utilisez plutôt le module Python cryptography :

  1. Générez une clé de chiffrement : from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())
  2. Créez un fichier credentials.py :

    from cryptography.fernet import Fernet

    # À exécuter UNE FOIS pour générer la clé
    # key = Fernet.generate_key()
    # with open(« secret.key », « wb ») as key_file:
    #     key_file.write(key)

    def encrypt_password(password):
      with open(« secret.key », « rb ») as key_file:
        key = key_file.read()
      return Fernet(key).encrypt(password.encode())

    def decrypt_password(encrypted_password):
      with open(« secret.key », « rb ») as key_file:
        key = key_file.read()
      return Fernet(key).decrypt(encrypted_password).decode()

  3. Utilisation dans votre script principal :

    from credentials import decrypt_password

    encrypted_pwd = b’gAAAAABk…’ # Remplacer par votre mot de passe chiffré
    switch[‘password’] = decrypt_password(encrypted_pwd)

Meilleures pratiques de sécurité :

  • Restreignez les permissions du fichier secret.key (chmod 600)
  • Ne versionnez JAMAIS secret.key dans Git
  • Utilisez des comptes SSH à privilèges limités
  • Auditez régulièrement les accès avec nos solutions de supervision

Automatisation avancée et bonnes pratiques

Pour industrialiser vos scripts, adoptez ces stratégies éprouvées :

Gestion centralisée des inventaires

Utilisez un fichier YAML (devices.yaml) pour décrire votre parc :

devices:
  – name: core-switch1
    host: 10.1.1.1
    type: cisco_ios
  – name: edge-router2
    host: 10.1.1.2
    type: juniper_junos

Chargez-le dans Python avec PyYAML : import yaml; devices = yaml.safe_load(open('devices.yaml'))['devices']

Journalisation robuste

Ajoutez ceci en début de script pour tracer les opérations :

import logging

logging.basicConfig(
  filename=’netmiko_global.log’,
  level=logging.DEBUG,
  format=’%(asctime)s – %(levelname)s – %(message)s’
)

Gestion des erreurs réseau

Netmiko lève des exceptions spécifiques à intercepter :

  • NetmikoTimeoutException : L’appareil ne répond pas
  • NetmikoAuthenticationException : Échec d’authentification
  • NetmikoTimeoutException : Problème de connexion TCP

Implémentez des mécanismes de retry avec Tenacity pour les instabilités réseau passagères.

Frequently asked questions

Netmiko fonctionne-t-il avec les équipements non-Cisco ?

Absolument ! Netmiko supporte plus de 25 fournisseurs dont Arista, HP, Juniper, et Fortinet. Consultez la liste officielle des plates-formes supportées. Pour les appareils exotiques, vous pouvez étendre les classes existantes.

Comment éviter les déconnexions SSH durant les longues opérations ?

Activez le keepalive SSH dans ConnectHandler : ajoutez ‘global_delay_factor’: 2 à vos paramètres. Pour les commandes très longues, utilisez send_command_timing() plutôt que send_command().

Puis-je utiliser Netmiko avec Ansible ?

Oui, Netmiko peut compléter Ansible. Utilisez le module netmiko_send_command dans vos playbooks. Pour les workflows complexes, écrivez des modules Ansible custom en Python exploitant Netmiko.

Quelles alternatives à Netmiko existent ?

Paramiko (plus bas niveau), NAPALM (abstraction multi-vendeur), et Scrapli (haute performance). Netmiko reste la plus accessible pour débuter. Voir notre comparatif détaillé.

Conclusion

La programmabilité réseau avec Python et Netmiko n’est plus un luxe mais une compétence essentielle pour tout administrateur système. Vous maîtrisez désormais les fondamentaux : configuration de l’environnement, création de scripts de sauvegarde automatisée, et sécurisation des accès SSH. Commencez par automatiser une tâche récurrente cette semaine – la sauvegarde de configurations est un excellent point d’entrée. Progressivement, étendez vos compétences vers l’analyse de configurations ou le déploiement massif de changements. Explorez notre formation avancée Python pour réseaux pour transformer radicalement votre efficacité opérationnelle. L’automatisation n’attend pas – votre premier script vous attend !