Verwendung von RPCs und Betriebsmodusbefehlen in Op-Skripten
Die meisten Junos OS-Befehle im Betriebsmodus verfügen über XML-Äquivalente. Op-Skripte können diese XML-Befehle auf einem lokalen oder remoten Gerät mithilfe des Remote Procedure Call (RPC)-Protokolls ausführen. Alle Befehle im Betriebsmodus mit XML-Äquivalenten sind in der Junos XML API Operational Developer Reference aufgeführt.
Die Verwendung von RPCs und Betriebsmodusbefehlen in Op-Skripten wird in den folgenden Abschnitten ausführlicher erörtert:
Verwenden von RPCs in Op-Skripten
Um eine RPC in einem SLAX- oder XSLT-Op-Skript zu verwenden, fügen Sie die RPC in eine Variablendeklaration ein, und rufen Sie dann die RPC mit der Erweiterungsfunktion mit der jcs:invoke()
jcs:execute()
RPC-Variable als Argument auf. Die jcs:invoke()
Funktion führt die RPC auf dem lokalen Gerät aus. Die jcs:execute()
Funktion führt in Verbindung mit einem Verbindungshandgriff die RPC auf einem Remotegerät aus.
Das folgende Snippet, das eine RPC auf dem lokalen Gerät aufruft, wird erweitert und in Beispiel vollständig beschrieben : Anpassen der Ausgabe der Showschnittstellen terse Command Using an Op Script:
XSLT-Syntax
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="out" select="jcs:invoke($rpc)"/> ...
SLAX-Syntax
var $rpc = <get-interface-information>; var $out = jcs:invoke($rpc);
Das folgende Snippet ruft die gleiche RPC auf einem Remotegerät auf:
XSLT-Syntax
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="connection" select="jcs:open('198.51.100.1', 'bsmith', 'test123')"/> <xsl:variable name="out" select="jcs:execute($connection, $rpc)"/> <xsl:value-of select="jcs:close($connection)"/> ...
SLAX-Syntax
var $rpc = <get-interface-information>; var $connection = jcs:open('198.51.100.1', 'bsmith', 'test123'); var $out = jcs:execute($connection, $rpc); expr jcs:close($connection);
In Python-Op-Skripten sind RPCs mit Junos PyEZ-APIs einfach auszuführen. Jede Instanz der Junos PyEZ-Klasse Device
hat eine rpc
Eigenschaft, mit der Sie jede über die Junos XML API verfügbare RPC ausführen können. Nachdem Sie eine Sitzung mit einem lokalen oder remoten Gerät etabliert haben, können Sie die RPC ausführen, indem Sie die Eigenschaft und den rpc
RPC-Methodennamen an die Geräteinstanz anfügen. Der Rückgabewert ist ein XML-Objekt, das am ersten Element unter dem <rpc-reply>
Tag beginnt.
Um die RPC auf dem lokalen Gerät auszuführen, erstellen Sie die Device
Instanz mit einer leeren Argumentliste. Um die RPC auf einem Remotegerät auszuführen, erstellen Sie eine Instanz mit Device
den entsprechenden Argumenten, um eine Verbindung zu diesem Gerät herzustellen.
Der folgende Code ruft eine RPC auf dem lokalen Gerät auf und druckt die Antwort:
Python-Syntax
from jnpr.junos import Device from lxml import etree with Device() as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
Der folgende Code ruft die gleiche RPC auf einem Remotegerät auf und gibt die Antwort aus:
Python-Syntax
from jnpr.junos import Device from lxml import etree import jcs user = jcs.get_input('Enter username: ') password = jcs.get_secret('Enter user password: ') with Device(host='198.51.100.1', user=user, password=password) as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
Um eine RPC auf einem Remotegerät auszuführen, muss eine SSH-Sitzung eingerichtet werden. Damit das Skript die Verbindung herstellt, müssen Sie entweder die SSH-Hostschlüsselinformationen für das Remotegerät auf dem lokalen Gerät konfigurieren, auf dem das Skript ausgeführt wird, oder die SSH-Hostschlüsselinformationen für das Remotegerät müssen in der bekannten Hosts-Datei des Benutzers, der das Skript ausführt, vorhanden sein. Konfigurieren Sie für jedes Remotegerät, auf dem eine RPC ausgeführt wird, die SSH-Hostschlüsselinformationen mit einer der folgenden Methoden:
Um SSH-bekannte Hosts auf dem lokalen Gerät zu konfigurieren, fügen Sie die
host
Anweisung ein, und geben Sie die Optionen für Hostnamen und Hostschlüssel für das Remotegerät auf der[edit security ssh-known-hosts]
Hierarchieebene der Konfiguration an.Um SSH-Hostschlüsselinformationen manuell abzurufen, geben Sie den
set security ssh-known-hosts fetch-from-server hostname
Konfigurationsmodus-Befehl aus, um Junos OS anzuweisen, sich mit dem Remotegerät zu verbinden und den Schlüssel hinzuzufügen.user@host# set security ssh-known-hosts fetch-from-server router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
Zum manuellen Importieren von SSH-Hostschlüsselinformationen aus einer Datei verwenden Sie den
set security ssh-known-hosts load-key-file filename
Konfigurationsmodusbefehl und geben Sie die Datei mit bekannten Hosts an.user@host# set security ssh-known-hosts load-key-file /var/tmp/known_hosts Import SSH host keys from trusted source /var/tmp/known_hosts ? [yes,no] (no) yes
Alternativ kann sich der Benutzer, der das Skript ausführt, bei dem lokalen Gerät, SSH beim Remotegerät anmelden und dann manuell den Hostschlüssel akzeptieren, der der bekannten Hosts-Datei dieses Benutzers hinzugefügt wird. Im folgenden Beispiel ist root bei Router1 angemeldet. Um eine Remote-RPC auf Router2 auszuführen, fügt root den Hostschlüssel von Router2 hinzu, indem der Befehl im
ssh router2
Betriebsmodus ausgegeben und der Schlüssel manuell akzeptiert wird.root@router1> ssh router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
RPC-Tags für einen Befehl anzeigen
Sie können die RPC-XML-Tags für Befehle im Betriebsmodus in der BEFEHLSZEILE des Geräts anzeigen. Um die RPC XML-Tags für einen Befehl anzuzeigen, geben Sie nach dem Pipe-Symbol (|) ein display xml rpc
.
Im folgenden Beispiel werden die RPC-Tags für den show route
Befehl angezeigt:
user@host> show route | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.1I0/junos"> <rpc> <get-route-information> </get-route-information> </rpc> <cli> <banner></banner> </cli> </rpc-reply>
SLAX- und XSLT-Skripte können RPCs mit den RPC XML-Tags ausführen. Python-Skripte müssen die RPC-Tags und Befehlsoptionen in ein für Python geeignetes Format konvertieren. Weitere Informationen zur Verwendung von Junos PyEZ zur Ausführung von RPCs und zur Zuordnung von RPC-Tags zur entsprechenden Python-Methode und methodenargumenten finden Sie unter Verwenden von Junos PyEZ zur Ausführung von RPCs auf Geräten, auf denen Junos OS ausgeführt wird.
Verwendung von Betriebsmodusbefehlen in Op-Skripten
Einige Befehle im Betriebsmodus verfügen nicht über XML-Äquivalente. SLAX- und XSLT-Skripte können Befehle ausführen, die mit dem <command>
Element nicht XML-äquivalent sind. Python-Skripte können diese Befehle mit der in der Device
Klasse definierten Junos PyEZ-Methode cli()
ausführen.
Wenn ein Befehl nicht in der Junos XML API Operational Developer Reference aufgeführt ist, verfügt der Befehl nicht über ein XML-Äquivalent. Eine weitere Möglichkeit, zu bestimmen, ob ein Befehl über eine XML-Äquivalente verfügt, besteht darin, den Befehl, gefolgt vom | display xml
Befehl, auszugeben, z. B.:
user@host> operational-mode-command | display xml
Wenn die Ausgabe nur Tag-Elemente wie <output>
, <cli>
und <banner>
enthält der Befehl möglicherweise keine XML-Äquivalente. Im folgenden Beispiel gibt die Ausgabe an, dass der show host
Befehl keine XML-Äquivalente hat:
user@host> show host hostname | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <output> ... </output> <cli> <banner></banner> </cli> </rpc-reply>
Bei einigen Befehlen mit einem XML-Äquivalent enthält die Ausgabe des Piped-Befehls | display xml
keine anderen Tag-Elemente als <output>
, <cli>
und <banner>
nur, weil die entsprechende Funktion nicht konfiguriert ist. Der Befehl verfügt beispielsweise über ein XML-Äquivalent, show services cos statistics forwarding-class
das die <service-cos-forwarding-class-statistics>
Ausgabe im Antwort-Tag zurückgibt, aber wenn die Konfiguration keine Anweisungen auf Hierarchieebene [edit class-of-service]
enthält, gibt es keine tatsächlichen Daten, die der show services cos statistics forwarding-class | display xml
Befehl anzeigen kann. Die Ausgabe ähnelt folgendem:
user@host> show services cos statistics forwarding-class | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/8.3I0/junos"> <cli> <banner></banner> </cli> </rpc-reply>
Aus diesem Grund sind die Informationen in der Junos XML API Operational Developer Reference in der Regel zuverlässiger.
SLAX- und XSLT-Op-Skripte können Befehle enthalten, die keine XML-Äquivalente haben. Verwenden Sie die <command>
, <xsl:value-of>
und <output>
die Elemente im Skript, wie im folgenden Codeausschnitt dargestellt. Dieses Snippet wird in Beispiel: Anzeige von DNS-Hostnameninformationen mithilfe eines Op-Skripts erweitert und vollständig beschrieben.
<xsl:variable name="query"> <command> <xsl:value-of select="concat('show host ', $hostname)"/> </command> </xsl:variable> <xsl:variable name="result" select="jcs:invoke($query)"/> <xsl:variable name="host" select="$result"/> <output> <xsl:value-of select="concat('Name: ', $host)"/> </output> ...
Python-Op-Skripte können Befehle ausführen, die keine XML-Äquivalente haben, indem Sie Junos PyEZ-APIs verwenden. Die cli()
in der Device
Klasse definierte Methode führt einen Befehl im Betriebsmodus aus und gibt die Ausgabe im Textformat zurück. Zum Beispiel:
from jnpr.junos import Device def main(): with Device() as jdev: res = jdev.cli('show host hostname', warning=False) print (res) if __name__ == "__main__": main()
Sie können auch festlegen format='xml'
, dass die Ausgabe als XML-Elemente von Junos OS zurückgegeben wird. Weitere Informationen zur Junos PyEZ-Methode cli()
finden Sie unter http://junos-pyez.readthedocs.org/en/latest/_modules/jnpr/junos/device.html#Device.cli .