Ich habe versucht, PyEZ und JSNAPy zu verwenden. Es ist eine Fortsetzung von. Dieses Mal werde ich den Inhalt der Verwendung von PyEZ vorstellen.
PyEZ ist eine Python-Bibliothek zum Konfigurieren von JUNOS-Routern. Übrigens scheint auch eine Ruby-Bibliothek namens RubyEZ verfügbar zu sein.
Die Kommunikation mit dem Router verwendet NET CONF über SSH und ist für den Betrieb auf dem von RFC empfohlenen TCP 830-Port ausgelegt.
PyEZ scheint ab JUNOS Version 11.4 verfügbar zu sein. Im Vergleich zu anderen Herstellern kann das Automatisierungstool in vielen Fällen nur mit der neuen Betriebssystemversion verwendet werden. Mit der Kombination von JUNOS + PyEZ kann es jedoch mit dem JUNOS-Router verwendet werden, der bereits an vielen Einsatzorten eingeführt und betrieben wurde. Daher kann gesagt werden, dass es aufgrund der niedrigen Einführungsschwelle ein einfach zu verwendendes Werkzeug ist. (Um Leistungseinbußen und -mängel zu vermeiden, verwenden viele Unternehmen am tatsächlichen Standort des Netzwerkbetriebs möglicherweise nur die Betriebssystemversion mit toten Fehlern. "Das neue Betriebssystem kann nur verwendet werden, wenn die Fehler tot sind." "Ergebnisse Ich stelle mir vor, dass es Fälle geben kann, in denen die Prüfung und Einführung der Automatisierung um einige Jahre verschoben wird.)
--Routerkonfigurationseingabe --load (Option zum Zusammenführen / Überladen / Ersetzen kann angegeben werden)
Ich habe nicht alle Funktionen ausprobiert, aber es scheint, als könnte ich es mit PyEZ fast manuell machen. Wenn Sie etwas finden, das Sie mit PyEZ nicht tun können, teilen Sie uns bitte Ihre Ergebnisse mit.
Das Verständnis wird schneller, wenn Sie die folgenden Artikel / Dokumente lesen. Sie sind in der Reihenfolge angeordnet, die hilfreich war.
Japanischer Einführungsblog
PyEZ Github
Offizielles Dokument von Juniper
Hier wird Python 2.7.10 als Server verwendet, auf dem das Tool ausgeführt wird, und Firefly wird als JUNOS-Router verwendet.
Installieren Sie PyEZ zunächst mit dem Befehl pip. Hier wird die neueste Version 2.0.1 verwendet.
pip install junos-eznc
pip list
junos-eznc (2.0.1)
Geben Sie außerdem auf der JUNOS-Routerseite die Einstellungen ein, um NETCONF zu aktivieren.
Router-Informationen
root@firefly1> show version
Hostname: firefly1
Model: firefly-perimeter
JUNOS Software Release [12.1X47-D20.7]
NETCONF-fähige Konfiguration
system {
services {
netconf {
ssh;
}
}
}
}
Konfigurieren Sie den Router einfach wie oben beschrieben und er wartet über SSH auf TCP 830 für NETCONF.
root@firefly1> show system connections | grep 830
tcp4 0 0 *.830 *.* LISTEN
Das minimale Konfigurationsprogramm für PyEZ ist unten dargestellt. Hier wird der Hostname von firefly1 in firefly1_changed_by_PyEZ geändert.
set_firefly1_change_hostname.Nur ein Auszug aus dem PyEZ-Einstellungsteil von py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from jnpr.junos import Device
from jnpr.junos.utils.config import Config
#Definieren Sie die zu steuernden Informationen
dev1 = Device(
host="192.168.34.16",
user="user1",
password="password1"
)
dev1.open()
#Richten Sie eine Sitzung ein
dev1.open()
dev1.bind(cu=Config)
#Hostnamen anzeigen
print "Hostname : ",
print dev1.facts["hostname"]
#Gesperrt, damit die Einstellungen nicht von anderen Sitzungen geändert werden
dev1.cu.lock()
#Konfigurationsdatei(./configs/change_hostname.conf")Lesen
#Zu diesem Zeitpunkt wird die Kandidatenkonfiguration nur aktualisiert und das Festschreiben wurde nicht ausgeführt.
conf_filename = "./configs/change_hostname.conf"
dev1.cu.load(path=conf_filename, format="text", merge=True)
#Führen Sie eine Festschreibungsprüfung durch. Beurteilen Sie, ob ein Problem mit den Einstellungen vorliegt.
print "Commit Check : ",
if dev1.cu.commit_check() :
print "OK"
else:
print "Error"
#Vertrauen Sie dem Benutzer an, ob er festschreibt oder nicht(Natürlich ist auch ein automatisches Festschreiben möglich)
print "Do you commit? y/n"
choice = raw_input().lower()
if choice == "y":
#Commit ausführen.
dev1.cu.commit()
print "Commit candidate config : OK"
else:
#Rollback ohne Ausführen eines Commits. Die Kandidatenkonfiguration wird gelöscht.
dev1.cu.rollback()
print "Rollback : OK"
#Sitzungssperre
dev1.cu.unlock()
#Sitzungsende
dev1.close()
:./configs/change_hostname.conf
system {
host-name firefly1_changed_by_PyEZ;
}
Mit dem obigen Programm ist es möglich, die Konfiguration zur Änderung des Hostnamens einzureichen.
Als Demo-Code wird derjenige, der mit dem hinzugefügten Anzeigeteil implementiert wurde, auf github veröffentlicht. https://github.com/taijiji/sample_pyez/blob/master/set_firefly1_change_hostname.py
Das Ausführungsergebnis ist wie folgt.
Ich konnte den Hostnamen mit demselben Ausführungsverfahren wie die manuelle Einstellung ändern. Natürlich konnte ich bestätigen, dass der Hostname des tatsächlichen Routers geändert wurde.
Überprüfen Sie den Hostnamen auf dem Router
root@firefly1_changed_by_PyEZ>
root@firefly1_changed_by_PyEZ> show version
Hostname: firefly1_changed_by_PyEZ
Model: firefly-perimeter
JUNOS Software Release [12.1X47-D20.7]
Früher haben wir im Voraus eine statisch generierte Konfigurationsdatei verwendet, aber mit PyEZ ist es möglich, mithilfe der Vorlagen-Engine einen Teil der Variablen der Konfigurationsdatei zu erstellen, wie unten gezeigt.
interfaces {
{{ if_name }} {
unit 0 {
description {{ if_description }};
family inet {
address {{ if_address_ipv4 }}/{{ if_subnet_ipv4 }};
}
}
}
}
Bei Verwendung der statischen Konfiguration müssen jedes Mal ähnliche Konfigurationsdateien vorbereitet / verwaltet werden, um Einstellungen mit mehreren Parametern wie Schnittstelle und BGP-Nachbar festzulegen. Daher muss eine große Anzahl von Konfigurationsdateien verwaltet werden. Wird rauskommen. Indem Sie hier einen Teil der Konfigurationsdatei-Variablen / -Vorlage erstellen, können Sie das Ziel der zu verwaltenden Konfigurationsdatei reduzieren.
PyEZ verwendet Jinaja2, eine der Template-Engines, um die Konfigurationsdatei variabel zu machen. Ich habe Jinja2 in der Vergangenheit in meinem Blog vorgestellt. Bitte beziehen Sie sich hier darauf. Verwendung der Template Engine für Network Engineer
Hier wird nur der Unterschied zum PyEZ-Verwendungsbeispiel 1 vorgestellt. Bitte überprüfen Sie github auf den Beispielcode für die Demo, die Sie tatsächlich geschrieben haben. https://github.com/taijiji/sample_pyez/blob/master/set_firefly1_add_interface.py
set_firefly1_add_interface.Auszug aus py
dev1 = Device(
host="192.168.34.16",
user="user1",
password="password1"
)
dev1.open()
# interface ge-0/0/Zeigen Sie die Einstellungen von 2 im RPC-Format an
if_info = dev1.rpc.get_interface_information(
interface_name='ge-0/0/2',
terse=True)
print etree.tostring(if_info)
#Geben Sie den Namen der Vorlagendatei an
template_filename = "./configs/add_interface.jinja2"
#Geben Sie Variablen in der Vorlagendatei an
add_if_param = {
'if_name' : 'ge-0/0/2',
'if_description' : 'add_by_PyEZ',
'if_address_ipv4' : '192.168.35.1',
'if_subnet_ipv4' : '30'
}
#Laden Sie die Konfiguration mithilfe der Vorlagendatei
dev1.cu.load(
template_path=template_filename,
template_vars=add_if_param,
format="text",
merge=True
)
#Commit-Konfiguration
dev1.cu.commit()
:./configs/add_interface.jinja2
interfaces {
{{ if_name }} {
unit 0 {
description {{ if_description }};
family inet {
address {{ if_address_ipv4 }}/{{ if_subnet_ipv4 }};
}
}
}
}
Dies ist das Ausführungsergebnis des Demoprogramms.
Ausführungsergebnis
% python set_firefly1_add_interface.py
##### Operation : Start #######
Connecting to device : OK
Hostname : firefly1
Interfaces ge-0/0/2 :
##############################
<interface-information style="terse">
<physical-interface>
<name>
ge-0/0/2
</name>
<admin-status>
up
</admin-status>
<oper-status>
up
</oper-status>
</physical-interface>
</interface-information>
##############################
Load config :
OK
Target template : ./configs/add_interface.jinja2
##############################
interfaces {
ge-0/0/2 {
unit 0 {
description add_by_PyEZ;
family inet {
address 192.168.35.1/30;
}
}
}
}
##############################
Diff :
##############################
[edit interfaces]
+ ge-0/0/2 {
+ unit 0 {
+ description add_by_PyEZ;
+ family inet {
+ address 192.168.35.1/30;
+ }
+ }
+ }
##############################
Commit Check : OK
Do you commit? y/n
y
Commit candidate config : OK
Interfaces ge-0/0/2 :
##############################
<interface-information style="terse">
<physical-interface>
<name>
ge-0/0/2
</name>
<admin-status>
up
</admin-status>
<oper-status>
up
</oper-status>
<logical-interface>
<name>
ge-0/0/2.0
</name>
<admin-status>
up
</admin-status>
<oper-status>
up
</oper-status>
<description>
add_by_PyEZ
</description>
<filter-information>
</filter-information>
<address-family>
<address-family-name>
inet
</address-family-name>
<interface-address>
<ifa-local emit="emit">
192.168.35.1/30
</ifa-local>
</interface-address>
</address-family>
</logical-interface>
</physical-interface>
</interface-information>
##############################
##### Operation : End #####
Es ist etwas schwierig zu verstehen, da die Informationserfassung durch PyEZ im XML-RPC-Format erfolgt. Sie können jedoch feststellen, dass die IP-Adresse und die Beschreibung auf ge-0 / 0/2 festgelegt sind, was nicht vor der Einstellung erfolgte.
Wenn Sie es mit einem tatsächlichen Router überprüfen, können Sie sehen, dass es wie folgt eingestellt ist.
Fragen Sie beim Router nach
root@firefly1> show configuration interfaces ge-0/0/2
unit 0 {
description add_by_PyEZ;
family inet {
address 192.168.35.1/30;
}
}
Dieses Mal haben wir PyEZ mit einem Schwerpunkt auf Anwendungsbeispielen vorgestellt. Ich habe einige der Funktionen ausprobiert, die in diesem Artikel nicht vorgestellt wurden. Weitere Informationen finden Sie im Beispielcode auf Github. https://github.com/taijiji/sample_pyez
Nächstes Mal werde ich JSNAPy vorstellen. Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 3: Ich habe versucht, JSNAPy zu verwenden
Recommended Posts