Verwenden von Junos PyEZ zum Abrufen einer Konfiguration
ZUSAMMENFASSUNG Sie können Junos PyEZ-Anwendungen erstellen, die Konfigurationsdaten aus der angegebenen Konfigurationsdatenbank auf einem Junos-Gerät abrufen.
Junos PyEZ-Anwendungen können bei Bedarf Remote Procedure Calls (RPCs) auf Junos-Geräten ausführen. Nach dem Erstellen einer Instanz der Device
Klasse kann eine Anwendung RPCs als Eigenschaft der Device
Instanz ausführen. Junos PyEZ-Anwendungen können den get_config()
RPC verwenden, um die vollständige Konfiguration oder ausgewählte Teile der Konfiguration sowohl für die native Junos OS-Konfiguration als auch für Konfigurationsdaten anzufordern, die Standard- (IETF, OpenConfig) oder benutzerdefinierten YANG-Datenmodellen entsprechen, die dem Gerät hinzugefügt wurden.
Der Junos PyEZ-RPC get_config
ruft den Junos XML-Protokollvorgang <get-configuration>
auf. Weitere Informationen zum <get-configuration>
Vorgang und seinen Optionen finden Sie unter <get-configuration>.
In diesem Thema wird erläutert, wie Sie die Konfiguration mithilfe des Junos PyEZ-RPC get_config()
abrufen. Weitere Informationen zur Verwendung von Tabellen und Ansichten zum Abrufen von Konfigurationsdaten finden Sie unter Definieren von Junos PyEZ-Konfigurationstabellen und Verwenden von Junos PyEZ-Konfigurationstabellen zum Abrufen von Konfigurationsdaten.
Abrufen der vollständigen Kandidatenkonfiguration
Führen Sie den get_config()
RPC aus, um die vollständige Kandidatenkonfiguration von einem Junos-Gerät abzurufen. Das Standardausgabeformat ist XML. Zum Beispiel:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
Angeben der Quelldatenbank für die Konfigurationsdaten
Wenn eine Junos PyEZ-Anwendung den get_config()
RPC verwendet, um Konfigurationsinformationen von einem Junos-Gerät abzurufen, gibt der Server standardmäßig Daten aus der Kandidatenkonfigurationsdatenbank zurück. Eine Junos PyEZ-Anwendung kann auch Konfigurationsdaten aus der festgeschriebenen Konfigurationsdatenbank oder der kurzlebigen Konfigurationsdatenbank abrufen.
Kandidatenkonfigurationsdatenbank
Um Daten aus der Kandidatenkonfigurationsdatenbank abzurufen, führen Sie den get_config()
RPC aus, und schließen Sie optional zusätzliche Argumente ein.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
Festgeschriebene Konfigurationsdatenbank
Um Daten aus der festgeschriebenen Konfigurationsdatenbank abzurufen, schließen Sie das options
Argument with 'database':'committed'
in den get_config()
RPC-Aufruf ein.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(options={'database' : 'committed'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Kurzlebige Konfigurationsdatenbank
Junos PyEZ unterstützt Vorgänge in der kurzlebigen Konfigurationsdatenbank auf Geräten, die diese Datenbank unterstützen. Beim Abrufen von Konfigurationsdaten aus der freigegebenen Konfigurationsdatenbank enthalten die Ergebnisse standardmäßig keine Daten aus der kurzlebigen Konfigurationsdatenbank.
Bei der kurzlebigen Datenbank handelt es sich um eine alternative Konfigurationsdatenbank, die eine schnelle programmgesteuerte Schnittstelle zum Ausführen von Konfigurationsupdates auf Junos-Geräten bereitstellt. Die flüchtige Konfigurationsdatenbank ist eine erweiterte Funktion, die bei falscher Verwendung schwerwiegende negative Auswirkungen auf den Betrieb des Geräts haben kann. Weitere Informationen finden Sie unter Grundlegendes zur kurzlebigen Konfigurationsdatenbank.
Um Daten aus der Standardinstanz der kurzlebigen Konfigurationsdatenbank abzurufen, öffnen Sie zuerst die kurzlebige Standardinstanz, und fordern Sie dann die Daten an. Um die Standardinstanz zu öffnen, verwenden Sie einen Kontext-Manager, um die Config
Instanz zu erstellen, und fügen Sie das Argument mode='ephemeral'
ein. Zum Beispiel:
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
Um Daten aus einer bestimmten Instanz der kurzlebigen Konfigurationsdatenbank abzurufen, öffnen Sie zuerst die kurzlebige Instanz, und fordern Sie dann die Daten an. Um eine benutzerdefinierte Instanz der kurzlebigen Konfigurationsdatenbank zu öffnen, verwenden Sie einen Kontext-Manager, um die Config
Instanz zu erstellen, das Argument mode='ephemeral'
einzuschließen und das ephemeral_instance
Argument auf den Namen der kurzlebigen Instanz festzulegen.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral', ephemeral_instance='eph1') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
Geben Sie den Umfang der zurückzugebenden Konfigurationsdaten an
Zusätzlich zum Abrufen der vollständigen Junos OS-Konfiguration kann eine Junos PyEZ-Anwendung bestimmte Teile der Konfiguration abrufen, indem sie den get_config()
RPC mit dem filter_xml
Argument aufruft. Der filter_xml
Parameter akzeptiert eine Zeichenfolge, die den Unterstrukturfilter enthält, der die zurückzugebenden Konfigurationsanweisungen auswählt. Der Teilbaumfilter gibt die Konfigurationsdaten zurück, die den Selektionskriterien entsprechen.
Um mehrere Hierarchien anzufordern, muss die filter_xml
Zeichenfolge das <configuration>
Stammelement enthalten. Andernfalls muss der Wert von filter_xml
alle Ebenen der Konfigurationshierarchie darstellen, beginnend direkt unter dem Stammelement <configuration>
bis zur anzuzeigenden Hierarchie. Um einen Teilbaum auszuwählen, fügen Sie das leere Tag für diese Hierarchieebene ein. Um ein bestimmtes Objekt zurückzugeben, schließen Sie einen Inhaltsübereinstimmungsknoten ein, der das Element und den Wert definiert, die abgeglichen werden sollen.
Die folgende Junos PyEZ-Anwendung ruft die Konfiguration auf der und [edit protocols]
der [edit interfaces]
Hierarchieebene in der Kandidatenkonfiguration ab und druckt sie:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<configuration><interfaces/><protocols/></configuration>' data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Im folgenden Beispiel wird die Konfiguration auf Hierarchieebene [edit system services]
mit unterschiedlichen, aber äquivalenten Werten für das filter_xml
Argument abgerufen und gedruckt:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='<system><services/></system>') print (etree.tostring(data, encoding='unicode', pretty_print=True)) data = dev.rpc.get_config(filter_xml='system/services') print (etree.tostring(data, encoding='unicode', pretty_print=True)) filter = etree.XML('<system><services/></system>') data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Im folgenden Beispiel wird das <name>
Element für jedes <interface>
Element unter der <interfaces>
Hierarchie in der Kandidatenkonfiguration nach der Vererbung abgerufen:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name/></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-interface-names.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/0</name> </interface> <interface> <name>ge-1/0/1</name> </interface> <interface> <name>lo0</name> </interface> <interface> <name>fxp0</name> </interface> </interfaces> </configuration>
Im folgenden Beispiel wird die Teilstruktur für die Schnittstelle ge-1/0/1 abgerufen:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name>ge-1/0/1</name></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-single-interface.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/1</name> <description>customerA</description> <disable/> <unit> <name>0</name> <family> <inet> <address> <name>198.51.100.1/24</name> </address> </inet> </family> </unit> </interface> </interfaces> </configuration>
Geben Sie das Format für die zurückzugebenden Konfigurationsdaten an
Der Junos PyEZ-RPC get_config()
ruft den Junos XML-Protokollvorgang <get-configuration>
auf, der Junos OS-Konfigurationsdaten als Junos XML-Elemente, CLI-Konfigurationsanweisungen, Junos OS-Befehle set
oder JavaScript Object Notation (JSON) zurückgeben kann. Standardmäßig gibt der get_config()
RPC Konfigurationsdaten als XML zurück.
Um das Format anzugeben, in dem die Konfigurationsdaten zurückgegeben werden sollen, nimmt die Junos PyEZ-Anwendung das options
Wörterbuch mit 'format':'format'
in die get_config()
Argumentliste auf. Um CLI-Konfigurationsanweisungen, Junos OS-Befehle set
oder das JSON-Format anzufordern, legen Sie den format
Wert auf text
, set
bzw json
. , fest.
Wie in NETCONF- und Junos XML-Protokollsitzungen gibt Junos PyEZ die Konfigurationsdaten im erwarteten Format zurück, das im entsprechenden XML-Element für dieses Format enthalten ist. Die RPC-Antwort schließt Konfigurationsdaten in XML-, Text- oder set
Befehlsformaten in <configuration>
, <configuration-text>
bzw <configuration-set>
. -Elementen ein.
from jnpr.junos import Device from lxml import etree from pprint import pprint with Device(host='router1.example.net') as dev: # XML format (default) data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Text format data = dev.rpc.get_config(options={'format':'text'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Junos OS set format data = dev.rpc.get_config(options={'format':'set'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # JSON format data = dev.rpc.get_config(options={'format':'json'}) pprint (data)
Abhängig von der Python-Version und dem Format der Ausgabe müssen Sie möglicherweise die print-Anweisung ändern, um eine besser lesbare Ausgabe anzuzeigen.
Abrufen von Konfigurationsdaten für standardmäßige oder benutzerdefinierte YANG-Datenmodelle
Sie können standardisierte oder benutzerdefinierte YANG-Module auf Junos-Geräte laden, um Datenmodelle hinzuzufügen, die von Junos OS nicht nativ unterstützt werden, aber durch Übersetzung unterstützt werden können. Sie konfigurieren nicht-native Datenmodelle in der Kandidatenkonfiguration mit der Syntax, die für diese Modelle definiert ist. Wenn Sie einen Commit für die Konfiguration ausführen, werden diese Daten von den Übersetzungsskripts des Datenmodells übersetzt und die entsprechende Junos OS-Konfiguration als vorübergehende Änderung in der Checkout-Konfiguration übernommen.
Die Kandidaten- und aktiven Konfigurationen enthalten die Konfigurationsdaten für nicht native YANG-Datenmodelle in der Syntax, die durch diese Modelle definiert ist. Junos PyEZ-Anwendungen können Konfigurationsdaten für standardmäßige und benutzerdefinierte YANG-Datenmodelle zusätzlich zur nativen Junos OS-Konfiguration abrufen, indem sie die entsprechenden Argumente in den get_config()
RPC aufnehmen. Standardmäßig sind nicht native Konfigurationsdaten nicht in der get_config()
RPC-Antwort enthalten.
Um Konfigurationsdaten abzurufen, die durch ein nicht natives YANG-Datenmodell definiert sind, führen Sie zusätzlich zum Abrufen der Junos OS-Konfiguration den get_config()
RPC mit dem model
Argument aus und schließen Sie das Argument namespace
ggf. ein. Das model
Argument nimmt einen der folgenden Werte an:
custom
: Rufen Sie Konfigurationsdaten ab, die durch benutzerdefinierte YANG-Datenmodelle definiert sind. Sie müssen das Argumentnamespace
beim Abrufen von Daten für benutzerdefinierte YANG-Datenmodelle einschließen.ietf
: Rufen Sie Konfigurationsdaten ab, die durch IETF YANG-Datenmodelle definiert sind.openconfig
– Rufen Sie Konfigurationsdaten ab, die durch OpenConfig YANG-Datenmodelle definiert sind.True
– Rufen Sie alle Konfigurationsdaten ab, einschließlich der vollständigen Junos OS-Konfiguration und Daten aus beliebigen YANG-Datenmodellen.
Wenn Sie den ietf
Wert or openconfig
für das model
Argument angeben, verwendet Junos PyEZ automatisch den entsprechenden Namespace. Wenn Sie Daten für ein benutzerdefiniertes YANG-Datenmodell mit abrufen model='custom'
, müssen Sie das namespace
Argument auch in den entsprechenden Namespace einschließen.
Wenn Sie das Argument model
mit dem Wert custom
, ietf
oder openconfig
und auch das filter_xml
Argument einschließen, um eine bestimmte XML-Unterstruktur zurückzugeben, gibt Junos OS nur die entsprechende Hierarchie aus dem nicht nativen Datenmodell zurück. Wenn die Junos OS-Konfiguration eine gleichnamige Hierarchie enthält, z. B. "Schnittstellen", wird sie nicht in die Antwort aufgenommen. Die filter_xml
Option wird nicht unterstützt, wenn .model=True
Im folgenden Beispiel ruft der get_config()
RPC die OpenConfig-Konfigurationshierarchie bgp
aus der Kandidatenkonfiguration auf dem Gerät ab. Wenn Sie das Argument filter_xml
weglassen, gibt der RPC die vollständigen Konfigurationen für Junos OS und OpenConfig-Kandidaten zurück.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig') print (etree.tostring(data, encoding='unicode', pretty_print=True))
Der folgende RPC ruft die interfaces
Konfigurationshierarchie aus der Kandidatenkonfiguration für ein IETF-YANG-Datenmodell ab:
data = dev.rpc.get_config(filter_xml='interfaces', model='ietf') print (etree.tostring(data, encoding='unicode', pretty_print=True))
Der folgende RPC ruft die l2vpn
Konfigurationshierarchie aus der Kandidatenkonfiguration für ein benutzerdefiniertes YANG-Datenmodell mit dem angegebenen Namespace ab:
data = dev.rpc.get_config(filter_xml='l2vpn', model='custom', namespace='http://yang.juniper.net/customyang/demo/l2vpn') print (etree.tostring(data, encoding='unicode', pretty_print=True))
Der folgende RPC ruft die vollständige Junos OS-Kandidatenkonfiguration sowie die Konfigurationsdaten für andere YANG-Datenmodelle ab, die dem Gerät hinzugefügt wurden:
data = dev.rpc.get_config(model=True) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Angeben zusätzlicher RPC-Optionen
Wenn Sie den Junos PyEZ-RPC get_config()
zum Abrufen der Konfiguration verwenden, wird der Junos XML-Protokollvorgang <get-configuration>
aufgerufen. Der RPC unterstützt das Argument, mit dem options
Sie ein Wörterbuch mit Schlüssel-Wert-Paaren aller vom Vorgang unterstützten <get-configuration>
Attribute einschließen können. Eine vollständige Liste der Attribute, die vom Junos XML-Protokollvorgang <get-configuration>
unterstützt werden, finden Sie unter <get-configuration>.
Der get_config()
RPC ruft z. B. Daten aus der Konfiguration vor der Vererbung ab, in der , <apply-groups-except>
<groups>
<apply-groups>
, und <interface-range>
Tags separate Elemente in der Konfigurationsausgabe sind. Um Daten aus der Konfiguration nach der Vererbung abzurufen, die Anweisungen, die von benutzerdefinierten Gruppen und Bereichen geerbt wurden, als untergeordnete Elemente der erbenden Anweisungen anzeigt, können Sie das Argument options
mit 'inherit':'inherit'
einschließen.
Mit dem folgenden Code wird z. B. die Konfiguration auf Hierarchieebene [edit system services]
aus der Kandidatenkonfiguration nach der Vererbung abgerufen. Wenn die Konfiguration in diesem Fall auch Anweisungen enthält, die auf Hierarchieebene [edit groups global system services]
konfiguriert sind, werden diese Anweisungen unter der [edit system services]
Hierarchie in der Konfiguration nach der Vererbung geerbt und in den abgerufenen Konfigurationsdaten zurückgegeben.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='system/services', options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Behandeln von Namespaces in Konfigurationsdaten
Der Junos PyEZ-RPC get_config()
entfernt standardmäßig alle Namespaces in den zurückgegebenen Konfigurationsdaten. Junos PyEZ-Anwendungen können den Namespace in den zurückgegebenen Konfigurationsdaten beibehalten, sodass Sie die Daten wieder auf ein Gerät laden können, z. B. wenn Sie die vorhandene Konfiguration schnell ändern möchten.
Um Namespaces in den Konfigurationsdaten beizubehalten, schließen Sie das Argument remove_ns=False
in die get_config()
Argumentliste ein. Zum Beispiel:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig', remove_ns=False) print (etree.tostring(data, encoding='unicode', pretty_print=True))
In der folgenden abgeschnittenen Ausgabe behält das <bgp>
Element das Attribut bei, das xmlns
den Namespace definiert:
<bgp xmlns="http://openconfig.net/yang/bgp"> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...
Wenn das Argument get_config()
remove_ns=False
weggelassen wird, ist der Namespace nicht in der Ausgabe enthalten.
<bgp> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...