Definieren von Ansichten für Junos PyEZ-Betriebstabellen, die unstrukturierte Ausgaben analysieren
Junos PyEZ Operational (op) Tabellen für die unstrukturierte Ausgabe extrahieren Daten aus der Textausgabe eines CLI-Befehls, der auf einem Junos-Gerät ausgeführt wird, oder eines vty-Befehls, der auf einem bestimmten Flexible PIC Concentrator (FPC) ausgeführt wird. Eine Tabelle ist einer Ansicht zugeordnet, die verwendet wird, um auf Felder in den Tabellenelementen zuzugreifen und sie benutzerdefinierten Python-Variablen zuzuordnen. Sie ordnen eine Tabelle einer bestimmten Ansicht zu, indem Sie die view Eigenschaft in die Tabellendefinition aufnehmen, die den Ansichtsnamen als Argument verwendet.
Eine Ansicht ordnet Ihre benutzerdefinierten Variablen Daten in den ausgewählten Tabellenelementen zu. Mit einer Ansicht können Sie auf bestimmte Felder in der Ausgabe als Variablen mit Eigenschaften zugreifen, die Sie in Python bearbeiten können. Junos PyEZ übernimmt die Extraktion der Daten in Python sowie die Typkonvertierung oder Datennormalisierung. Die in der Ansicht definierten Schlüssel müssen gültige Python-Variablennamen sein.
In diesem Thema werden die verschiedenen Komponenten der Ansicht erläutert.
Zusammenfassung der Parameter in Ansichten zum Parsen unstrukturierter Ausgaben
Junos PyEZ-Ansichten werden wie Tabellen mit YAML formatiert. Ansichten, die unstrukturierte Ausgaben analysieren, können eine Reihe von Parametern enthalten. Tabelle 1 fasst die Parameter zusammen.
|
Parameter Ansicht |
Beschreibung |
|---|---|
|
Name anzeigen |
Benutzerdefinierter Bezeichner für die Ansicht. |
|
|
(Optional) Liste der Spaltentitel in der Befehlsausgabe. |
|
|
(Optional) Assoziatives Array oder Wörterbuch aus einem oder mehreren Schlüssel-Wert-Paaren, die einen benutzerdefinierten Schlüssel einer Zeichenfolge zuordnen, die einen mathematischen Ausdruck enthält. Der Ausdruck wird für jede Iteration der Daten ausgewertet. Der Schlüssel und der berechnete Wert werden zu den Daten addiert, die dieser Iteration entsprechen. |
|
|
(Optional) Assoziatives Array oder Wörterbuch von Schlüssel-Wert-Paaren, die einen benutzerdefinierten Schlüssel einer Zeichenfolge zuordnen. Wenn die Zeichenfolge in der Ausgabe vorhanden ist, wird die Variable auf True festgelegt, andernfalls wird die Variable auf False festgelegt. |
|
|
(Optional) Assoziatives Array oder Wörterbuch von Schlüssel-Wert-Paaren, die einen benutzerdefinierten Schlüssel dem Namen einer verschachtelten Tabelle zuordnen, die einen bestimmten Abschnitt der Befehlsausgabe analysiert. |
|
|
(Optional) Liste mit einem oder mehreren Schlüsseln, die unter definiert sind |
|
|
(Optional) Liste der regulären Ausdrücke, die dem gewünschten Inhalt entsprechen. |
Name anzeigen
Der Ansichtsname ist ein benutzerdefinierter Bezeichner für die Ansicht. Sie ordnen eine Tabelle einer bestimmten Ansicht zu, indem Sie die view Eigenschaft in die Tabellendefinition aufnehmen und den Ansichtsnamen als Argument angeben.
Im folgenden Beispiel wird eine View mit dem Namen ChassisFanViewdefiniert, auf die durch den Table-Parameter view verwiesen wird:
---
ChassisFanTable:
command: show chassis fan
key: fan-name
view: ChassisFanView
ChassisFanView:
columns:
fan-name: Item
fan-status: Status
fan-rpm: RPM
fan-measurement: Measurement
Spalten
Sie können den columns Parameter in einer Ansicht verwenden, um die in Zeilen und Spalten formatierte Befehlsausgabe zu extrahieren und zu analysieren.
Betrachten Sie die folgende show ospf neighbor Befehlsausgabe:
Address Interface State ID Pri Dead 198.51.100.2 ge-0/0/0.0 Full 192.168.0.2 128 37 198.51.100.6 ge-0/0/1.0 Full 192.168.0.3 128 34
Um die Daten zu extrahieren, schließen Sie den columns Parameter in die Ansicht ein, und ordnen Sie den Namen Ihrer Python-Variablen dem Spaltennamen zu. Die Anwendung speichert den Schlüssel und den Wert, die aus der Befehlsausgabe für diese Spalte extrahiert wurden, als Schlüssel-Wert-Paar im Wörterbuch für das jeweilige Element.
Die folgende Ansicht extrahiert die Daten aus jeder Spalte in der show ospf neighbor Befehlsausgabe:
---
OspfNeighborTable:
command: show ospf neighbor
key: Address
view: OspfNeighborView
OspfNeighborView:
columns:
neighbor_address: Address
interface: Interface
neighbor_state: State
neighbor_id: ID
neighbor_priority: Pri
activity_timer: Dead
Wenn Sie die Daten in der Anwendung "Junos PyEZ" abrufen und drucken, enthalten die Daten für jeden Nachbarn die Spaltenschlüssel und die entsprechenden Daten.
from jnpr.junos import Device from jnpr.junos.command.ospf_neighbor import OspfNeighborTable from pprint import pprint import json with Device(host='router1.example.com') as dev: stats = OspfNeighborTable(dev) stats.get() pprint(json.loads(stats.to_json()))
user@host:~$ python3 junos-pyez-ospf-neighbors.py
{'198.51.100.2': {'activity_timer': 39,
'interface': 'ge-0/0/0.0',
'neighbor_address': '198.51.100.2',
'neighbor_id': '192.168.0.2',
'neighbor_priority': 128,
'neighbor_state': 'Full'},
'198.51.100.6': {'activity_timer': 36,
'interface': 'ge-0/0/1.0',
'neighbor_address': '198.51.100.6',
'neighbor_id': '192.168.0.3',
'neighbor_priority': 128,
'neighbor_state': 'Full'}}
Um die Daten so zu filtern, dass nur Daten aus ausgewählten Spalten enthalten sind, schließen Sie den filters Parameter in die Ansicht ein. Weitere Informationen finden Sie unter Filter.
Einige Befehlsausgaben enthalten Spaltenüberschriften, die sich über mehrere Zeilen erstrecken, z. B.:
FI interrupt statistics
-----------------------
--------------------------------------------------------------------------------
Stream Total RLIM Total Cell timeout Total Reorder Total cell Total number
request PT/MALLOC Ignored cell timeout drops in of times
counter Usemeter errors secure mode entered into
saturation Drops secure mode
--------------------------------------------------------------------------------
36 0 0 1 1 0 0
128 0 0 1 49 0 0
142 0 0 1 53 0 0
--------------------------------------------------------------------------------
...
Um einen mehrzeiligen Spaltentitel in einer Ansicht zu definieren, legen Sie das Spaltenschlüsselelement auf eine Liste der Wörter in jeder Zeile für diesen Titel fest. Die folgende Ansicht definiert die Spalten für die vorherige Befehlsausgabe:
CChipFiStatsTable:
command: show mqss {{ chip_instance }} fi interrupt-stats
target: fpc8
args:
chip_instance: 0
key: Stream
view: CChipFiStatsView
CChipFiStatsView:
columns:
stream: Stream
req_sat:
- Total RLIM
- request
- counter
- saturation
cchip_fi_malloc_drops:
- Total
- PT/MALLOC
- Usemeter
- Drops
cell_timeout_ignored:
- Cell timeout
- Ignored
cchip_fi_cell_timeout:
- Total Reorder
- cell timeout
- errors
drops_in_secure:
- Total cell
- drops in
- secure mode
times_in_secure:
- Total number
- of times
- entered into
- secure mode
Eval-Ausdruck (eval)
Sie können den optionalen eval Parameter verwenden, um Schlüssel-Wert-Paare in den endgültigen Daten hinzuzufügen oder zu ändern, die von der Tabelle und der Ansicht zurückgegeben werden. Der eval Parameter ordnet einen Schlüsselnamen einer Zeichenfolge zu, die einen mathematischen Ausdruck enthält. Sie können den eval Parameter sowohl in Tabellen als auch in Sichten einschließen und eval mehrere Werte definieren und berechnen.
Wenn Sie eine Tabelle verwenden eval , verweist sie auf das vollständige Datenwörterbuch für die Berechnung. Der Schlüssel und der berechnete Wert werden dem Wörterbuch als einzelnes zusätzliches Element hinzugefügt. Wenn Sie in einer Ansicht verwenden eval , wird der Ausdruck für jede Iteration der Daten berechnet. Der berechnete Wert wird den Daten für diese Iteration hinzugefügt. Wenn der eval Schlüsselname mit einem in der Ansicht definierten Schlüssel übereinstimmt, eval wird der Wert dieses Schlüssels durch den berechneten Wert ersetzt. Wenn der eval Schlüsselname nicht mit einem in der Ansicht definierten Schlüssel übereinstimmt, eval werden der neue Schlüssel und der berechnete Wert zu den Daten hinzugefügt.
Der eval Ausdruck kann auf das data von der View zurückgegebene Wörterbuch verweisen. Der Ausdruck muss mit einer Jinja-Vorlagenvariablen referenzieren data , damit Junos PyEZ die Variable durch das Wörterbuch ersetzen kann, wenn der Ausdruck ausgewertet wird.
Ab Junos PyEZ Version 2.8.1 werden Ausdrücke, die in Tabellen- und Ansichtsanweisungen eval verwendet werden, mit einer eingeschränkten Implementierung ausgewertet, um Sicherheitsrisiken bei der Codeausführung zu reduzieren. Junos PyEZ analysiert und validiert jeden Ausdruck anhand eines unterstützten Satzes von Python-Syntax, Funktionen, Methoden und Operationen, bevor er ausgewertet wird. Ausdrücke, die nicht unterstützte oder unsichere Elemente enthalten, werden mit einem UnsafeExpressionError Fehler zurückgewiesen. Tabelle 2 beschreibt die unterstützten Ausdrücke.
| Kategorie | Unterstützte Syntax | Beispiel |
|---|---|---|
|
Arithmetik |
+ - * / // % ** |
|
|
Boolesche Logik |
|
|
|
Literale |
Ganzzahlen, Gleitkommazahlen |
|
|
Zeichenfolgen-Literale |
|
|
|
Wörterbuch-Literale |
|
|
|
Literale auflisten |
|
|
|
Literale festlegen |
|
|
|
Tupel-Literale |
|
|
|
Vergleich |
|
|
|
Wörterbuch |
|
|
|
Liste |
|
|
|
Set |
|
{k for k in {{ data }}.keys()} |
|
Bedingte Ausdrücke |
|
|
|
Funktionen |
|
|
|
Generator |
|
|
|
Indizierung |
|
|
|
Mitgliedschaft |
|
|
|
Methoden |
|
|
|
Schneiden |
|
|
|
Unäre Operatoren |
|
|
Im folgenden Beispiel wird in der Ansichtsdefinition verwendet eval . Der cpu Eintrag ändert den vorhandenen Wert des cpu Feldes für jedes Element im Datenwörterbuch. Der max Eintrag erstellt ein neues Schlüssel-Wert-Paar für jedes Element im Datenwörterbuch.
---
FPCThread:
command: show threads
target: Null
key: Name
view: FPCThreadView
FPCThreadView:
columns:
pid-pr: PID PR
state: State
name: Name
stack: Stack Use
time: Time (Last/Max/Total)
cpu: cpu
eval:
cpu: "'{{ cpu }}'[:-1]"
max: "{{ time }}[4:12]"
Betrachten Sie die folgende Beispielausgabe für den show threads Befehl vty:
PID PR State Name Stack Use Time (Last/Max/Total) cpu --- -- ------- --------------------- --------- --------------------- 1 H asleep Maintenance 680/32768 0/5/5 ms 0% 2 L running Idle 1452/32768 0/22/565623960 ms 80% 3 H asleep Timer Services 1452/32768 0/7/1966 ms 0% ...
Der Parameter der eval Ansicht ändert jeden cpu Eintrag so, dass das Prozentzeichen (%) weggelassen wird. Infolgedessen enthalten die Daten "0" anstelle von "0%". Darüber hinaus fügt es einen neuen Schlüssel maxund seinen berechneten Wert für jedes Element hinzu.
'Maintenance': {'cpu': '0',
'max': '5 ms',
'name': 'Maintenance',
'pid-pr': '1 H',
'stack': '680/32768',
'state': 'asleep',
'time': '0/5/5 ms'},
'Timer Services': {'cpu': '0',
'max': '7 ms',
'name': 'Timer Services',
'pid-pr': '3 H',
'stack': '1452/32768',
'state': 'asleep',
'time': '0/7/1966 ms'},
...
Beispiele, die in der Tabellendefinition verwendet werdeneval, finden Sie unter Eval-Ausdruck (eval).
existiert
Sie können den optionalen exists Parameter in einer Ansicht verwenden, um anzugeben, ob eine Zeichenfolge in der Befehlsausgabe vorhanden ist. exists ist ein Wörterbuch von Schlüssel-Wert-Paaren, die der Zeichenfolge, die in der Befehlsausgabe übereinstimmen soll, einen benutzerdefinierten Python-Variablennamen zuordnen. Wenn die Zeichenfolge in der Ausgabe vorhanden ist, wird die Variable auf Truegesetzt. Andernfalls wird die Variable auf Falsegesetzt.
Betrachten Sie die Ausgabe des show host_loopback status-summary Befehls vty.
SENT: Ukern command: show host_loopback status-summary Host Loopback Toolkit Status Summary: No detected wedges No toolkit errors
In der folgenden Tabelle wird definiert exists , ob die Befehlsausgabe eine No detected wedges Zeichenfolge oder eine No toolkit errors Zeichenfolge enthält:
---
HostlbStatusSummaryTable:
command: show host_loopback status-summary
target: fpc1
view: HostlbStatusSummaryView
HostlbStatusSummaryView:
exists:
no_detected_wedges: No detected wedges
no_toolkit_errors: No toolkit errors
Wenn Sie die Tabelle und die Ansicht verwenden, um auf die Zeichenfolgen zu testen und die resultierenden Werte in Ihrer Junos PyEZ-Anwendung zu drucken, werden beide Variablen in diesem Fall auf True festgelegt.
{'no_detected_wedges': True, 'no_toolkit_errors': True}
Felder
Die Befehlsausgabe kann langwierig und komplex sein, und Sie benötigen möglicherweise eine andere Logik, um verschiedene Abschnitte der Ausgabe zu analysieren. In einigen Fällen können Sie die Befehlsausgabe nicht angemessen analysieren, indem Sie eine einzelne Tabelle und Ansicht verwenden. Um diesen Ausgabetyp zu analysieren, können Sie den optionalen fields Parameter in die Ansicht einschließen. fields ist ein Wörterbuch von Schlüssel-Wert-Paaren, die einen benutzerdefinierten Schlüssel dem Namen einer verschachtelten Tabelle zuordnen, die einen bestimmten Abschnitt der Befehlsausgabe auswählt. Jede verschachtelte Tabelle kann auf eine eigene Ansicht verweisen, die die von dieser Tabelle ausgewählten Daten analysiert.
Betrachten Sie die Ausgabe des show xmchip 0 pt stats Befehls vty, die zwei verschiedene Datenabschnitte enthält:
SENT: Ukern command: show xmchip 0 pt stats WAN PT statistics (Index 0) --------------------------- PCT entries used by all WI-1 streams : 0 PCT entries used by all WI-0 streams : 0 PCT entries used by all LI streams : 0 CPT entries used by all multicast packets : 0 CPT entries used by all WI-1 streams : 0 CPT entries used by all WI-0 streams : 0 CPT entries used by all LI streams : 0 Fabric PT statistics (Index 1) ------------------------------ PCT entries used by all FI streams : 0 PCT entries used by all WI (Unused) streams : 0 PCT entries used by all LI streams : 0 CPT entries used by all multicast packets : 0 CPT entries used by all FI streams : 0 CPT entries used by all WI (Unused) streams : 0 CPT entries used by all LI streams : 0
Die folgende XMChipStatsView Ansicht verwendet den fields Parameter, um zwei zusätzliche Tabellen zu definieren, die zum Analysieren der beiden verschiedenen Abschnitte der Befehlsausgabe verwendet werden. Die _WANPTStatTable Tabellen und _FabricPTStatTable extrahieren die Daten aus den WAN PT statistics Fabric PT statistics bzw. den Abschnitten. In diesem Fall verwenden die Tabellen den delimiter Parameter, um die Daten zu extrahieren und aufzuteilen. Daher müssen die Tabellen nicht auf eine separate Ansicht verweisen.
XMChipStatsTable:
command: show xmchip 0 pt stats
target: fpc1
view: XMChipStatsView
XMChipStatsView:
fields:
wan_pt_stats: _WANPTStatTable
fabric_pt_stats: _FabricPTStatTable
_WANPTStatTable:
title: WAN PT statistics (Index 0)
delimiter: ":"
_FabricPTStatTable:
title: Fabric PT statistics (Index 1)
delimiter: ":"
Wenn Sie die Daten in der Junos PyEZ-Anwendung abrufen und drucken, enthält jeder unter fields definierte Schlüssel die Daten, die von der entsprechenden Tabelle ausgewählt und analysiert wurden.
{'fabric_pt_stats': {'CPT entries used by all FI streams': 0,
'CPT entries used by all LI streams': 0,
'CPT entries used by all WI (Unused) streams': 0,
'CPT entries used by all multicast packets': 0,
'PCT entries used by all FI streams': 0,
'PCT entries used by all LI streams': 0,
'PCT entries used by all WI (Unused) streams': 0},
'wan_pt_stats': {'CPT entries used by all LI streams': 0,
'CPT entries used by all WI-0 streams': 0,
'CPT entries used by all WI-1 streams': 0,
'CPT entries used by all multicast packets': 0,
'PCT entries used by all LI streams': 0,
'PCT entries used by all WI-0 streams': 0,
'PCT entries used by all WI-1 streams': 0}}
Betrachten Sie als weiteres Beispiel die Ausgabe des show ttp statistics Befehls vty:
TTP Statistics:
Receive Transmit
---------- ----------
L2 Packets 4292 1093544
L3 Packets 542638 0
Drops 0 0
Netwk Fail 0 0
Queue Drops 0 0
Unknown 0 0
Coalesce 0 0
Coalesce Fail 0 0
TTP Transmit Statistics:
Queue 0 Queue 1 Queue 2 Queue 3
---------- ---------- ---------- ----------
L2 Packets 1093544 0 0 0
L3 Packets 0 0 0 0
TTP Receive Statistics:
Control High Medium Low Discard
---------- ---------- ---------- ---------- ----------
L2 Packets 0 0 4292 0 0
L3 Packets 0 539172 3466 0 0
Drops 0 0 0 0 0
Queue Drops 0 0 0 0 0
Unknown 0 0 0 0 0
Coalesce 0 0 0 0 0
Coalesce Fail 0 0 0 0 0
TTP Receive Queue Sizes:
Control Plane : 0 (max is 4473)
High : 0 (max is 4473)
Medium : 0 (max is 4473)
Low : 0 (max is 2236)
TTP Transmit Queue Size: 0 (max is 6710)
Die FPCTTPStatsView Ansicht verwendet den fields Parameter, um auf mehrere geschachtelte Tabellen zu verweisen, die die Daten in den verschiedenen Abschnitten der Ausgabe extrahieren. Jede Tabelle verweist auf eine eigene View oder verwendet den delimiter Parameter, um die Daten in diesem Abschnitt zu analysieren.
---
FPCTTPStatsTable:
command: show ttp statistics
target: fpc2
view: FPCTTPStatsView
FPCTTPStatsView:
fields:
TTPStatistics: _FPCTTPStatisticsTable
TTPTransmitStatistics: _FPCTTPTransmitStatisticsTable
TTPReceiveStatistics: _FPCTTPReceiveStatisticsTable
TTPQueueSizes: _FPCTTPQueueSizesTable
_FPCTTPStatisticsTable:
title: TTP Statistics
view: _FPCTTPStatisticsView
_FPCTTPStatisticsView:
columns:
rcvd: Receive
tras: Transmit
_FPCTTPTransmitStatisticsTable:
title: TTP Transmit Statistics
view: _FPCTTPTransmitStatisticsView
_FPCTTPTransmitStatisticsView:
columns:
queue0: Queue 0
queue1: Queue 1
queue2: Queue 2
queue3: Queue 3
filters:
- queue2
_FPCTTPReceiveStatisticsTable:
title: TTP Receive Statistics
key: name
key_items:
- Coalesce
view: _FPCTTPReceiveStatisticsView
_FPCTTPReceiveStatisticsView:
columns:
control: Control
high: High
medium: Medium
low: Low
discard: Discard
_FPCTTPQueueSizesTable:
title: TTP Receive Queue Sizes
delimiter: ":"
Wenn Sie die Daten in der Junos PyEZ-Anwendung abrufen und drucken, enthält jeder fields Schlüssel die Daten, die von der entsprechenden Tabelle extrahiert und analysiert wurden.
{'TTPQueueSizes': {'Control Plane': '0 (max is 4473)',
'High': '0 (max is 4473)',
'Low': '0 (max is 2236)',
'Medium': '0 (max is 4473)'},
'TTPReceiveStatistics': {'Coalesce': {'control': 0,
'discard': 0,
'high': 0,
'low': 0,
'medium': 0,
'name': 'Coalesce'}},
'TTPStatistics': {'Coalesce': {'name': 'Coalesce', 'rcvd': 0, 'tras': 0},
'Coalesce Fail': {'name': 'Coalesce Fail',
'rcvd': 0,
'tras': 0},
'Drops': {'name': 'Drops', 'rcvd': 0, 'tras': 0},
'L2 Packets': {'name': 'L2 Packets',
'rcvd': 4292,
'tras': 1093544},
'L3 Packets': {'name': 'L3 Packets',
'rcvd': 542638,
'tras': 0},
'Netwk Fail': {'name': 'Netwk Fail',
'rcvd': 0,
'tras': 173},
'Queue Drops': {'name': 'Queue Drops',
'rcvd': 0,
'tras': 0},
'Unknown': {'name': 'Unknown', 'rcvd': 0, 'tras': 0}},
'TTPTransmitStatistics': {'L2 Packets': {'queue2': 0},
'L3 Packets': {'queue2': 0}}}
Filter
Der columns Parameter extrahiert Daten aus der Befehlsausgabe, die in Zeilen und Spalten formatiert sind. Wenn Sie den columns Parameter in eine Ansicht einschließen, können Sie optional den Parameter einschließen, um zu filters filtern, welche Spaltendaten in der endgültigen Ausgabe enthalten sind. Der filters Wert ist eine Liste mit einem oder mehreren Schlüsseln, die unter definiert sind columns. Der endgültige Datensatz enthält nur Daten aus den ausgewählten Spalten. Sie können Standardfilter in der Ansichtsdefinition bereitstellen und Filterwerte auch in der Anwendung Junos PyEZ definieren oder überschreiben.
Betrachten Sie die show ospf neighbor Befehlsausgabe:
Address Interface State ID Pri Dead 198.51.100.2 ge-0/0/0.0 Full 192.168.0.2 128 37 198.51.100.6 ge-0/0/1.0 Full 192.168.0.3 128 34
In der folgenden Ansicht definiert der columns Parameter Schlüssel für alle Spalten in der entsprechenden Befehlsausgabe. Mit dem eingeschlossenen filters Parameter enthält das resultierende Datenwörterbuch nur die Daten aus den Address Spalten und State .
---
OspfNeighborFiltersTable:
command: show ospf neighbor
key: Address
view: OspfNeighborFiltersView
OspfNeighborFiltersView:
columns:
neighbor_address: Address
interface: Interface
neighbor_state: State
neighbor_id: ID
neighbor_priority: Pri
activity_timer: Dead
filters:
- neighbor_address
- neighbor_state
Der folgende Junos PyEZ-Code wird zunächst ohne Argumente aufgerufen get() , wobei die Daten mit der Standardliste der in der Ansicht definierten Filter abgerufen werden. Der zweite Aufruf von get() enthält das filters Argument, das die in der Ansicht definierte Filterliste überschreibt.
from jnpr.junos import Device from Tables.show_ospf_neighbor_filter import OspfNeighborFiltersTable from pprint import pprint import json with Device(host='router1.example.com') as dev: stats = OspfNeighborFiltersTable(dev) stats.get() pprint(json.loads(stats.to_json())) print('\n') stats.get(filters=['neighbor_address', 'neighbor_id', 'neighbor_state']) pprint(json.loads(stats.to_json()))
Wenn Sie die Anwendung ausführen, verwendet der erste Aufruf die get() in der Ansicht definierten Filter. Der zweite Aufruf verwendet die im Aufruf definierten Filter, die die in der Ansicht definierten überschreiben.
user@host:~$ python3 junos-pyez-ospf-filters.py
{'198.51.100.2': {'neighbor_address': '198.51.100.2', 'neighbor_state': 'Full'},
'198.51.100.6': {'neighbor_address': '198.51.100.6', 'neighbor_state': 'Full'}}
{'198.51.100.2': {'neighbor_address': '198.51.100.2',
'neighbor_id': '192.168.0.2',
'neighbor_state': 'Full'},
'198.51.100.6': {'neighbor_address': '198.51.100.6',
'neighbor_id': '192.168.0.3',
'neighbor_state': 'Full'}}
RegEx
Sie können den optionalen regex Parameter in einer Ansicht verwenden, um bestimmte Felder in der Befehlsausgabe abzugleichen und zu extrahieren. regex ist ein Wörterbuch, das Schlüssel regulären Ausdrücken zuordnet. Wenn die entsprechende Tabelle nicht definiert item: '*'ist, kombiniert Junos PyEZ die regulären Ausdrücke und gleicht das Ergebnis mit jeder Ausgabezeile ab. Wenn die Tabelle item: '*' jedoch definiert, dass die Daten als einzelne Textzeichenfolge extrahiert werden sollen, gleicht Junos PyEZ stattdessen jeden einzelnen regulären Ausdruck mit der gesamten Textzeichenfolge ab.
Die im regulären Ausdruck definierte Erfassungsgruppe bestimmt die Daten, die aus dem Feld extrahiert und im Datenwörterbuch gespeichert werden. Wenn Sie eine Erfassungsgruppe definieren, wird nur der Wert für diese Gruppe in den Daten gespeichert. Andernfalls speichert Junos PyEZ den Wert, der dem vollständigen Ausdruck entspricht. Ruft z. B (d+.d+) . einen Gleitkommawert aus dem Zeichenfolgensuchausdruck ab und speichert ihn, während (d+).d+ nur der ganzzahlige Teil der Daten gespeichert wird. Wenn Sie mehrere Gruppen definieren, wird nur der Wert für die erste Gruppe gespeichert.
Junos PyEZ nutzt das pyparsing Modul, um eine Reihe von integrierten Schlüsselwörtern zu definieren, die Sie anstelle eines regulären Ausdrucks verwenden können. Tabelle 3 listet das Schlüsselwort, eine kurze Beschreibung und den entsprechenden Ausdruck auf, wobei pp er von import pyparsing as ppabgeleitet ist.
|
Schlüsselbegriff |
Beschreibung |
Ausdruck |
|---|---|---|
|
|
Wort, das nur Hexadezimalzeichen enthält |
hex_numbers = pp.OneOrMore(pp.Word(pp.nums, min=1))
& pp.OneOrMore(pp.Word('abcdefABCDEF', min=1)) |
|
|
Wort, das aus einer Ganzzahl oder einem Gleitkommawert besteht |
numbers = (pp.Word(pp.nums) + pp.Optional(pp.Literal('.') +
pp.Word(pp.nums))).setParseAction(lambda i: ''.join(i)) |
|
|
Wort, das aus Ziffern und einem nachgestellten Prozentzeichen (%) besteht |
percentage = pp.Word(pp.nums) + pp.Literal('%') |
|
|
Ein oder mehrere Wörter, die aus druckbaren Zeichen bestehen (alle Nicht-Leerzeichen) |
printables = pp.OneOrMore(pp.Word(pp.printables)) |
|
|
Wort, das aus alphanumerischen oder alphanumerischen Zeichen besteht |
word = pp.Word(pp.alphanums) | pp.Word(pp.alphas) |
|
|
Eine oder mehrere |
words = (pp.OneOrMore(word)).setParseAction(lambda i: ' '.join(i)) |
Betrachten Sie die folgende show icmp statistics Befehlsausgabe. Jeder Abschnitt der Ausgabe steht unter einem bestimmten Abschnittstitel, und die Daten bestehen aus einer Zahl und einem oder mehreren Wörtern.
ICMP Statistics:
0 requests
0 throttled
0 network unreachables
0 ttl expired
0 redirects
0 mtu exceeded
0 source route denials
0 filter prohibited
0 other unreachables
0 parameter problems
0 ttl captured
0 icmp/option handoffs
0 igmp v1 handoffs
0 tag te requests
0 tag te to RE
ICMP Errors:
0 unknown unreachables
0 unsupported ICMP type
0 unprocessed redirects
0 invalid ICMP type
0 invalid protocol
0 bad input interface
0 bad route lookup
0 bad nh lookup
0 bad cf mtu
0 runts
ICMP Discards:
0 multicasts
0 bad source addresses
0 bad dest addresses
0 IP fragments
0 ICMP errors
0 unknown originators
ICMP Debug Messages:
0 throttled
ICMP Rate Limit Settings:
500 pps per iff
1000 pps total
Um die vorherige Ausgabe zu analysieren, definiert fieldsdie Hauptansicht , die auf verschachtelte Tabellen und Ansichten verweist, die jeden Abschnitt der Ausgabe analysieren. Die verschachtelten Ansichten definieren den Parameter, der regex mit den von der entsprechenden Tabelle extrahierten Daten abgeglichen werden soll.
---
ICMPStatsTable:
command: show icmp statistics
target: fpc1
view: ICMPStatsView
ICMPStatsView:
fields:
discards: _ICMPDiscardsTable
errors: _ICMPErrorsTable
rate: _ICMPRateTable
_ICMPDiscardsTable:
title: ICMP Discards
key: name
view: _ICMPDiscardsView
_ICMPDiscardsView:
regex:
value: \d+
name: '(\w+(\s\w+)*)'
_ICMPErrorsTable:
title: ICMP Errors
key: name
view: _ICMPErrorsView
_ICMPErrorsView:
regex:
error: numbers
name: words
_ICMPRateTable:
title: ICMP Rate Limit Settings
key: name
view: _ICMPRateView
_ICMPRateView:
regex:
rate: numbers
name: words
Beispielsweise wählt die _ICMPDiscardsTable Tabelle die Daten unter dem ICMP Discards Abschnitt in der Befehlsausgabe aus. Die _ICMPDiscardsView Ansicht definiert zwei Schlüssel value und name, die regulären Ausdrücken zugeordnet sind. value mit einer oder mehreren Ziffern übereinstimmt und name mit einem oder mehreren Wörtern übereinstimmt. Da die Tabelle nicht definiert item: '*', werden die regulären Ausdrücke kombiniert und mit jeder Datenzeile in diesem Abschnitt abgeglichen.
_ICMPDiscardsTable:
title: ICMP Discards
key: name
view: _ICMPDiscardsView
_ICMPDiscardsView:
regex:
value: \d+
name: '(\w+(\s\w+)*)'
Die _ICMPErrorsTable Tabelle wählt die Daten unter dem ICMP Errors Abschnitt in der Befehlsausgabe aus. Die _ICMPErrorsView Ansicht definiert die error Tasten und name . Die Felder verwenden die integrierten Schlüsselwörter numbers und words anstelle der expliziten Definition regulärer Ausdrücke.
_ICMPErrorsTable:
title: ICMP Errors
key: name
view: _ICMPErrorsView
_ICMPErrorsView:
regex:
error: numbers
name: words
Wenn die Tabelle definiert item: '*', werden die extrahierten Daten als eine Textzeichenfolge betrachtet. In diesem Fall stimmt jeder reguläre Ausdruck in der entsprechenden Ansicht mit der gesamten Zeichenfolge überein.
Betrachten Sie die show ithrottle id 0 Befehlsausgabe.
SENT: Ukern command: show ithrottle id 0
ID Usage % Cfg State Oper State Name
-- ------- --------- ---------- --------
0 50.0 1 1 TOE ithrottle
Throttle Times: In hptime ticks In ms
--------------- ------
Timer Interval 333333 5.000
Allowed time 166666 2.500
Allowed excess 8333 0.125
Start time 488655082 n/a
Run time this interval 0 0.000
Deficit 0 0.000
Run time max 17712 0.266
Run time total 144154525761 2162317
Min Usage Perc: 25.0
Max Usage Perc: 50.0
AdjustUsageEnable: 1
Throttle Stats:
Starts : 65708652
Stops : 65708652
Checks : 124149442
Enables : 0
Disables : 0
AdjUp : 6
AdjDown : 4
In der folgenden Tabelle werden die Daten als einzelne Zeichenfolge extrahiert item: '*' . Der Parameter der regex Ansicht definiert drei reguläre Ausdrücke. Jedes Regex-Muster wird mit der gesamten Zeichenfolge abgeglichen. Da die regulären Ausdrücke Erfassungsgruppen definieren, speichert Junos PyEZ nur die Daten, die mit der Gruppe übereinstimmen.
IthrottleIDTable:
command: show ithrottle id {{ id }}
args:
id: 0
item: '*'
target: fpc1
view: IthrottleIDView
IthrottleIDView:
regex:
min_usage: 'Min Usage Perc: (\d+\.\d+)'
max_usage: 'Max Usage Perc: (\d+\.\d+)'
usg_enable: 'AdjustUsageEnable: (\d)'
fields:
throttle_stats: _ThrottleStatsTable
_ThrottleStatsTable:
title: Throttle Stats
delimiter: ":"
Wenn Sie die Daten in der Anwendung "Junos PyEZ" abrufen und drucken, enthalten die Daten die drei regex Elemente, die den Wert enthalten, der von der Erfassungsgruppe für diesen Ausdruck abgeglichen wird.
{'max_usage': 50.0,
'min_usage': 25.0,
'throttle_stats': {'AdjDown': 4,
'AdjUp': 6,
'Checks': 124149442,
'Disables': 0,
'Enables': 0,
'Starts': 65708652,
'Stops': 65708652},
'usg_enable': 1}
Tabellarischer Änderungsverlauf
Die Unterstützung der Funktion hängt von der Plattform und der Version ab, die Sie benutzen. Verwenden Sie den Feature-Explorer , um festzustellen, ob eine Funktion auf Ihrer Plattform unterstützt wird.
eval verwendet werden, mit einer eingeschränkten Implementierung ausgewertet.