[PYTHON] J'ai essayé de toucher la bibliothèque d'API de contrôle de routeur multi-fournisseur NAPALM

(Ajout) J'ai écrit la suite de cet article le 24 décembre 2016. Il y a une description plus détaillée, alors jetez un œil si vous êtes intéressé. Suite, j'ai touché à la bibliothèque d'API de contrôle de routeur multifournisseur NAPALM

Présentation de NAPALM

Une bibliothèque d'API de contrôle de routeur appelée NAPALM a été introduite au NANOG64. https://www.nanog.org/meetings/abstract?id=2588

NAPALM (la lecture est "Napalm" en japonais. Il s'appelait "Napalm" dans NANOG) est une bibliothèque Python d'OSS fournie par Spotify, et son nom est "Network Automation and". Cela semble être une abréviation pour "Programmability Abstraction Layer with Multivendor support". Le code source est disponible sur github. https://github.com/spotify/napalm

Comme son nom l'indique, NAPALM peut contrôler les appareils des multiples fabricants suivants avec une API unifiée. Le nombre de systèmes d'exploitation de routeur compatibles peut augmenter à l'avenir.

OS de routeur pris en charge

--EOS du système d'exploitation du commutateur Arista --JUNOS, un OS de routeur fait par Juniper --Routeur Cisco OS IOS-XR --Fortinet appliance OS FortiOS

Ce que vous pouvez faire avec NAPALM

En ce qui concerne le journal de validation sur Github, le développement à grande échelle a commencé vers mars 2015 et les fonctions implémentées se concentrent sur la partie paramétrage de la configuration. NAPALM lui-même semble positionner le logiciel actuel en version 0.12. (Il est décrit dans setup.py)

Matériel de présentation NANOG64 présente les fonctions de NAPOLM comme suit.

Supported Methods v0.1

Supported Methods v0.2(beta)

Au 7 juin 2015, il semble que seule la partie v0.1 ait été implémentée.

En plus de ceux-ci, un module d'extension pour appeler à partir de l'outil de gestion de configuration Ansible est fourni, et NANOG64 a démontré que la configuration utilisant Ansible est soumise / validée au routeur.

Ansible Modules

L'annonce et la démonstration de la journée sont disponibles sur Chaîne Youtube NANOG.

J'ai essayé d'utiliser NAPALM

J'ai continué en regardant le Tutoriel de documentation officielle pour comprendre comment utiliser napalm.

L'installation de NAPALM est simple.

pip install napalm 

Si vous n'avez jamais utilisé pip, veuillez installer pip en vous référant à cet article.

Les premiers packages à inclure dans Python setuptools et pip http://www.lifewithpython.com/2012/11/Python-package-setuptools-pip.html

Essayé avec IOS-XR

Essayons-le d'abord avec Cisco IOS-XR. Dans le module appelé pyIOSXR (https://github.com/fooelisa/pyiosxr) utilisé dans NAPALM, API XML CISCO /iosxr_r4-1/xml/programming/guide/xl41apidoc/xl41over.html) est utilisé pour implémenter les paramètres IOS-XR. Par conséquent, afin d'autoriser l'entrée XML sur le routeur exécutant IOS-XR, il est nécessaire de définir à l'avance la configuration suivante. La valeur du minuteur est appropriée, changez-la si nécessaire.

xml agent tty
 session timeout 30
!

J'ai créé l'application Python suivante en me référant à Official Document Tutorial.

En tant que flux d'application, définissez et saisissez un fichier de configuration (change_hostname_configIOSXR.txt) qui change le nom d'hôte du routeur en `` routeur1_changed_by_NAPALM '' sur le routeur, vérifiez la différence de configuration, et s'il n'y a pas de problème, validez ou supprimez. Il est devenu. Je voulais vérifier la progression de chacun pour voir si cela fonctionnait correctement, donc ça a l'air mauvais, mais j'ai beaucoup de déclarations imprimées.

run_napalm.py


#! /usr/bin/env python

from napalm import get_network_driver


driver = get_network_driver('IOSXR')
print 'Step.1 Create ios-xr instance : OK'


device = driver('192.168.0.1', 'test_user', 'test_passwd')
print 'Step.2 Set router information : OK'


device.open()
print 'Step.3 Open session : OK'


device.load_merge_candidate(filename='./change_hostname_configIOSXR.txt')
print 'Step.4 load_merge_candidate : OK'


print '### CHECK CANDIDATE CONFIG ###'
print device.compare_config()
print '### END CONFIG###'
print 'Step.5 Compare_config : OK'


print 'Do you commit? y/n'
choice = raw_input().lower()
if choice == 'y':
    device.commit_config()
    print 'Step.6 commit_config : OK'
elif choice == 'n':
    device.discard_config()
    print 'Step.6 Discard_config : OK'
else:
    print 'Please input y or n. Discard candidate config'
    device.discard_config()
    print 'Step.6 Discard_config : OK'


device.close()
print 'Step.7 Close session : OK'


print 'Successful !!'

change_hostname_configIOSXR.txt


hostname router1_changed_by_NAPALM

Tout d'abord, vérifiez l'état de configuration du routeur IOS-XR sur le routeur avant d'exécuter les outils ci-dessus.

RP/0/RSP0/CPU0:router1#show running-config

Sun Jun  7 10:53:33.157 JST
Building configuration...
!! IOS XR Configuration #####
!! Last configuration change at Sun Jun  7 10:42:57 2015 by test_user
!
hostname router1
clock timezone JST 9
logging trap debugging
logging console debugging
...
...
...

Ensuite, exécutons l'outil créé (run_napalm.py). Une fois exécuté, le résultat sera affiché comme indiqué ci-dessous.

$ python run_napalm.py

Step.1 Create ios-xr instance : OK
Step.2 Set router information : OK
Step.3 Open session : OK
Step.4 load_merge_candidate : OK
### CHECK CANDIDATE CONFIG ###
---
+++
@@ -3 +3 @@
-hostname router1
+hostname router1_changed_by_NAPALM
@@ -280,0 +281 @@
+!

### END CONFIG###
Step.5 Compare_config : OK
Do you commit? y/n
y
Step.6 commit_config : OK
Step.7 Close session : OK
Successful !!

Après avoir exécuté l'outil, vérifiez si les paramètres sont réellement reflétés sur le routeur.

RP/0/RSP0/CPU0:router1_changed_by_NAPALM#show running-config
Sun Jun  7 10:59:42.313 JST
Building configuration...
!! IOS XR Configuration ######
!! Last configuration change at Sun Jun  7 10:56:07 2015 by test_user!
hostname router1_changed_by_NAPALM
clock timezone JST 9
logging trap debugging
logging console debugging
...
...
...

Il semble que le nom d'hôte du routeur IOS-XR puisse être modifié correctement. En utilisant les fonctions fournies par NAPALM, il était relativement facile d'écrire une application pour la configuration du routeur.

Je l'ai essayé avec JUNOS

Ensuite, essayez de changer le nom d'hôte du routeur JUNOS en utilisant presque le même script que le programme utilisé dans IOS-XR.

Le code source de l'application implémentée.

run_napalm.py



#! /usr/bin/env python

from napalm import get_network_driver

driver = get_network_driver('JUNOS')
print 'Step.1 Create junos instance : OK'

device = driver('192.168.0.2', 'test_user', 'test_passwd')
print 'Step.2 Set router information : OK'

device.open()
print 'Step.3 Open session : OK'

device.load_merge_candidate(filename='./change_hostname_configJUNOS.txt')
print 'Step.4 load_merge_candidate : OK'

print '### CHECK CANDIDATE CONFIG ###'
print device.compare_config()
print '### END CONFIG###'
print 'Step.5 Compare_config : OK'


print 'Do you commit? y/n'
choice = raw_input().lower()
if choice == 'y':
    device.commit_config()
    print 'Step.6 commit_config : OK'
elif choice == 'n':
    device.discard_config()
    print 'Step.6 Discard_config : OK'
else:
    print 'Please input y or n. Discard candidate config'
    device.discard_config()
    print 'Step.6 Discard_config : OK'


device.close()
print 'Step.7 Close session : OK'

print 'Successful !!'

Le résultat de l'exécution est ici.

$ python run_napalm.py

Step.1 Create junos instance : OK
Step.2 Set router information : OK
No handlers could be found for logger "paramiko.hostkeys"
Traceback (most recent call last):
  File "./run_napalm.py", line 14, in <module>
    device.open()
  File "/usr/lib/python2.7/site-packages/napalm/junos.py", line 32, in open
    self.device.open()
  File "/usr/lib/python2.7/site-packages/jnpr/junos/device.py", line 433, in open
    raise EzErrors.ConnectTimeoutError(self)
jnpr.junos.exception.ConnectTimeoutError: ConnectTimeoutError(192.168.0.2)

Cela a échoué. .. .. Il semble que la partie d'authentification de connexion de paramiko, qui est un module SSH, a échoué. Cela peut être dû à des paramètres insuffisants du routeur JUNOS (partie netconf?) Ou à un bug du programme, je vais donc continuer à enquêter.

Si quelqu'un peut bien travailler avec le routeur JUNOS, merci de me le faire savoir.

Impressions

Bien que la mise en œuvre de NAPALM ne fasse que commencer, le développement d'outils est devenu extrêmement simple car il est possible d'écrire des applications qui utilisent des routeurs sans connaître le modèle ou le fabricant. Bien que seule la fonction de paramétrage de configuration ait encore été implémentée, il semble que l'implémentation à ce stade puisse être suffisamment utilisée dans les situations où les mêmes paramètres sont saisis pour plusieurs routeurs.

Cependant, pour le moment, il semble que les fonctions et les bogues en cours d'implémentation soient également inclus, veuillez donc effectuer une vérification suffisante avant de l'utiliser.

En regardant dans le code source de NAPALM lui-même, ce n'est pas difficile par programme, et la partie de base (base.py) est d'environ 100 lignes, il semble donc que je puisse participer pleinement au développement même au niveau individuel. était.

Ce qui m'a surpris quand j'ai vu le code source de github, c'est que non seulement ce NAPALM mais aussi la plupart des pyIOSXR, pyEOS et pyFG appelés à l'intérieur ont été implémentés presque indépendamment par Auther David Barroso et Elisa Jasinska. C'était ce que je faisais. De ce projet, j'ai ressenti l'enthousiasme que "si le fabricant ne le prépare pas, créons l'API nous-mêmes!"

Recommended Posts

J'ai essayé de toucher la bibliothèque d'API de contrôle de routeur multi-fournisseur NAPALM
Suite ・ J'ai essayé de toucher la bibliothèque d'API de contrôle de routeur multifournisseur NAPALM
J'ai essayé la bibliothèque changefinder!
J'ai essayé le roman Naro API 2
J'ai essayé l'API du roman Naruro
J'ai essayé d'utiliser l'API checkio
J'ai essayé de toucher l'API COTOHA
J'ai essayé d'utiliser l'API BigQuery Storage
J'ai recherché dans la bibliothèque l'utilisation de l'API Gracenote
J'ai essayé d'accéder à l'API Qiita depuis le début
J'ai essayé d'utiliser l'API Google Cloud Vision
J'ai essayé d'utiliser la bibliothèque de programmation fonctionnelle toolz
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé de frapper l'API avec le client python d'echonest
[Première API COTOHA] J'ai essayé de résumer l'ancienne histoire
J'ai essayé de toucher l'API Qiita
J'ai essayé de sauvegarder l'historique des demandes d'API DRF avec django-request
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé l'API Google Cloud Vision pour la première fois
J'ai essayé d'obtenir diverses informations de l'API codeforces
[Pour les débutants] J'ai essayé d'utiliser l'API Tensorflow Object Detection
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
J'ai essayé d'utiliser l'API COTOHA (il y a aussi du code sur GitHub)
J'ai essayé le tutoriel TensorFlow 1er
J'ai essayé de créer l'API Quip
J'ai essayé le tutoriel TensorFlow 2ème
J'ai touché l'API de Tesla
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé d'appeler l'API de prédiction du modèle d'apprentissage automatique de WordPress
J'ai essayé de contrôler plusieurs servomoteurs MG996R en utilisant le servomoteur PCA9685.
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de résumer diverses phrases à l'aide de l'API de synthèse automatique "summpy"
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de toucher des méthodes liées au toucher dans le module de scène de pythonista
J'ai essayé de contrôler la bande passante et le délai du réseau avec la commande tc
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé de résumer la commande umask
J'ai essayé tensorflow pour la première fois
J'ai essayé de reconnaître le mot de réveil
J'ai essayé d'utiliser l'API de données YOUTUBE V3
Je suis tombé sur l'API Hatena Keyword
J'ai essayé l'outil de visualisation OSS, sur-ensemble
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
Python: j'ai essayé le problème du voyageur de commerce
J'ai essayé de jouer avec l'image avec Pillow
J'ai créé une API Web
J'ai essayé le framework de test Python Tornado
J'ai essayé d'extraire des expressions uniques avec la bibliothèque de traitement du langage naturel GiNZA
J'ai essayé Hello World avec un langage OS + C 64 bits sans utiliser de bibliothèque
J'ai essayé d'utiliser la bibliothèque Python "pykakasi" qui peut convertir des kanji en romaji.
Lorsque j'ai essayé d'utiliser l'API Computer Vision de Microsoft, j'ai reconnu le signe Galapagos "Stop"
J'ai essayé d'exécuter deux PWM matériels Jetson Nano à partir de la bibliothèque Jetson.GPIO Python.