Definieren von Ansichten für Junos PyEZ-Betriebstabellen, die unstrukturierte Ausgaben analysieren
Junos PyEZ operational (op) Tabellen für unstrukturierte Ausgaben, 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 Namen View als Argument verwendet.
Eine Ansicht ordnet Ihre benutzerdefinierten Variablen den Daten in den ausgewählten Tabellenelementen zu. In einer Ansicht können Sie auf bestimmte Felder in der Ausgabe als Variablen mit Eigenschaften zugreifen, die in Python bearbeitet werden können. Junos PyEZ kümmert sich um die Extraktion der Daten in Python sowie um jede 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, die in Tabelle 1 zusammengefasst sind.
View-Parameter |
Beschreibung |
|---|---|
Name anzeigen |
Benutzerdefinierter Bezeichner für die Ansicht. |
|
(Optional) Liste der Spaltentitel in der Befehlsausgabe. |
|
(Optional) Assoziatives Array oder Wörterbuch eines oder mehrerer Schlüssel-Wert-Paare, die einen benutzerdefinierten Schlüssel einer Zeichenfolge zuordnen, die einen mathematischen Ausdruck enthält. Für jede Iteration der Daten wird der Ausdruck mithilfe der Python-Funktion |
|
(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 gesetzt, andernfalls wird die Variable auf False gesetzt. |
|
(Optional) Assoziatives Array oder Wörterbuch von Schlüssel-Wert-Paaren, die einen benutzerdefinierten Schlüssel dem Namen einer geschachtelten Tabelle zuordnen, die einen bestimmten Abschnitt der Befehlsausgabe analysiert. |
|
(Optional) Liste eines oder mehrerer Schlüssel, 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 view Table-Parameter 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 Befehlsausgaben zu extrahieren und zu analysieren, die in Zeilen und Spalten formatiert sind.
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, fügen Sie den columns Parameter in die Ansicht ein, und ordnen Sie den Python-Variablennamen 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 angegebene Element.
In der folgenden Ansicht werden die Daten aus den einzelnen Spalten in der show ospf neighbor Befehlsausgabe extrahiert:
---
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 Junos PyEZ-Anwendung 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, fügen Sie den filters Parameter in die Ansicht ein. Weitere Informationen finden Sie unter Filter.
Einige Befehlsausgaben enthalten Spaltentitel, 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 gleich einer Liste der Wörter in jeder Zeile für diesen Titel fest. In der folgenden Ansicht werden die Spalten für die vorherige Befehlsausgabe definiert:
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, der von der Python-Funktion eval ausgewertet wird. Sie können den eval Parameter sowohl in Tabellen als auch in Ansichten einschließen und eval mehrere Werte definieren und berechnen.
Wenn Sie es in einer Tabelle verwenden eval , verweist es für die Berechnung auf das vollständige Datenwörterbuch, und der Schlüssel und der berechnete Wert werden dem Wörterbuch als einzelnes zusätzliches Element hinzugefügt. Bei Verwendung eval in einer Ansicht wird der Ausdruck für jede Iteration der Daten berechnet, und 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 Wörterbuch verweisen, das data von View zurückgegeben wird. Der Ausdruck muss mithilfe einer Jinja-Vorlagenvariablen referenziert data werden, damit Junos PyEZ die Variable bei der Auswertung des Ausdrucks durch das Wörterbuch ersetzen kann.
Im folgenden Beispiel wird in der View-Definition verwendet eval . Der cpu Eintrag ändert den vorhandenen Wert des cpu Felds für jedes Element im Datenwörterbuch, und 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 }}'.split('/'))[1]"
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 View-Parameter eval ändert jeden cpu Eintrag so, dass das Prozentzeichen (%) weggelassen wird. Daher enthalten die Daten "0" anstelle von "0%". Darüber hinaus werden für jedes Element ein neuer Schlüssel maxund der berechnete Wert hinzugefügt.
'Maintenance': {'cpu': '0',
'max': '5',
'name': 'Maintenance',
'pid-pr': '1 H',
'stack': '680/32768',
'state': 'asleep',
'time': '0/5/5 ms'},
'Timer Services': {'cpu': '0',
'max': '7',
'name': 'Timer Services',
'pid-pr': '3 H',
'stack': '1452/32768',
'state': 'asleep',
'time': '0/7/1966 ms'},
...
Beispiele, die in der Tabellendefinition verwendet werden, finden Sie eval unter Auswertungsausdruck (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 einen benutzerdefinierten Python-Variablennamen der Zeichenfolge zuordnen, die in der Befehlsausgabe übereinstimmen soll. 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 die Zeichenfolgen zu testen und die resultierenden Werte in Ihrer Junos PyEZ-Anwendung auszugeben, werden in diesem Fall beide Variablen 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 mit einer einzelnen Tabelle und Ansicht nicht angemessen analysieren. Um diesen Ausgabetyp zu analysieren, können Sie den optionalen fields Parameter in die Ansicht aufnehmen. fields ist ein Wörterbuch von Schlüssel-Wert-Paaren, die einen benutzerdefinierten Schlüssel dem Namen einer geschachtelten Tabelle zuordnen, die einen bestimmten Abschnitt der Befehlsausgabe auswählt. Jede geschachtelte Tabelle kann auf ihre eigene Ansicht verweisen, die zum Analysieren der von dieser Tabelle ausgewählten Daten verwendet wird.
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
In der folgenden XMChipStatsView Ansicht wird der fields Parameter verwendet, 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 Abschnitten bzw Fabric PT statistics . den Abschnitten. In diesem Fall verwenden die Tabellen den delimiter Parameter, um die Daten zu extrahieren und aufzuteilen, sodass sie nicht auf eine separate Ansicht verweisen müssen.
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 werden.
{'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 verschachtelte Tabellen zu verweisen, die die Daten in den verschiedenen Abschnitten der Ausgabe extrahieren. Jede Tabelle verweist auf ihre eigene Ansicht 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 ist. Wenn Sie den columns Parameter in eine Ansicht einschließen, können Sie optional den filters Parameter einschließen, um zu filtern, welche Spaltendaten in der endgültigen Ausgabe enthalten sind. Der filters Parameter definiert eine Liste von 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 angeben und Filterwerte in der Junos PyEZ-Anwendung 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, aber der filters Parameter enthält nur die Daten aus den Address Spalten und State im Datenwörterbuch.
---
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 ruft zunächst ohne Argumente auf get() , wodurch die Daten mithilfe der in der Ansicht definierten Standardliste von Filtern abgerufen werden. Der zweite Aufruf von enthält get() das Argument filters , 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 von get() die in der Ansicht definierten Filter, und der zweite Aufruf verwendet die im Aufruf definierten Filter, die die in der Ansicht definierten Filter ü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 in der Tabelle jedoch definiert item: '*' ist, 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 mit dem vollständigen Ausdruck übereinstimmt. 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 integrierter Schlüsselwörter zu definieren, die Sie anstelle eines regulären Ausdrucks verwenden können. Tabelle 2 listet das Schlüsselwort, eine kurze Beschreibung und den entsprechenden Ausdruck auf, wobei von pp abgeleitet ist import pyparsing as pp.
Schlüsselwort |
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 einem Integer- oder Float-Wert 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 abschließenden Prozentzeichen (%) besteht |
percentage = pp.Word(pp.nums) + pp.Literal('%') |
|
Ein oder mehrere Wörter, die aus druckbaren Zeichen bestehen (alle Zeichen, die keine Leerzeichen sind) |
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 Ausgabeabschnitt befindet sich 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 geschachtelte 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 und name mit einem oder mehreren Wörtern übereinstimmt. Da die Tabelle nicht definiert item: '*'ist, 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 Schlüssel und name verwendet 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 in der Tabelle definiert item: '*'ist, 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 item: '*' Daten als einzelne Zeichenfolge extrahiert. Der Parameter View definiert regex 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 Junos PyEZ-Anwendung abrufen und drucken, enthalten die Daten die drei regex Elemente, die den Wert enthalten, der von der Erfassungsgruppe für diesen Ausdruck abgeglichen wurde.
{'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}