[PYTHON] Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 2: Ich habe versucht, PyEZ zu verwenden

Ich habe versucht, PyEZ und JSNAPy zu verwenden. Es ist eine Fortsetzung von. Dieses Mal werde ich den Inhalt der Verwendung von PyEZ vorstellen.

Über PyEZ

PyEZ ist eine Python-Bibliothek zum Konfigurieren von JUNOS-Routern. Übrigens scheint auch eine Ruby-Bibliothek namens RubyEZ verfügbar zu sein.

Screen Shot 2016-11-02 at 11.00.31 AM.png

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

Was PyEZ kann

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

Referenzmaterial

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

Vorbereitungen

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

PyEZ-Anwendungsfall 1: Ändern Sie den Hostnamen des Routers

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. Screen Shot 2016-11-26 at 7.09.58 PM.png

  1. Lesen Sie die Datei (./configs/change_hostname.conf) mit der Routerkonfiguration in den Router (Commit zu diesem Zeitpunkt noch nicht ausgeführt).
  2. Überprüfen Sie den Einstellungsunterschied mit diff
  3. commit check
  4. Commit ausführen

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]

PyEZ-Anwendungsfall 2: Router-Schnittstelle hinzugefügt (Teil der Variablen der Konfigurationsdatei)

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;
    }
}

Zusammenfassung

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

Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 2: Ich habe versucht, PyEZ zu verwenden
Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 1: Übersicht
Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 4: Automatisieren Sie die ISP-Einrichtung mit PyEZ und JSNAPy
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht, Web-Scraping mit Python und Selen
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, die Informationen des Webs mit "Requests" und "lxml" abzurufen.
Ich habe versucht, den Pferderennplatz Teil 2 zu kriechen und abzukratzen
Ich habe versucht, Rotrics Dex Arm # 2 zu verwenden
Ich habe versucht, Rotrics Dex Arm zu verwenden
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Ich habe versucht, mit dem Server-Client über tmux zu kommunizieren
Ich habe versucht, mit PyBrain verstärkt zu lernen
Ich habe versucht, mit Theano tief zu lernen
Ich habe irgendwie versucht, ein Jupyter-Notebook zu verwenden
[Kaggle] Ich habe versucht, mit unausgeglichenem Lernen zu unterabtasten
Ich habe versucht, mit OpenPose eine Schildkrötenwelle zu schießen
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, asynchrone Verarbeitung mit Asyncio
Ich habe versucht, die Docomo-Spracherkennungs-API und die Google Speech-API in Java zu verwenden
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe DSX Desktop installiert und ausprobiert
Ich habe versucht, ○ ✕ mit TensorFlow zu spielen
Ich habe versucht, YOUTUBE Data API V3 zu verwenden
Ich habe versucht, Selen mit Headless-Chrom zu verwenden