Séance 02 Python pour l'automatisation des réseaux PDF
Document Details
Uploaded by JudiciousHeliotrope3659
Université Moulay Ismail - École Supérieure de Technologie
Tags
Related
- 11_Part 2-Lect-1-Intro_Computer networks and Internet.pdf
- BMAN73701 Programming in Python for Business Analytics - Week 5: Lecture 1 Intro to Machine Learning PDF
- Cours Python - Programmations: Concepts Fondamentaux - Pratique (PDF)
- Lab Report No. 7 on Siamese Networks - Kyiv Polytechnic Institute - 2024 PDF
- Network Programming Control Flow Functions OOP in Python PDF
- Network Programming: Socket Programming PDF
Summary
Ce document présente une séance sur l'automatisation de réseaux en utilisant Python et des bibliothèques comme Paramiko, Netmiko et Napalm. Il décrit l'introduction, les exemples d'utilisation et les bibliothèques Python pour l'interaction avec les équipements réseau. Il aborde également le fonctionnement de Paramiko et Netmiko et inclut des exemples de code pour se connecter à des équipements réseau.
Full Transcript
# Programmabilité des réseaux ## Université Moulay Ismail - École Supérieure de Technologie **Matière:** programmable des réseaux **Filière:** IA **Année universitaire:** 2023-2024 **Professeur:** H. Hantouti ## Plan - Introduction - Python pour l'automatisation des réseaux - Bibliothèques py...
# Programmabilité des réseaux ## Université Moulay Ismail - École Supérieure de Technologie **Matière:** programmable des réseaux **Filière:** IA **Année universitaire:** 2023-2024 **Professeur:** H. Hantouti ## Plan - Introduction - Python pour l'automatisation des réseaux - Bibliothèques python - Netmiko - Paramiko - Napalm ## Introduction ## Pourquoi Python? - Python semble avoir la communauté la plus large (à ce jour) pour le domaine des réseaux - utiliser (et contribuer) le travail effecue par cette communauté collective pour vous faire gagner du temps. - Python et sa communauté de développeurs disposent de nombreuses ressources que vous pouvez appliquer un large ventail de taches professionnelles. - vous pouvez utiliser Python pour creer des scripts qui peuvent s'exécuter à différents endroits pour répondre aux besoins de votre cas d'utilisation (ordinateur Linux/Windows/Mac, VM, conteneur...). ## Exemples d'utilisation de Python pour l'automatisation des réseaux - **Configuration d'équipements en masse:** Utiliser Netmiko pour configurer des centaines de routeurs avec une seule commande. - **Création d'un système de surveillance de réseau:** Utiliser scapy pour analyser le trafic réseau et alerter en cas d'anomalie. - **Développement d'une API pour gérer les équipements réseau:** Utiliser Flask ou Django pour créer une API RESTful pour contrôler les équipements réseau à distance. - **Automatisation des tests de pénétration:** Utiliser scapy ou autres outils pour simuler des attaques et évaluer la sécurité du réseau. ## Bibliothèques python pour l'interaction avec les équipements réseau ### Paramiko - C'est la base de nombreuses autres bibliothèques réseau en Python. - Elle fournit une implémentation Python du protocole SSH. - Elle permet d'exécuter des commandes à distance, de transférer des fichiers et de gérer des connexions SSH. - Paramiko est très flexible et personnalisable, mais elle nécessite une certaine connaissance du protocole SSH. ### Netmiko - Construit sur Paramiko, Netmiko offre une interface plus intuitive et spécifique aux équipements réseau. - Elle supporte un grand nombre de modèles de routeurs et de commutateurs de différents fabricants (Cisco, Juniper, etc.). - Simplifie la syntaxe pour envoyer des commandes, récupérer les résultats et gérer les erreurs courantes dans un environnement réseau. ### Napalm - Napalm (Network Automation and Programming Abstraction Layer with Multiple Vendors). - C'est une bibliothèque qui fournit une interface commune pour configurer et gérer différents types d'équipements réseau, en masquant les différences de commandes entre les différents fournisseurs. ## Bibliotheque Paramiko - Paramiko est une implémentation purement Python du protocole SSHv2... - Il fournit les bases de la bibliothèque SSH de haut niveau, que nous vous recommandons d'utiliser pour les cas d'utilisation client courants tels que l'exécution de commandes shell à distance ou le transfert de fichiers. - site officiel ## Interprétation de commandes! (Paramiko) - Autrement dit: comment un programme paramiko est compris par un peripherique reseau? - Paramiko ne peut pas être directement "compris" par un périphérique réseau. - Paramiko est une bibliothèque Python plus bas niveau qui fournit une implémentation SSH. ## Comment fonctionne Paramiko? - **Établissement d'une Connexion SSH**: - Paramiko établit une connexion sécurisée (SSH) avec le périphérique réseau en utilisant les informations d'authentification fournies (hôte, port, utilisateur, mot de passe ou clés SSH). - Cette connexion crée un canal sécurisé entre votre script Python et le périphérique distant. - **Envoi de Commandes**: - Une fois la connexion établie, vous envoyez des commandes en texte brut via ce canal. Ces commandes sont les mêmes que celles que vous taperiez manuellement dans un terminal SSH. - Par exemple, pour afficher la configuration d'un routeur Cisco, vous enverriez la commande show running-config. - **Réception des Sorties**: - Le périphérique réseau exécute la commande et renvoie la sortie, également en texte brut, via le canal SSH. - Paramiko capture cette sortie et la met à votre disposition dans votre script Python. ### Paramiko: Connexion simple et exécution d'une commande ```python import paramiko # Création d'un client SSH ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Connexion au serveur (remplacer par vos informations) ssh.connect('votre_serveur', username='votre_utilisateur', password='votre_mot_de_passe') # Exécution d'une commande stdin, stdout, stderr = ssh.exec_command('ls -la') print(stdout.read().decode('utf-8')) # Fermeture de la connexion ssh.close() ``` ### Paramiko: Connexion simple et exécution d'une commande à un equipement reseau ```python import paramiko # Création du client SSH ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Connexion au routeur (remplacez par vos informations) ssh.connect('192.168.1.1', username='cisco', password='votre_mot_de_passe') # Exécution d'une commande de configuration stdin, stdout, stderr = ssh.exec_command('configure terminal \n interface GigabitEthernet0/0 \n no shutdown\n end') # Affichage de la sortie (optionnel) print(stdout.read().decode('utf-8')) # Fermeture de la connexion ssh.close() ``` ## Bibliothèque Netmiko - Cette bibliothèque est spécifiquement conçue pour interagir avec des équipements réseau (routeurs, commutateurs) via des protocoles comme SSH, Telnet, HTTP. - Elle permet d'envoyer des commandes, de récupérer des configurations et de gérer les connexions de manière efficace. - Auteur: https://github.com/ktbyers - Tutoriel: https://pynet.twb-tech.com/blog/netmiko-python-library.html ## Peripheriques supportés: - Arista VEOS - Cisco IOS - Cisco IOS-XE - Cisco IOS-XR - Cisco NX-OS - Cisco SG300 - Juniper Junos - Linux Pour la liste complete visitez Liste ## Bibliothèques pour l'interaction avec les équipements réseau: Netmiko ### Examples: (https://github.com/ktbyers/netmiko/blob/develop/EXAMPLES.md) ```python from netmiko import ConnectHandler from getpass import getpass net_connect = ConnectHandler( device_type="cisco_ios", host="cisco1.lasthop.io", username="pyclass", password=getpass(), ) print(net_connect.find_prompt()) net_connect.disconnect() ``` ### Examples: (https://github.com/ktbyers/netmiko/blob/develop/EXAMPLES.md) •Enable mode ```python from netmiko import ConnectHandler from getpass import getpass password = getpass() secret = getpass("Enter secret: ") cisco1 = { "device_type": "cisco_ios", "host": "cisco1.lasthop.io", "username": "pyclass", "password": password, "secret": secret, } net_connect = ConnectHandler(**cisco1) # Call 'enable()' method to elevate privileges net_connect.enable() print(net_connect.find_prompt()) net_connect.disconnect() ``` ### Examples: (https://github.com/ktbyers/netmiko/blob/develop/EXAMPLES.md) ```python nxos1 = { "device_type": "cisco_nxos", "host": "nxos1.lasthop.io", "username": "pyclass", "password": password, } srx1 = { "device_type": "juniper_junos", "host": "srx1.lasthop.io", "username": "pyclass", "password": password, } for device in (cisco1, cisco2, nxos1, srx1): net_connect = ConnectHandler(**device) print(net_connect.find_prompt()) net_connect.disconnect() ``` ## Bibliothèques pour l'interaction avec les équipements réseau: Netmiko ### Examples: Configuration Backup Script source ```python from netmiko import ConnectHandler import getpass passwd = getpass.getpass('Please enter the password: ') file_dir = '/Users/suresh/Documents/config- backup/backups' switch_list = ['192.168.10.10', 'core- switch-01', 'test_switch'] device_list = [] for ip in switch_list: device = { "device_type": "cisco_ios", "host": ip, "username": "suresh", "password": passwd, "secret": passwd # Enable password } device_list.append(device) for device in device_list: host_name = device['host'] connection = ConnectHandler(**device) show_run = connection.send_command('show run') with open(f"{file_dir}/show_run_{host_name}.txt", 'w') as f: f.write(show_run) ``` ## Napalm ## Napalm - NAPALM (Network Automation and Programmability Abstraction Layer with Multivendor support). - C'est une bibliothèque Python qui fournit une interface commune pour gérer différents types d'équipements réseau. - Elle utilise la bibliotheque Paramiko pour établir les connexions SSH et exécuter les commandes sur les équipements. - Documentation officielle: https://napalm.readthedocs.io/ - Référentiel GitHub: https://github.com/napalm-automation/napalm ## Napalm - **Utilisé par des outils d'orchestration et de configuration** - Ansible: Un des outils d'automatisation les plus populaires, utilise NAPALM pour gérer la configuration des équipements réseau. - SaltStack: intègre NAPALM pour fournir des modules de gestion de réseau. Cela permet d'automatiser des tâches telles que la collecte d'informations, la configuration et le déploiement de services réseau. ## Napalm - **Utilisé par des plateformes de gestion de réseau** - NetBox: Une plateforme populaire pour la documentation et la gestion d'infrastructures réseau. NetBox peut s'intégrer avec NAPALM pour automatiser certaines tâches, comme la découverte d'équipements et la validation de la configuration. - Nornir: Un framework Python pour l'automatisation réseau qui utilise NAPALM comme backend pour interagir avec les équipements. Nornir offre une grande flexibilité et permet de créer des workflows complexes. ## Napalm - **Exemple:** Récupérer les informations d'un appareil ```python from napalm import get_network_driver # Informations de connexion device = { 'hostname': '192.168.1.1', 'username': 'cisco', 'password': 'votre_mot_de_passe', 'device_type': 'cisco_ios' } # Connexion à l'appareil et récupération des faits driver = get_network_driver(device['device_type']) net_connect = driver(**device) output = net connect.aet facts() ``` ## Napalm - **Exemple:** Configurer une interface ```python # (même code de connexion que l'exemple 1) # Configurer une interface config = {'interface': {'FastEthernet0/1': {'ip_address': '192.168.2.1', 'subnet':'255.255.255.0'}}} net_connect.load_merge_candidate(config=config) net_connect.commit_config() ``` ## Napalm: Exemple de code avec multiple vendeurs ```python from napalm import get_network_driver # Liste des équipements avec leurs informations de connexion devices = [ { 'hostname': 'cisco1', 'driver': 'ios', 'ip': '192.168.1.1', 'username': 'admin', 'password': 'password' }, { 'hostname': 'juniper1', 'junos', 'admin', }, 'driver': 'ip':'192.168.1.2', 'username': 'password': 'password' } # Fonction pour récupérer la table ARP et l'afficher def get_arp_table(device): ""'"'Récupère la table ARP d'un équipement et l'affiche."""" driver = get_network_driver(device['driver']) with driver(device['hostname'], device['username'], device['password'], device['ip']) as netconnect: arp_table = netconnect.get_arp_table() print(f"Table ARP de {device['hostname']}:") for entry in arp_table: print(entry) # Boucle pour parcourir la liste des équipements for device in devices: get_arp_table(device) ```