Vous êtes sur la page 1sur 6

TP N5 :

Programmation d’un routeur Cisco via Netconf

Objectifs du TP
Ce TP vous aidera à démarrer avec les connexions NETCONF, l’envoi de configurations et la
récupération de données.
Vous apprendrez à accéder aux données de configuration et opérationnelles modélisées YANG sur vos
périphériques réseau. Utilisation de ncclient pour faire des requêtes NETCONF avec Python

Ressources nécessaires
- Python
- Accès à un routeur avec le système d’exploitation IOS XE version 16.6 ou supérieure. On utilisera un
routeur IOS XE sous réservation Sandbox.

Instructions:
Étape 1: Envoie de message RDP Hello avec SSH et NETCONF
1. Ouvrez une session NETCONF de base avec routeur à l’aide du ssh. Tapez la commande
suivante sur Terminal

ssh developer@10.10.20.48 -p 830 -s netconf

2. Le routeur répondra avec « hello» et un vaste contenu présentant ses « capacités ».

<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <capabilities>


<capability>urn:ietf:params:netconf:base:1.1</capability>
<capability>urn:ietf:params:netconf:capability:candidate:1.0</capability>
<capability>urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring</capability> <capability>urn:
ietf:params:xml:ns:yang:ietf-interfaces</capability> [sortie omise et modifiée pour plus de clarté]
</capabilities> <session-id>22540</session-id></hello>]]>]]>

Nous devons répondre avec un hello et les capacités que notre gestionnaire prend en charge.

3. Copiez collez le texte ci-dessous dans la fenêtre du terminal. Vous ne verrez aucune réponse,
mais vous avez maintenant créé une connexion NETCONF active à l’appareil.

<?xml version="1.0" encoding="UTF-8"?>


<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>]]>]]>

4. Fermeture de session Netconf-SSH


Pour mettre fin à la session, envoyez un message pour fermer l’opération. Collez le texte ci-
dessous sur Terminal

<?xml version="1.0" encoding="UTF-8"?>


<rpc message-id="1239123" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<close-session />
</rpc>
]]>]]>

Étape 3: Script Python pour obtenir la liste des capacités


Divers outils peuvent aider à configurer la communication NETCONF.
En voici quelques exemples :

● ncclient
● OpenDayLight
● Netopeer2
● ...
Dans ce TP, nous utilisons la bibliothèque Python ncclient.

-Commencez d’abord par installer les bibliotheques ncclient et xmltodict.


pip3 install ncclient xmltodict
1. Se connecter au routeur
-Maintenant, ouvrez un éditeur de texte simple (par exemple, Nano,Notepad++ ou Gedit), copiez
le code suivant et enregistrez-le sous le nom netconf.py.
from ncclient import manager

m = manager.connect(host="10.10.20.48",
port=830,
username="developer",
password="C1sco12345",
hostkey_verify=False)
print("Connected")

-Modifiez les paramètres en fonction de votre appareil. Si vous utilisez la Sandbox, vous n'avez
rien à modifier.
-Enfin, exécutez le script : python3 netconf.py
Nous importons ici notre bibliothèque python ncclient et créons une connexion entre notre
gestionnaire de réseau (script python) et le périphérique IOS XE. Ne supprimez pas ces lignes
pour l'ensemble du laboratoire. Ces lignes sont nécessaires pour chaque communication
NETCONF.
Pour l'instant, nous ne faisons que nous connecter au routeur sans rien faire.
2. Afficher les commandes avec NETCONF
Maintenant, continuons notre voyage NETCONF et faisons quelques commandes show avec notre
appareil IOS XE avec python et ncclient.
Pour obtenir des données du commutateur avec ncclient & NETCONF, nous utilisons la méthode
get_config .
Obtenir la configuration en cours d’exécution:
Pour obtenir la configuration d’exécution, utilisez la bibliothèque ncclient.
Ajoutez les lignes de code suivantes à votre script python existant. Nous mettons le code dans les
fonctions python et les appelons individuellement. En cas de doute, vérifiez le code complet dans DevNet
Code Exchange :
import xml.dom.minidom

def get_running_config():
netconf_reply = m.get_config(source='running')
netconf_data = xml.dom.minidom.parseString(netconf_reply.xml).toprettyxml()
print(netconf_data)

get_running_config()
Obtenir uniquement certaines parties spécifiques de la configuration IOS:
Dans ce scénario, nous voulons obtenir uniquement la version IOS et le nom d’hôte de la configuration de
périphérique. Ici, nous avons 2 options:
A) Demande de l’ensemble de la configuration
Vous pouvez demander l’ensemble de la configuration et extraire les paramètres du XML.
Pour ce faire, convertissez le XML en dictionnaire python avec la bibliothèque xmltodict. Dans cet
exemple, nous extrayons le nom d’hôte et la version IOS du modèle natif IOS XE YANG.
Ajoutez ces lignes de code à votre script python existant. Nous mettons le code dans les fonctions python
et les appelons individuellement. Commentez les appels de fonction précédents avec #.
import xmltodict

