AUF DIESER SEITE
Definieren von Ansichten für Junos PyEZ-Betriebstabellen, die strukturierte Ausgaben analysieren
Junos PyEZ-Betriebstabellen für strukturierte Ausgabe wählen spezifische Daten aus der XML-Ausgabe eines RPC, der auf einem Junos-Gerät ausgeführt wird. Eine Tabelle wird einer Ansicht zugeordnet, die verwendet wird, um auf Felder in den Tabellenelementen zuzugreifen und sie benutzerdefinierten Python-Variablen zuzuordnen. Sie weisen eine Tabelle einer bestimmten Ansicht zu, indem Sie die view
Eigenschaft in die Tabellendefinition einbinden, die den View-Namen als Argument annimmt.
A View ordnet Ihre benutzerdefinierten Variablen XML-Elementen in den ausgewählten Tabellenelementen zu. Mit einer Ansicht können Sie auf bestimmte Felder in der Ausgabe als Variablen mit Eigenschaften zugreifen, die in Python geändert werden können. Junos PyEZ kümmert sich um die Extraktion der Daten in Python sowie um die Konvertierung oder Normalisierung aller Art. Die in der Ansicht definierten Schlüssel müssen gültige Python-Variablennamen sein.
Junos PyEZ-Ansichten wie Tabellen werden mithilfe von YAML formatiert. Ansichten, die strukturierte Ausgaben analysieren, können eine Reihe von Parametern enthalten, die in Tabelle 1 zusammengefasst sind.
Parametername anzeigen |
Parameter anzeigen |
Beschreibung |
---|---|---|
Name anzeigen |
– |
Benutzerdefinierte Bezeichner für die Ansicht. |
Feldelemente |
|
Assoziatives Array oder Wörterbuch von Schlüssel-Wert-Paaren, die benutzerdefinierte Feldnamen XPath-Ausdrücken zuordnen, die Elemente in den Tabellenelementen auswählen. Die Feldnamen müssen gültige Python-Variablennamen sein. |
Feldgruppen |
|
Assoziatives Array oder Wörterbuch von Schlüssel-Wert-Paaren, die benutzerdefinierte Feldnamen XPath-Ausdrücken zuordnen, die Elemente in den Tabellenelementen auswählen. Die XPath-Ausdrücke sind relativ zum Kontext, der durch den entsprechenden groups-Parameter festgelegt wird. Die Feldnamen müssen gültige Python-Variablennamen sein. |
Gruppen |
|
Assoziatives Array oder Wörterbuch von Schlüssel-Wert-Paaren, die einen benutzerdefinierten Gruppennamen einem XPath-Ausdruck zuordnen (relativ zum Tabellenelementkontext), der den XPath-Kontext für Felder in dieser Gruppe festlegt. |
Betrachten Sie die folgende Junos PyEZ Op-Tabelle und -Ansicht, die in der Junos PyEZ-Verteilung enthalten sind. Die Tabelle extrahiert Betriebszustandsinformationen für Ethernet-Schnittstellen auf dem Zielgerät.
--- EthPortTable: rpc: get-interface-information args: media: True interface_name: '[afgxe][et]-*' args_key: interface_name item: physical-interface view: EthPortView EthPortView: groups: mac_stats: ethernet-mac-statistics flags: if-device-flags fields: oper: oper-status admin: admin-status description: description mtu: { mtu : int } link_mode: link-mode macaddr: current-physical-address fields_mac_stats: rx_bytes: input-bytes rx_packets: input-packets tx_bytes: output-bytes tx_packets: output-packets fields_flags: running: { ifdf-running: flag } present: { ifdf-present: flag }
In den folgenden Abschnitten werden die verschiedenen Komponenten der Ansicht diskutiert:
Name anzeigen
Der Ansichtsname ist eine benutzerdefinierte Kennung für die Ansicht. Sie weisen eine Tabelle einer bestimmten Ansicht zu, indem Sie die view
Eigenschaft in die Tabellendefinition integrieren und als Argument den View-Namen angeben. Zum Beispiel:
--- EthPortTable: # Table definition view: EthPortView EthPortView: # View definition
Felder (Felder)
Sie passen Ansichten an, sodass sie nur auf die erforderlichen Elemente aus den ausgewählten Tabellenelementen verweisen. Dazu fügen Sie die fields
Eigenschaft und ein assoziatives Array mit der Zuordnung benutzerdefinierter Feldnamen zu XPath-Ausdrücken hinzu, die die gewünschten Elemente aus dem Tabellenelement auswählen. Die Feldnamen müssen gültige Python-Variablennamen sein. Die XPath-Ausdrücke sind relativ zum Kontext der Tabellenelemente.
Betrachten Sie die folgende RPC-Beispielausgabe:
<rpc-reply> <interface-information> <physical-interface> <name>ge-0/3/0</name> <admin-status junos:format="Enabled">up</admin-status> <oper-status>down</oper-status> <local-index>135</local-index> <snmp-index>530</snmp-index> <link-level-type>Ethernet</link-level-type> <mtu>1514</mtu> ... </physical-interface> </interface-information> </rpc-reply>
Wenn der Parameter Table item
Elemente aus der Ausgabe auswählt <physical-interface>
, ist der XPath-Ausdruck für jedes Feld in der View-Definition relativ zu diesem Kontext. Die folgende Ansichtsdefinition ordnet jeden benutzerdefinierten Feldnamen einem untergeordneten Element des <physical-interface>
Elements zu:
EthPortView: fields: oper: oper-status admin: admin-status mtu: { mtu : int }
Im Python-Skript können Sie dann auf ein View-Element als Variableneigenschaft zugreifen. Standardmäßig verfügt jedes View-Element über eine name
Eigenschaft, die auf den Schlüssel verweist, der dieses Element eindeutig identifiziert.
from jnpr.junos import Device from jnpr.junos.op.ethport import EthPortTable with Device(host='router.example.com') as dev: eths = EthPortTable(dev) eths.get() for item in eths: print (item.name) print (item.oper) print (item.admin) print (item.mtu)
Das Feldformat bestimmt den Typ für den Wert eines Feldes. Standardmäßig werden Feldwerte als Zeichenfolgen gespeichert. Sie können einen anderen Typ für den Feldwert in der Feldzuordnung angeben. Im folgenden Beispiel wird der Wert des mtu
Elements als integer definiert:
EthPortView: fields: mtu: { mtu : int }
In der RPC-Ausgabe sind einige Junos XML-Elemente nur leere Elemente, die als Flags fungieren. Sie können explizit angeben, dass ein Feld in der Feldzuordnung ein Flag ist. Der Feldelementwert für ein Flag ist True, wenn das Element in der Ausgabe vorhanden ist, und False, wenn das Element fehlt. Im folgenden Beispiel wird das ifdf-running
Element als Flag definiert:
EthPortView: fields: mtu: { mtu : int } running: { if-device-flags/ifdf-running : flag }
Sie können den Feldelementwert auch mit der folgenden Syntax auf einen Boolen festlegen:
fieldname: { element-name: (True | False)=regex(expression) }
Der Wert des Elements wird mit dem regulären Ausdruck bewertet, der an regex()
. Wenn der Wert des Elements mit dem Ausdruck übereinstimmt, wird der Wert des Feldelements auf den im Format definierten Booleschen Wert festgelegt. Im folgenden Beispiel wird das oper_status_down
Feld auf True festgelegt, wenn der Wert des oper-status
Elements "down" enthält:
oper_status_down: { oper-status: True=regex(down) }
Sie können auch komplexere reguläre Ausdrücke verwenden und mit mehreren Werten abgleichen. Das folgende Feldelement wird auf True festgelegt, wenn die Adresse im rt-destination
Element mit '198.51.' beginnt:
dc1_route: { rt-destination: True=regex(^198\.51\.) }
Das folgende Feldelement wird auf True festgelegt, wenn das no-refresh
Element einen Wert im regulären Ausdruck enthält.
no_refresh: { no-refresh: 'True=regex(Session ID: 0x0|no-refresh)' }
Gruppen (Gruppen) und Feldgruppen (fields_)
Gruppen stellen eine Verknüpfungsmethode zum Auswählen und Referenzieren von Elementen innerhalb eines bestimmten Knotensatzes in einem Tabellenelement bereit.
In der folgenden RPC-Ausgabe enthält das <if-device-flags>
Element mehrere untergeordnete Elemente, die den Werten entsprechen, die Device flags
im Feld in der CLI-Ausgabe angezeigt werden:
<rpc-reply> <interface-information> <physical-interface> <name>ge-0/3/0</name> ... <if-device-flags> <ifdf-present/> <ifdf-running/> </if-device-flags> ... </physical-interface> </interface-information> </rpc-reply>
In der Ansichtsdefinition können Sie die fields
Eigenschaft verwenden, um auf die untergeordneten Elemente zuzugreifen, indem Sie für jedes Element relativ zum ausgewählten Tabellenelement den vollständigen XPath-Ausdruck bereitstellen. Wenn beispielsweise die EthPortTable-Definition Elemente auswählt <physical-interface>
, würde die Feldelementzuordnung die folgenden XPath-Ausdrücke verwenden:
EthPortView: fields: present: if-device-flags/ifdf-present running: if-device-flags/ifdf-running
Alternativ können Sie eine Gruppe erstellen, die den Kontext auf das <if-device-flags>
Element legt, und dann Feldgruppenelemente definieren, die nur den XPath-Ausdruck relativ zu diesem Kontext bereitstellen. Sie können eine beliebige Anzahl von Gruppen innerhalb einer Ansichtsdefinition definieren.
Um eine Gruppe zu erstellen, fügen Sie die groups
Eigenschaft ein und ordnen Sie dem XPath-Ausdruck, der den neuen Kontext definiert, einen benutzerdefinierten Gruppennamen zu. Definieren Sie dann eine Feldgruppe, auf deren Name fields_
der Gruppenname folgt. Die Feldgruppe ist ein assoziatives Array, das die Zuordnung von benutzerdefinierten Feldnamen zu XPath-Ausdrücken enthält, die nun relativ zum Kontextsatz in groups
. Die Feldnamen müssen gültige Python-Variablennamen sein.
Im folgenden Beispiel werden die Gruppe flags
und die entsprechende Feldgruppe fields_flags
definiert. Die flags
Gruppe legt den Kontext auf die physical-interface/if-device-flags
Hierarchieebene fest, und die present
Felder running
und Felder greifen auf die Werte der Elemente bzwifdf-running
. elemente ifdf-present
zu.
EthPortView: groups: flags: if-device-flags fields_flags: present: ifdf-present running: ifdf-running
Unabhängig davon, ob Sie Felder oder Feldgruppen verwenden, greifen Sie innerhalb des Junos PyEZ-Skripts auf dieselbe Weise auf den Wert zu, indem Sie die benutzerdefinierten Feldnamen verwenden.