Definieren verschiedener Ausgabeebenen in benutzerdefinierten YANG-RPCs für Junos-Geräte
Definieren verschiedener Ausgabestufen in benutzerdefinierten YANG-RPCs
Mit YANG können Sie benutzerdefinierte RPCs für Junos-Geräte definieren. Die RPC-Ausgabe kann so angepasst werden, dass je nach RPC-Eingabe unterschiedliche Daten- und CLI-Formatierungen ausgegeben werden. Auf diese Weise können Sie verschiedene Stile oder Ausgabeebenen für denselben RPC erstellen.
Sie können den gewünschten Stil anfordern, indem Sie den entsprechenden Wert für das Eingabeargument einschließen, wenn Sie den RPC aufrufen. Das Aktionsskript muss dieses Argument verarbeiten und die XML-Ausgabe für den angeforderten Stil ausgeben. Junos OS übersetzt dann den XML-Code in die entsprechende CLI-Ausgabe, die für diesen Stil im YANG-Modul definiert ist. Die in diesem Thema vorgestellte RPC-Vorlage erstellt zwei Stile: brief
und detail
.
So erstellen Sie verschiedene Stile für die Ausgabe eines RPC:
Der folgende Code beschreibt die allgemeine Struktur des RPC-Moduls und des einschließenden Moduls. Wenn Sie den RPC in der CLI aufrufen und das Eingabeargument level
einschließen und entweder brief
oder detail
angeben, rendert Junos OS die für diesen Stil definierte Ausgabe.
module module-name { namespace "http://yang.juniper.net/yang/1.1/jrpc"; prefix jrpc; import junos-extension { prefix junos; } import junos-extension-odl { prefix junos-odl; } organization "Juniper Networks, Inc."; description "Junos OS YANG module for custom RPCs"; rpc rpc-name { description "RPC description"; junos:command "cli-command" { junos:action-execute { junos:script "action-script-filename"; } } input { leaf level { type enumeration { enum brief { description "Display brief output"; } enum detail { description "Display detailed output"; } } } } output { container output-container { // leaf definitions junos-odl:style brief { junos-odl:format output-container-format-brief { // formatting for brief output } } junos-odl:style detail { junos-odl:format output-container-format-detail { // formatting for detailed output } } } } } }
Um den RPC in der CLI auszuführen, geben Sie den durch die junos:command
Anweisung definierten Befehl ein, und geben Sie den Stil an, indem Sie das entsprechende Befehlszeilenargument einfügen, das in diesem Beispiel . level
Das entsprechende Aktionsskript verarbeitet das Eingabeargument und gibt die Ausgabe für den angeforderten Stil aus.
user@host> cli-command level brief
Beispiel: Definieren verschiedener Ausgabeebenen
In diesem Beispiel wird ein einfaches benutzerdefiniertes YANG-RPC- und Aktionsskript vorgestellt, die bestimmen, ob ein Host erreichbar ist, und je nach Benutzereingabe unterschiedliche Ausgabeebenen ausgeben.
- Anforderungen
- Übersicht über RPC und Action Script
- YANG-Modul und Aktionsskript
- Konfiguration
- Überprüfen des RPC
Anforderungen
In diesem Beispiel werden die folgenden Hardware- und Softwarekomponenten verwendet:
-
Gerät mit Junos OS Version 17.3R1 oder höher, das das Laden benutzerdefinierter YANG-Datenmodelle unterstützt.
Übersicht über RPC und Action Script
Das YANG-Modul in diesem Beispiel definiert einen benutzerdefinierten RPC, um den angegebenen Host anzupingen und das Ergebnis mit verschiedenen Ausgabeebenen basierend auf der Eingabe des Benutzers zurückzugeben. Das YANG-Modul rpc-style-test
wird in der Datei rpc-style-test.yang gespeichert. Das Modul importiert die Junos OS-Erweiterungsmodule, die die Erweiterungen bereitstellen, die zum Ausführen benutzerdefinierter RPCs auf dem Gerät und zum Anpassen der CLI-Ausgabe erforderlich sind.
Das Modul definiert den get-host-status
RPC. Das <get-host-status>
Anforderungs-Tag wird verwendet, um den RPC remote auf dem Gerät auszuführen. In der RPC-Definition definiert die junos:command
Anweisung den Befehl, der zum Ausführen des RPC in der CLI verwendet wird show host-status
, in diesem Fall .
rpc get-host-status { description "RPC example to retrieve host status"; junos:command "show host-status" { junos:action-execute { junos:script "rpc-style-test.py"; } } ...
Die junos:action-execute
and-Anweisungen junos:script
definieren das Aktionsskript, das beim Ausführen des RPC aufgerufen wird. In diesem Beispiel wird ein Python-Aktionsskript mit dem Namen rpc-style-test.py verwendet, um die für den RPC erforderlichen Informationen abzurufen. Das Skript gibt die XML-Ausgabeelemente für jede Ausgabeebene zurück, wie in der RPC-Anweisung output
definiert.
Ab Junos OS Version 17.3 ist die action-execute
Anweisung eine Unteranweisung von command
. In früheren Versionen werden die and-Anweisungen command
auf derselben Ebene platziert, und die action-execute
command
Anweisung ist optional.
Der RPC verfügt über zwei Eingabeparameter hostip
und level
. Der hostip
Parameter ist der Host, der auf Erreichbarkeit geprüft werden soll. Der level
Parameter wählt den Stil für die RPC-Ausgabe aus. Wenn Sie den RPC ausführen, schließen Sie die IP-Adresse des Zielhosts und eine Ebene brief
oder detail
. Das Aktionsskript definiert den Standardwert für level
as 'brief'
, wenn Sie also dieses Argument weglassen, gibt der RPC die Ausgabe aus, die dem Kurzzeitstil entspricht.
input { leaf hostip { description "Host IP address"; type string; } leaf level { type enumeration { enum brief { description "Display brief output"; } enum detail { description "Display detailed output"; } } } }
Der RPC definiert auch die Ausgabeknoten, die vom entsprechenden Aktionsskript ausgegeben werden müssen. Der Stammknoten ist das Element, das je nach Benutzereingabe entweder das oder das <host-status-information>
<brief>
<detail>
Element zusammen mit den untergeordneten Ausgabeknoten umschließt, die für jede Ausgabeebene angegeben sind. Beide Ausgabeebenen enthalten das und <status>
das untergeordnete Element, aber das Element enthält auch das <hostip>
<detail>
<date>
untergeordnete Element. Die junos-odl:format
Anweisungen definieren die Formatierung für die Ausgabe, die in der CLI angezeigt wird. Dieser Knoten wird in der XML-Ausgabestruktur nicht ausgegeben.
output { container host-status-information { ... junos-odl:style brief { junos-odl:format host-status-information-format-brief { ... } } junos-odl:style detail { junos-odl:format host-status-information-format-detail { ... } } } }
Das Aktionsskript pingt den Host an, um festzustellen, ob er erreichbar ist, und legt den Status basierend auf den Ergebnissen fest. Das Skript erstellt und druckt dann den XML-Code für die RPC-Ausgabe basierend auf dem angegebenen level
Argument. Die XML-Struktur muss exakt mit der in der RPC definierten Hierarchie übereinstimmen.
Das Modul, das den RPC und die Aktionsskriptdatei enthält, wird dem Gerät als Teil eines neuen YANG-Pakets mit dem Namen rpc-style-test
hinzugefügt.
YANG-Modul und Aktionsskript
YANG-Modul
Das YANG-Modul rpc-style-test.yang definiert den RPC, den Befehl zum Ausführen des RPC in der CLI und den Namen des Aktionsskripts, das beim Ausführen des RPC aufgerufen werden soll. Der Basisname der Datei muss mit dem Modulnamen übereinstimmen.
/* * Copyright (c) 2014 Juniper Networks, Inc. * All rights reserved. */ module rpc-style-test { namespace "http://yang.juniper.net/yang/1.1/jrpc"; prefix jrpc; import junos-extension-odl { prefix junos-odl; } import junos-extension { prefix junos; } organization "Juniper Networks, Inc."; description "Junos OS YANG module for RPC example"; rpc get-host-status { description "RPC example to retrieve host status"; junos:command "show host-status" { junos:action-execute { junos:script "rpc-style-test.py"; } } input { leaf hostip { description "Host IP address"; type string; } leaf level { type enumeration { enum brief { description "Display brief output"; } enum detail { description "Display detailed output"; } } } } output { container host-status-information { leaf hostip { type string; description "Host IP"; } leaf status { type string; description "Operational status"; } leaf date { type string; description "Date information"; } junos-odl:style brief { junos-odl:format host-status-information-format-brief { junos-odl:header "Brief output\n"; junos-odl:picture "@<<<<<<<<<<<< @"; junos-odl:space; junos-odl:line { junos-odl:field "hostip"; junos-odl:field "status"; } } } junos-odl:style detail { junos-odl:format host-status-information-format-detail { junos-odl:header "Detail output\n"; junos-odl:picture "@<<<<<<<<<<<< @<<<<<<<<<<<< @"; junos-odl:space; junos-odl:line { junos-odl:field "hostip"; junos-odl:field "status"; junos-odl:field "date"; } } } } } } }
Action-Skript
Das entsprechende Aktionsskript wird rpc-style-test.py. Das Aktionsskript gibt basierend auf dem Wert des level
vom Benutzer bereitgestellten Arguments verschiedene Ausgabeebenen aus. Das Skript definiert einen Standardwert von 'brief'
für das Argument, sodass das Skript den kurzen Ausgabestil zurückgibt, wenn der Benutzer das level
Argument weglässt. In diesem Beispiel werden zwei Versionen des Aktionsskripts bereitgestellt, in denen die Befehlszeilenargumente des Skripts für die verschiedenen Versionen angemessen behandelt werden.
Action Script (Junos OS Version 21.2R1 und höher)
#!/usr/bin/python3 # Junos OS Release 21.2R1 and later import os import argparse parser = argparse.ArgumentParser(description='This is a demo script.') parser.add_argument('--hostip', required=True) parser.add_argument('--level', required=False, default='brief') parser.add_argument('--rpc_name', required=True) args = parser.parse_args() f = os.popen('date') now = f.read() # Ping target host and set the status response = os.system('ping -c 1 ' + args.hostip + ' > /dev/null') if response == 0: pingstatus = "Host is Active" else: pingstatus = "Host is Inactive" # Print RPC XML for the given style print ("<host-status-information>") print ("<{}>".format(args.level)) print ("<hostip>{}</hostip>".format(args.hostip)) print ("<status>{}</status>".format(pingstatus)) if args.level == "detail": print ("<date>{}</date>".format(now)) print ("</{}>".format(args.level)) print ("</host-status-information>")
Action Script (Junos OS Version 21.1 und früher)
#!/usr/bin/python # Junos OS Release 21.1 and earlier import sys import os args = {'hostip': None, 'level': 'brief'} # Retrieve user input and store the values in the args dictionary for arg in args.keys(): if arg in sys.argv: index = sys.argv.index(arg) args[arg] = sys.argv[index+1] f = os.popen('date') now = f.read() # Ping target host and set the status if args['hostip'] is not None: response = os.system('ping -c 1 ' + args['hostip'] + ' > /dev/null') if response == 0: pingstatus = "Host is Active" else: pingstatus = "Host is Inactive" else: pingstatus = "Invalid host" # Print RPC XML for the given style print ("<host-status-information>") print ("<{}>".format(args['level'])) print ("<hostip>{}</hostip>".format(args['hostip'])) print ("<status>{}</status>".format(pingstatus)) if args['level'] == "detail": print ("<date>{}</date>".format(now)) print ("</{}>".format(args['level'])) print ("</host-status-information>")
Konfiguration
Ausführen von Python-Skripten aktivieren
So aktivieren Sie das Gerät für die Ausführung nicht signierter Python-Skripte:
-
Konfigurieren Sie die oder-Anweisung
language python3
entsprechend für dielanguage python
Junos OS-Version.[edit] user@host# set system scripts language (python | python3)
Hinweis:Ab Junos OS Version 20.2R1 und Junos OS Evolved Version 22.3R1 verwendet das Gerät Python 3 zum Ausführen von YANG-Aktions- und Übersetzungsskripten. In früheren Versionen verwendet Junos OS nur Python 2.7 zum Ausführen dieser Skripts, und Junos OS Evolved verwendet standardmäßig Python 2.7 zum Ausführen der Skripts.
-
Bestätigen Sie die Konfiguration.
[edit] user@host# commit and-quit
Laden Sie den RPC auf das Gerät
So fügen Sie den RPC und das Aktionsskript zum Junos-Schema auf dem Gerät hinzu:
-
Laden Sie das YANG-Modul und das Aktionsskript auf das Junos-Gerät herunter.
-
Stellen Sie sicher, dass das Python-Aktionsskript die folgenden Anforderungen erfüllt:
-
Der Dateibesitzer ist entweder root oder ein Benutzer in der Junos OS-Anmeldeklasse
super-user
. -
Nur der Dateibesitzer hat Schreibrechte für die Datei.
-
Das Skript enthält die entsprechende Interpreter-Anweisungszeile, wie unter Erstellen von Aktionsskripts für YANG-RPCs auf Junos-Geräten beschrieben.
-
-
(Optional) Überprüfen Sie die Syntax für das YANG-Modul und das Aktionsskript.
user@host> request system yang validate module /var/tmp/rpc-style-test.yang action-script /var/tmp/rpc-style-test.py YANG modules validation : START YANG modules validation : SUCCESS Scripts syntax validation : START Scripts syntax validation : SUCCESS
-
Fügen Sie das YANG-Modul und das Aktionsskript zu einem neuen YANG-Paket hinzu.
user@host> request system yang add package rpc-style-test module /var/tmp/rpc-style-test.yang action-script /var/tmp/rpc-style-test.py YANG modules validation : START YANG modules validation : SUCCESS Scripts syntax validation : START Scripts syntax validation : SUCCESS TLV generation: START TLV generation: SUCCESS Building schema and reloading /config/juniper.conf.gz ... Restarting mgd ...
-
Wenn Sie vom System aufgefordert werden, die Junos OS CLI neu zu starten, drücken Sie, um den Standardwert von
yes
zu übernehmen, oder geben Sie yes ein, und drückenEnter
SieEnter
.WARNING: cli has been replaced by an updated version: ... Restart cli using the new version ? [yes,no] (yes) yes Restarting cli ...
Überprüfen des RPC
Zweck
Stellen Sie sicher, dass der RPC wie erwartet funktioniert.
Aktion
Führen Sie im Betriebsmodus den RPC in der CLI aus, indem Sie den Befehl ausführen, der durch die junos:command
Anweisung in der RPC-Definition definiert ist. Fügen Sie das input-Argument hostip
und das level
Argument für jede unterschiedliche Ausgabeebene ein.
user@host> show host-status hostip 198.51.100.1 level brief Brief output 198.51.100.1 Host is Active
Sie können den entsprechenden XML-Code anzeigen, indem Sie ihn an den Befehl anhängen | display xml
.
user@host> show host-status hostip 198.51.100.1 level brief | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/18.3R1/junos"> <host-status-information> <brief> <hostip> 198.51.100.1 </hostip> <status> Host is Active </status> </brief> </host-status-information> <cli> <banner></banner> </cli> </rpc-reply>
Ähnlich verhält es sich mit der detaillierten Ausgabe:
user@host> show host-status hostip 198.51.100.10 level detail Detail output 198.51.100.10 Host is Inactive Fri Feb 8 11:55:54 PST 2019
user@host> show host-status hostip 198.51.100.10 level detail | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/18.3R1/junos"> <host-status-information> <detail> <hostip> 198.51.100.10 </hostip> <status> Host is Inactive </status> <date> Fri Feb 8 16:03:35 PST 2019 </date> </detail> </host-status-information> <cli> <banner></banner> </cli> </rpc-reply>
Bedeutung
Wenn Sie den RPC ausführen, ruft das Gerät das Aktionsskript auf. Das Aktionsskript gibt die XML-Hierarchie für die angegebene Ausgabeebene aus, wie in der RPC-Anweisung output
definiert. Wenn der RPC in der CLI ausgeführt wird, verwendet das Gerät die im RPC definierte CLI-Formatierung, um die XML-Ausgabe in die angezeigte CLI-Ausgabe zu konvertieren.