def get_hostname():
netconf_reply = m.get_config(source='running')
netconf_data = xmltodict.parse(netconf_reply.xml)
print("IOS Version: {}".format(netconf_data["rpc-reply"]["data"]["native"]["version"]))
print("Hostname: {}".format(netconf_data["rpc-reply"]["data"]["native"]["hostname"]))

get_hostname()

Ce code demande la configuration en cours d’exécution et convertit la réponse XML en dictionnaire


Python. Il imprime ensuite les variables en fonction de la structure du dictionnaire.
B) Utilisation d’un filtre NETCONF
L’autre approche, plus rapide, consiste à utiliser un filtre NETCONF. En définissant un filtre avec
XML, vous pouvez définir les paramètres qui seront demandés.
Ajoutez ces lignes de code à votre script python existant. Nous mettons le code dans les fonctions python
et les appelons individuellement. Commentez les appels de fonction précédents avec #.
def get_hostname_filter():
filter = '''
<filter xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<native xmlns="http://cisco.com/ns/yang/Cisco-IOS-XE-native">
<hostname></hostname>
<version></version>
</native>
</filter>
'''
netconf_reply = m.get_config(source='running', filter=filter)
netconf_data = xmltodict.parse(netconf_reply.xml)
print("IOS Version: {}".format(netconf_data["rpc-reply"]["data"]["native"]["version"]))
print("Hostname: {}".format(netconf_data["rpc-reply"]["data"]["native"]["hostname"]))

# get_hostname()
get_hostname_filter()

Ce code définit le filtre comme une chaîne et l’ajoute à la requête NETCONF en tant que filtre. Ensuite, il
analyse la réponse XML en tant que dictionnaire Python et imprime la sortie.
Explication: Dans l’étape précédente, nous avons défini les paramètres de connexion. Maintenant, nous
demandons la configuration en cours d’exécution avec la méthode get_config et récupérons une
arborescence XML (YANG-data). Avec la bibliothèque xml.dom.minidom, nous rendons la sortie XML
plus lisible. Notez que l’utilisation de l’étape xml.dom.minidom est facultative.

3. Modifier ou ajouter et enregistrer une configuration avec NETCONF


Pour modifier ou ajouter une configuration avec ncclient et NETCONF, nous utilisons la méthode
edit_config.
Modifier la configuration de l’interface (GigabitEthernet3):
Modifions maintenant la configuration d’une interface de l’appareil IOS XE. Nous désactivons
simplement l’interface. Dans un premier temps, nous définissons la configuration souhaitée en XML et
l’appliquons avec la méthode edit_config.
Ajoutez ces lignes de code à votre script python existant. Nous mettons le code dans les fonctions python
et les appelons individuellement. Commentez les appels de fonction précédents avec #.
def change_interface(user_selection):
int_status = user_selection

config = '''
<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<interfaces xmlns="urn:ietf:params:xml:ns:yang:ietf-interfaces">
<interface>
<name>GigabitEthernet3</name>
<enabled>false</enabled>
</interface>
</interfaces>
</config>
'''
config_dict = xmltodict.parse(config)

if int_status == int(1):
config_dict["config"]["interfaces"]["interface"]["enabled"] = "true"
config = xmltodict.unparse(config_dict)
netconf_reply = m.edit_config(target='running', config=config)
print("Did it work? {}".format(netconf_reply.ok))

# change_interface(0) #disable
change_interface(1) #enable
Dans ce code, nous définissons d’abord la configuration en XML, puis nous convertissons le code XML
en dictionnaire Python (xmltodict.parse). Si nous définissons plutôt int_status à 1, l’interface sera activée
(nous changerons false dans les balises <enabled></enabled>true) et convertirons le dictionnaire Python
en XML (xmltodict.unparse). Nous appliquons ensuite l’extrait de configuration avec edit_config et
définissons la configuration XML.
Exercice supplémentaire: Pour plus de pratique, vérifiez si l’interface est activée ou désactivée, en
utilisant uniquement NETCONF et Python.
Enregistrer la configuration en cours d’exécution:
Jusqu’à présent, nous n’avons modifié que la configuration IOS en cours d’exécution. Maintenant, nous
allons l’enregistrer (copier running-config startup-config) avec la commande NETCONF.
Commentez les appels de fonction précédents et ajoutez ces lignes :
import lxml.etree as ET

def save_running_config():
rpc_body = '''<cisco-ia:save-config xmlns:cisco-ia="http://cisco.com/yang/cisco-ia"/>'''
netconf_reply = m.dispatch(ET.fromstring(rpc_body)).xml
print("Did it work? {}".format(netconf_reply))

save_running_config()

Vous aimerez peut-être aussi