(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
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
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 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
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.
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.
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