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.

Tabelle 1: Parameter in Ansichten für Junos PyEZ Op-Tabellen für unstrukturierte Ausgabe

Parameter Ansicht

Beschreibung

Name anzeigen

Benutzerdefinierter Bezeichner für die Ansicht.

columns

(Optional) Liste der Spaltentitel in der Befehlsausgabe.

eval

(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.

exists

(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.

fields

(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.

filters

(Optional) 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.

regex

(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:

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:

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:

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.

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.:

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:

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.

Tabelle 2: Unterstützte Ausdrücke in eval-Anweisungen
Kategorie Unterstützte Syntax Beispiel

Arithmetik

+ - * / // % **

a+b
a*100

Boolesche Logik

and, or

a > 0 and b > 0

Literale

Ganzzahlen, Gleitkommazahlen

123
3.14

Zeichenfolgen-Literale

'text'

Wörterbuch-Literale

{'a':1}

Literale auflisten

[1,2,3]

Literale festlegen

{1,2,3}

Tupel-Literale

(1,2,3)

Vergleich
Operatoren

== != < <= > >=

{{ cpu }} > 80

Wörterbuch
Verständnis

{k:v for ...}

{k:v for k,v in {{ data }}.items()}

Liste
Verständnis

[expr for ...]

[v['errors'] for k,v in {{ data }}.items()]

Set
Verständnis

{expr for ...}

{k for k in {{ data }}.keys()}

Bedingte Ausdrücke

x if cond else y

'busy' if {{ cpu }} > 80 else 'idle'

Funktionen

abs()– Absoluter Wert
dict()– Erstellen eines Wörterbuchs
isinstance()—Typprüfung
len()—Länge eines iterierbaren
max()—Maximalwert
min()—Mindestwert
sum()– Summe ein iterierbares

sum([1,2,3])

Generator
Ausdrücke

(expr for ...)

(v for v in {{ data }}.values())

Indizierung

[n]

{{ data }}[0]

Mitgliedschaft

in, not in

'xe' in {{ name }}

Methoden

endswith()—Prüfung des Zeichenfolgensuffixes
get()– Sicheres Nachschlagen im Wörterbuch
items()– Zurückgeben von Wörterbuchschlüsseln und -werten
keys()– Rückgabe von Wörterbuchschlüsseln
values()– Zurückgeben von Wörterbuchwerten

{{ data }}.items()

Schneiden

[start:end:step]

'{{ cpu }}'[:-1]

Unäre Operatoren

+x, -x, not x

-{{ cpu }}

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.

Betrachten Sie die folgende Beispielausgabe für den show threads Befehl vty:

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.

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.

In der folgenden Tabelle wird definiert exists , ob die Befehlsausgabe eine No detected wedges Zeichenfolge oder eine No toolkit errors Zeichenfolge enthält:

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.

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:

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.

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.

Betrachten Sie als weiteres Beispiel die Ausgabe des show ttp statistics Befehls vty:

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.

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.

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:

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 .

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.

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.

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.

Tabelle 3: Schlüsselwörter für Regex-Parameter

Schlüsselbegriff

Beschreibung

Ausdruck

hex_numbers

Wort, das nur Hexadezimalzeichen enthält

hex_numbers = pp.OneOrMore(pp.Word(pp.nums, min=1))
    & pp.OneOrMore(pp.Word('abcdefABCDEF', min=1))

numbers

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))

percentage

Wort, das aus Ziffern und einem nachgestellten Prozentzeichen (%) besteht

percentage = pp.Word(pp.nums) + pp.Literal('%')

printables

Ein oder mehrere Wörter, die aus druckbaren Zeichen bestehen (alle Nicht-Leerzeichen)

printables = pp.OneOrMore(pp.Word(pp.printables))

word

Wort, das aus alphanumerischen oder alphanumerischen Zeichen besteht

word = pp.Word(pp.alphanums) | pp.Word(pp.alphas)

words

Eine oder mehrere word Zeichenfolgen

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.

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.

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.

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.

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.

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.

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.

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.

Veröffentlichung
Beschreibung
2.8.1
Ab Junos PyEZ Version 2.8.1 werden Ausdrücke, die in Tabellen- und Ansichtsanweisungen eval verwendet werden, mit einer eingeschränkten Implementierung ausgewertet.