(Ergänzung) Ich habe die Fortsetzung dieses Artikels am 24. Dezember 2016 geschrieben. Es gibt eine detailliertere Beschreibung, schauen Sie also bitte vorbei, wenn Sie interessiert sind. Fortsetzung, ich habe die API-Bibliothek NAPALM für Router-Steuerungen mehrerer Hersteller berührt
Bei NANOG64 wurde eine Router-Steuerungs-API-Bibliothek namens NAPALM eingeführt. https://www.nanog.org/meetings/abstract?id=2588
NAPALM (auf Japanisch heißt es "Napalm". In NANOG wurde es "Napalm" genannt) ist eine Python-Bibliothek von OSS, die von Spotify bereitgestellt wird. Der Name lautet "Network Automation and". Es scheint eine Abkürzung für "Programmability Abstraction Layer with Multivendor Support" zu sein. Der Quellcode ist auf github verfügbar. https://github.com/spotify/napalm
Wie der Name schon sagt, kann NAPALM die Geräte der folgenden Hersteller mit einer einheitlichen API steuern. Die Anzahl kompatibler Router-Betriebssysteme kann in Zukunft zunehmen.
Unterstütztes Router-Betriebssystem
--EOS von Arista Switch OS --JUNOS, ein Router-Betriebssystem von Juniper
In Bezug auf das Festschreibungsprotokoll auf Github wurde um März 2015 mit der vollständigen Entwicklung begonnen, und die implementierten Funktionen konzentrieren sich auf den Teil der Konfigurationseinstellung. NAPALM selbst scheint die aktuelle Software als Version 0.12 zu positionieren. (Es ist in setup.py beschrieben)
NANOG64-Präsentationsmaterial führt die Funktionen von NAPOLM wie folgt ein.
Supported Methods v0.1
Supported Methods v0.2(beta)
Bis zum 7. Juni 2015 scheint nur der Teil v0.1 implementiert worden zu sein.
Zusätzlich wird ein Erweiterungsmodul zum Aufrufen über das Konfigurationsverwaltungstool Ansible bereitgestellt, und NANOG64 hat gezeigt, dass die Konfiguration, die Ansible verwendet, an den Router gesendet / festgeschrieben wird.
Ansible Modules
Die Ankündigung und Demonstration des Tages sind auf NANOG Youtube Channel verfügbar.
Ich habe das Offizielle Dokumentations-Tutorial durchgesehen, um zu verstehen, wie man Napalm verwendet.
Die Installation von NAPALM ist einfach.
pip install napalm
Wenn Sie pip noch nie verwendet haben, installieren Sie pip bitte anhand dieses Artikels.
Die ersten Pakete, die in Python setuptools und pip enthalten sind http://www.lifewithpython.com/2012/11/Python-package-setuptools-pip.html
Versuchen wir es zuerst mit Cisco IOS-XR. In dem in NAPALM verwendeten Modul pyIOSXR (https://github.com/fooelisa/pyiosxr) CISCO XML API /iosxr_r4-1/xml/programming/guide/xl41apidoc/xl41over.html) wird zum Implementieren von IOS-XR-Einstellungen verwendet. Daher ist es erforderlich, die folgende Konfiguration im Voraus festzulegen, um XML-Eingaben auf dem Router zuzulassen, auf dem IOS-XR ausgeführt wird. Der Timer-Wert ist angemessen. Ändern Sie ihn daher bei Bedarf.
xml agent tty
session timeout 30
!
Ich habe die folgende Python-Anwendung unter Bezugnahme auf Official Document Tutorial erstellt.
Legen Sie als Anwendungsablauf eine Konfigurationsdatei (change_hostname_configIOSXR.txt) fest und geben Sie sie ein, die den Hostnamen des Routers in "router1_changed_by_NAPALM'to" für den Router ändert. Überprüfen Sie den Konfigurationsunterschied. Wenn kein Problem vorliegt, schreiben Sie ihn fest oder verwerfen Sie ihn. Es ist geworden. Ich wollte den Fortschritt jedes einzelnen überprüfen, um festzustellen, ob es richtig funktioniert, daher sieht es schlecht aus, aber ich habe viele Druckanweisungen.
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
Überprüfen Sie zunächst den Konfigurationsstatus des IOS-XR-Routers auf dem Router, bevor Sie die oben genannten Tools ausführen.
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
...
...
...
Führen Sie als Nächstes das erstellte Tool (run_napalm.py) aus. Bei der Ausführung wird das Ergebnis wie unten gezeigt ausgegeben.
$ 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 !!
Überprüfen Sie nach dem Ausführen des Tools, ob die Einstellungen tatsächlich auf dem Router angezeigt werden.
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
...
...
...
Es scheint, dass der Hostname des IOS-XR-Routers korrekt geändert werden könnte. Mit den von NAPALM bereitgestellten Funktionen konnte ich relativ einfach eine Router-Konfigurationsanwendung schreiben.
Versuchen Sie als Nächstes, den Hostnamen des JUNOS-Routers mit fast demselben Skript wie das in IOS-XR verwendete Programm zu ändern.
Der Quellcode der implementierten Anwendung.
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 !!'
Das Ausführungsergebnis ist hier.
$ 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)
Das ist gescheitert. .. .. Es scheint, dass der Login-Authentifizierungsteil von paramiko, einem SSH-Modul, fehlgeschlagen ist. Dies kann an unzureichenden Einstellungen des JUNOS-Routers (netconf-Teil?) Oder an einem Fehler des Programms liegen, daher werde ich weiter nachforschen.
Wenn jemand gut mit dem JUNOS-Router arbeiten kann, lassen Sie es mich bitte wissen.
Obwohl NAPALM gerade erst mit der Implementierung begonnen hat, ist es sehr einfach geworden, Tools zu entwickeln, da es möglich ist, Anwendungen zu schreiben, die Router betreiben, ohne das Modell oder den Hersteller zu kennen. Obwohl bisher nur die Konfigurationseinstellungsfunktion implementiert wurde, scheint die aktuelle Implementierung in Situationen, in denen dieselben Einstellungen für mehrere Router eingegeben werden, ausreichend verwendet werden zu können.
Momentan scheinen jedoch auch Funktionen und Fehler enthalten zu sein, die gerade implementiert werden. Führen Sie daher vor der Verwendung eine ausreichende Überprüfung durch.
Wenn man sich den Quellcode von NAPALM selbst ansieht, ist es programmatisch nicht schwierig, und der grundlegende Teil (base.py) besteht aus etwa 100 Zeilen, so dass ich anscheinend auch auf individueller Ebene voll an der Entwicklung teilnehmen kann. war.
Was mich überraschte, als ich den Quellcode von Github sah, war, dass nicht nur dieser NAPALM, sondern auch die meisten der darin aufgerufenen pyIOSXR, pyEOS und pyFG von Auther David Barroso und Elisa Jasinska fast unabhängig voneinander implementiert wurden. Es war was ich tat. Von diesem Projekt war ich begeistert: "Wenn der Hersteller es nicht vorbereitet, erstellen wir die API selbst!"
Recommended Posts