Verwenden von Junos PyEZ-Betriebstabellen und -Ansichten, die strukturierte Ausgaben analysieren
Junos PyEZ operational (op) Tabellen für strukturierte Ausgabe extrahieren spezifische Daten aus der XML-Ausgabe eines RPC, der auf einem Junos-Gerät ausgeführt wird. Nach dem Laden oder Importieren der Tabellendefinition in Ihr Python-Modul können Sie die Tabellenelemente abrufen, die Daten extrahieren und bearbeiten.
Zum Abrufen von Informationen von einem bestimmten Gerät müssen Sie eine Tabelleninstanz erstellen und sie dem Objekt, das Device
das Zielgerät darstellt, zuordnen. Zum Beispiel:
from jnpr.junos import Device from jnpr.junos.op.ethport import EthPortTable with Device(host='router.example.com') as dev: eths = EthPortTable(dev)
In den folgenden Abschnitten wird erläutert, wie Sie die Daten abrufen und bearbeiten können:
Abrufen von Tabellenelementen
Die Table-Eigenschaft item
bestimmt, welche Elemente aus der Betriebsbefehlsausgabe extrahiert werden. So führt beispielsweise die Junos PyEZ EthPortTable-Definition, die hier zur Referenz enthalten ist, den show interfaces "[afgxe][et]-*" media
Befehl standardmäßig aus und extrahiert die physical-interface
Elemente aus der Ausgabe.
--- EthPortTable: rpc: get-interface-information args: media: True interface_name: '[afgxe][et]-*' args_key: interface_name item: physical-interface view: EthPortView
Sie rufen die Tabellenelemente in Ihrem Python-Skript ab, indem Sie die get()
Methode aufrufen und alle gewünschten Argumente liefern. Wenn die Tabellendefinition Standardargumente in der args
Eigenschaft enthält, schließt der ausgeführte RPC diese Argumente automatisch ein, wenn Sie get()
sie nicht in Ihrer Argumentliste überschreiben.
Rufen Sie die get()
Methode mit einer leeren Argumentliste auf, um alle Tabellenelemente abzurufen.
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()
Sie können auch bestimmte Tabellenelemente abrufen, indem Sie Befehlsoptionen als Argumente an die get()
Methode übergeben. Wenn es sich bei der Befehlsoption um ein Flag handelt, das keinen Wert nimmt, legen Sie die Option gleich "True" in der Argumentliste fest. Andernfalls fügen Sie das Argument und den gewünschten Wert als Schlüssel-Wert-Paar in die Argumentliste ein. Sie können die möglichen Argumente für Betriebsbefehle in der Junos CLI überprüfen.
Standardmäßig gibt EthPortTable Informationen für Ethernet-Schnittstellen zurück, deren Namen dem Ausdruck "[afgxe][et]-*"
entsprechen. Um das Tabellenelement nur für die ge-0/3/0-Schnittstelle abzurufen, fügen Sie interface_name='ge-0/3/0'
als Argument zu get()
.
eths = EthPortTable(dev) eths.get(interface_name='ge-0/3/0')
Wenn der Optionsname in der Befehlszeilenschnittstelle (CLI) von Junos OS silphiert ist, müssen Sie alle Striche im Namen in Unterstriche ändern. Der Argumentwert ist jedoch eine Zeichenfolge und kann als solcher Bindestriche enthalten.
Wenn der CLI-Befehl ein optionales erstes Argument annimmt, für das Sie nicht explizit einen Optionsnamen oder -schlüsselwort angeben müssen, können Sie den Optionsnamen in der Liste der get()
Methodenargumente auslassen, sofern die Table-Eigenschaft args_key
auf dieses Argument verweist. Im folgenden Beispiel nimmt der show interfaces
Befehl einen Schnittstellennamen als optionales Argument:
user@router> show interfaces ? Possible completions: <[Enter]> Execute this command <interface-name> Name of physical or logical interface ge-0/0/0 ge-0/0/0.0
Die EthPortTable-Definition-Eigenschaft args_key
definiert das optionale Argument als interface_name
, wodurch Sie dieses Argument verwenden können, ohne den Optionsnamen in der get()
Methodenargumentliste explizit angeben zu müssen.
eths = EthPortTable(dev) eths.get('ge-0/3/0')
Standardmäßig normalisiert Junos PyEZ alle Op-Tabellenschlüssel und -Werte, wodurch alle führenden und nachlaufenden Leerzeichen entfernt werden und Sequenzen interner Leerzeichen durch ein einziges Leerzeichen ersetzt werden. Um die Normalisierung zu deaktivieren, fügen Sie normalize=False
die Methode als Argument ein get()
.
eths = EthPortTable(dev) eths.get(interface_name='ge-0/3/0', normalize=False)
Zugriffstabellenelemente
Nachdem Sie die Tabellenelemente abgerufen haben, können Sie sie wie ein Python-Wörterbuch behandeln, wodurch Sie Methoden in der Standard-Python-Bibliothek für den Zugriff auf und die Bearbeitung der Elemente verwenden können.
Rufen keys()
Sie die Methode auf, um die Liste der Wörterbuchschlüssel anzuzeigen, die den Tabellenelementnamen entsprechen.
eths = EthPortTable(dev).get(interface_name='ge-0/3/0') print (eths.keys())
In diesem Fall gibt es nur einen einzigen Schlüssel.
['ge-0/3/0']
Sie können überprüfen, ob ein bestimmter Schlüssel in den Tabellenelementen vorhanden ist, indem Sie den Python-Operator in
verwenden.
if 'ge-0/3/0' in eths:
Rufen Sie die Methode auf, um eine Liste der Felder oder Werte anzuzeigen, die values()
jedem Schlüssel zugeordnet sind. Die values()
Methode gibt eine Liste von Tupeln mit den Namen-Wert-Paaren für jedes Feld zurück, das in der Ansicht definiert wurde.
print (eths.values())
[[('oper', 'down'), ('rx_packets', '0'), ('macaddr', '00:00:5E:00:53:01'), ('description', None), ('rx_bytes', '0'), ('admin', 'up'), ('mtu', 1514), ('running', True), ('link_mode', None), ('tx_bytes', '0'), ('tx_packets', '0'), ('present', True)]]
Rufen Sie die items()
Methode auf, um die vollständige Liste der Elemente anzuzeigen, einschließlich der Schlüssel und Werte.
print (eths.items())
[('ge-0/3/0', [('oper', 'down'), ('rx_packets', '0'), ('macaddr', '00:00:5E:00:53:01'), ('description', None), ('rx_bytes', '0'), ('admin', 'up'), ('mtu', 1514), ('running', True), ('link_mode', None), ('tx_bytes', '0'), ('tx_packets', '0'), ('present', True)])]
Iterate aus einer Tabelle
Tabellen unterstützen die Iteration, mit der Sie jedes Tabellenelement genauso durchschleifen können, wie Sie eine Liste oder ein Wörterbuch durchschleifen würden. So lassen sich gewünschte Felder ganz einfach formatieren und drucken.
Die EthPortTable-Definition, die im jnpr.junos.op
Modul enthalten ist, führt den show interfaces "[afgxe][et]-*" media
Befehl aus und extrahiert die physical-interface
Elemente aus der Ausgabe. Der folgende Code schleift die physical-interface
Elemente und druckt den Namen und Betriebsstatus jedes Ethernet-Ports:
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 port in eths: print ("{}: {}".format(port.name, port.oper))
Das oper
Feld, das in EthPortView definiert ist, entspricht dem Wert des oper-status
Elements in der Ausgabe. Die EthPortView-Definition definiert name
kein Feld. Standardmäßig verfügt jedes View-Element über eine name
Eigenschaft, die auf den Schlüssel verweist, der dieses Element eindeutig identifiziert.
Die Ausgabe umfasst den Schnittstellennamen und den Betriebsstatus.
ge-0/3/0: up ge-0/3/1: up ge-0/3/2: up ge-0/3/3: up