[PYTHON] Ich habe versucht, die API-Bibliothek NAPALM für Router-Steuerungen mehrerer Hersteller zu berühren

(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

NAPALM Übersicht

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

Was Sie mit NAPALM machen können

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 versucht, NAPALM zu verwenden

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

Versucht mit IOS-XR

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.

Ich habe es mit JUNOS versucht

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.

Impressionen

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

Ich habe versucht, die API-Bibliothek NAPALM für Router-Steuerungen mehrerer Hersteller zu berühren
Fortsetzung ・ Ich habe versucht, die Router-Steuerungs-API-Bibliothek NAPALM eines Anbieters zu berühren
Ich habe die Changefinder-Bibliothek ausprobiert!
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe die neuartige API von Naruro ausprobiert
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, die COTOHA-API zu berühren
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe in der Bibliothek nach der Verwendung der Gracenote-API gesucht
Ich habe versucht, die Qiita-API von Anfang an zu aktivieren
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe versucht, die funktionale Programmierbibliothek toolz zu verwenden
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
[Erste COTOHA-API] Ich habe versucht, die alte Geschichte zusammenzufassen
Ich habe versucht, die Qiita-API zu berühren
Ich habe versucht, den DRF-API-Anforderungsverlauf mit django-request zu speichern
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe die Google Cloud Vision-API zum ersten Mal ausprobiert
Ich habe versucht, verschiedene Informationen von der Codeforces-API abzurufen
[Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
Ich habe eine Python-Bibliothek erstellt, um die API von LINE WORKS aufzurufen
Ich habe versucht, die COTOHA-API zu verwenden (es gibt auch Code auf GitHub).
Ich habe das TensorFlow-Tutorial als erstes ausprobiert
Ich habe versucht, eine Quip-API zu erstellen
Ich habe das 2. TensorFlow-Tutorial ausprobiert
Ich habe Teslas API berührt
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, die Vorhersage-API des maschinellen Lernmodells von WordPress aus aufzurufen
Ich habe versucht, mehrere Servomotoren MG996R mit dem Servotreiber PCA9685 zu steuern.
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, verschiedene Sätze mit der automatischen Zusammenfassungs-API "summpy" zusammenzufassen.
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, berührungsbezogene Methoden im Szenenmodul von Pythonista zu berühren
Ich habe versucht, die Netzwerkbandbreite und -verzögerung mit dem Befehl tc zu steuern
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe zum ersten Mal Tensorflow ausprobiert
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich bin auf die Hatena Keyword API gestoßen
Ich habe das OSS-Visualisierungstool superset ausprobiert
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Ich habe eine Web-API erstellt
Ich habe das Python Tornado Testing Framework ausprobiert
Ich habe versucht, mit der Bibliothek GiNZA zur Verarbeitung natürlicher Sprache eindeutige Ausdrücke zu extrahieren
Ich habe Hello World mit 64-Bit-OS + C-Sprache ohne Verwendung einer Bibliothek ausprobiert
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
Als ich versuchte, die Computer Vision API von Microsoft zu verwenden, erkannte ich das Galapagos-Zeichen "Stop".
Ich habe versucht, zwei Jetson Nano-Hardware-PWMs aus der Jetson.GPIO Python-Bibliothek auszuführen.