Verwenden von Junos PyEZ-Tabellen mit TextFSM-Vorlagen
ZUSAMMENFASSUNG Junos PyEZ op-Tabellen können allein oder in Verbindung mit einer Junos PyEZ-Ansicht auf eine TextFSM-Vorlage verweisen, um die CLI- oder VTY-Befehlsausgabe eines beliebigen Netzwerkgeräts zu analysieren.
Grundlegendes zu TextFSM-Vorlagen
Junos PyEZ op Tables können Daten aus der CLI- oder VTY-Befehlsausgabe extrahieren. Die Tabelle kann auf eine Ansicht verweisen, um Felder in der Befehlsausgabe Python-Objekten zuzuordnen. Ab Junos PyEZ-Version 2.4.0 können Junos PyEZ-Tabellen auch allein oder in Verbindung mit einer Ansicht auf eine TextFSM-Vorlage verweisen, um die Befehlsausgabe zu analysieren. Junos PyEZ op Tables können TextFSM-Vorlagen verwenden, um Befehlsausgaben von jedem Netzwerkgerät unabhängig von Hersteller, Netzwerkbetriebssystem oder Befehl zu analysieren.
TextFSM
ist eine Python-Bibliothek, die halbformatierte CLI-Ausgaben, wie z. B. die Ausgabe des Befehls show, von Netzwerkgeräten analysiert. Es wurde von Google entwickelt und später unter der Apache-2.0-Lizenz veröffentlicht. Das Modul benötigt eine Vorlage und etwas Eingabetext. Die Vorlage verwendet reguläre Ausdrücke, um zu beschreiben, wie die Daten analysiert werden, und Sie können mehrere Vorlagen definieren und auf dieselben Daten anwenden.
TextFSM
CliTable
Die Klasse von ermöglicht es Benutzern, einen Befehl auf einer bestimmten Plattform der Vorlage zuzuordnen, die die Befehlsausgabe analysiert. Network to Code, ein Unternehmen für Netzwerkautomatisierung, hat einen Python-Wrapper zusammen mit CliTable
einem Repository von TextFSM-Vorlagen für Netzwerkgeräte entwickelt. Sie können die ntc-templates
Bibliothek auf Ihrem Junos PyEZ-Server bzw. in Ihrer virtuellen Umgebung installieren und dann in Ihren Junos PyEZ-Tabellen auf die NTC-Vorlagen und andere TextFSM-Vorlagen verweisen.
Die NTC-Vorlagen parse show Befehlsausgabe von Netzwerkgeräten. Jede NTC-Vorlage definiert die erwarteten Ausgabefelder für einen bestimmten Befehl und ordnet die Daten für jedes Element einem Header zu. Der Dateiname der NTC-Vorlage identifiziert den Hersteller, das Netzwerkbetriebssystem und den Befehl (mit Unterstrichen), sodass das System leicht bestimmen kann, welche Vorlage für eine bestimmte Plattform und einen bestimmten Befehl verwendet werden soll.
vendor_os_command.textfsm
Betrachten Sie z. B. die Vorlage juniper_junos_show_arp_no-resolve.textfsm .
Value Required MAC ([A-Fa-f0-9\:]{17}) Value Required IP_ADDRESS ([A-Fa-f0-9:\.]+) Value Required INTERFACE (\S+) Value FLAGS (\S+) Start ^MAC\s+Address\s+Address\s+Interface\s+Flags\s*$$ ^${MAC}\s+${IP_ADDRESS}\s+${INTERFACE}\s+${FLAGS} -> Record ^Total.* ^\s*$$ ^{master:\d+} ^. -> Error
Die Vorlage analysiert die show arp no-resolve
Befehlsausgabe von Juniper Networks Junos-Geräten.
user@host> show arp no-resolve MAC Address Address Interface Flags 02:01:00:00:00:05 10.0.0.5 em0.0 none 30:7c:5e:48:4b:40 198.51.100.77 fxp0.0 none f8:c0:01:18:8b:67 198.51.100.254 fxp0.0 none 02:00:00:00:00:10 128.0.0.50 em0.0 none Total entries: 4
Junos PyEZ op-Tabellen können eine NTC-Vorlage oder eine andere TextFSM-Vorlage verwenden, um unstrukturierte Befehlsausgaben zu analysieren. Die Tabelle verwendet eine TextFSM-Vorlage, indem die folgenden Felder definiert werden. Junos PyEZ verwendet die platform
Werte und command
, um den Dateinamen der Vorlage zu bestimmen.
command: command
– Befehl, der die zu analysierende Ausgabe generiert. Der Befehl muss der Befehlszeichenfolge im Dateinamen einer NTC-Vorlage oder einer anderen TextFSM-Vorlage zugeordnet werden.key: key
– Feld, das in der TextFSM-Vorlage oder in der Junos PyEZ-Ansicht definiert ist und zur eindeutigen Identifizierung des Datensatzelements verwendet wird.platform: platform
– Anbieter und Betriebssystem für die TextFSM-Vorlage, z. Bjuniper_junos
. . . Der Plattformwert muss mit dem Plattform-String im Dateinamen einer NTC-Vorlage oder einer anderen TextFSM-Vorlage übereinstimmen.use_textfsm: True
– Geben Sie an, dass die Junos PyEZ-Tabelle die Befehlsausgabe mithilfe der TextFSM-Vorlage für die angegebene Plattform und den angegebenen Befehl analysieren soll.
So verwenden Sie TextFSM-Vorlagen zum Parsen der Befehlsausgabe
Junos PyEZ-Tabellen können TextFSM-Vorlagen, einschließlich der vordefinierten NTC-Vorlagen, verwenden, um die Ausgabe von show-Befehlen von Junos-Geräten zu analysieren.
So verwenden Sie TextFSM-Vorlagen in einer Junos PyEZ-Tabelle:
Installieren Sie die
ntc-templates
Bibliothek auf Ihrem Junos PyEZ-Server oder in Ihrer virtuellen Umgebung.user@host:~$ pip3 install ntc_templates
Erstellen Sie eine benutzerdefinierte Junos PyEZ-Tabelle, die die Argumente ,
key
,platform
unduse_textfsm
und alle zusätzlichen Argumente enthält, diecommand
für Ihren Betrieb erforderlich sind.--- ArpTableTextFSM: command: show arp no-resolve platform: juniper_junos key: MAC use_textfsm: True
Die Junos PyEZ-Anwendung verwendet die
platform
Werte undcommand
, um den Dateinamen der Vorlage zu bestimmen, der in diesem Fall juniper_junos_show_arp_no-resolve.textfsm lautet.Erstellen Sie eine Junos PyEZ-Anwendung, die die Tabelle zum Abrufen der Daten verwendet.
from jnpr.junos import Device from jnpr.junos.factory.factory_loader import FactoryLoader from pprint import pprint import json import yaml import yamlordereddictloader yaml_table = """ --- ArpTableTextFSM: command: show arp no-resolve platform: juniper_junos key: MAC use_textfsm: True """ globals().update(FactoryLoader().load(yaml.load(yaml_table, Loader=yamlordereddictloader.Loader))) with Device(host='router1.example.net') as dev: arp_stats = ArpTableTextFSM(dev).get() pprint(json.loads(arp_stats.to_json()))
Führen Sie die Anwendung aus.
user@host:~$ python3 junos-pyez-arptable-textfsm.py {'02:00:00:00:00:10': {'FLAGS': 'none', 'INTERFACE': 'em0.0', 'IP_ADDRESS': '128.0.0.50'}, '02:01:00:00:00:05': {'FLAGS': 'none', 'INTERFACE': 'em0.0', 'IP_ADDRESS': '10.0.0.5'}, '30:7c:5e:48:4b:40': {'FLAGS': 'none', 'INTERFACE': 'fxp0.0', 'IP_ADDRESS': '198.51.100.77'}, 'f8:c0:01:18:8b:67': {'FLAGS': 'none', 'INTERFACE': 'fxp0.0', 'IP_ADDRESS': '198.51.100.254'}}
Die Tabelle verwendet die NTC-Vorlage, um die Ausgabefelder zu extrahieren. Für jedes Tabellenelement gibt die Anwendung den definierten Schlüssel und die Daten für jedes Feld zurück.
Verwenden von TextFSM-Vorlagen mit Junos PyEZ-Ansichten zum Analysieren der Befehlsausgabe
Junos PyEZ-Tabellen können eine TextFSM-Vorlage und eine Junos PyEZ-Ansicht kombinieren, um die Befehlsausgabe zu analysieren. Die TextFSM-Vorlage ordnet die Daten einem Header zu. In der Ansicht können Sie Ihre Variablennamen den Überschriften zuordnen, die in der Vorlage für die Felder definiert sind, die Sie zurückgeben möchten. Dies ist z. B. nützlich, wenn Sie andere Variablennamen als die in der Vorlage definierten verwenden möchten oder wenn Sie andere Felder zurückgeben möchten. Junos PyEZ gibt nur die Felder zurück, die sowohl in der TextFSM-Vorlage als auch in der Junos PyEZ-Ansicht gemeinsam sind.
Im folgenden Beispiel wird die Vorlage juniper_junos_show_arp_no-resolve.textfsm verwendet, um die Befehlsausgabe zu analysieren. Die Junos PyEZ-Ansicht ordnet die Daten neuen Variablennamen zu und gibt nur eine Teilmenge der Felder zurück. Informationen zum Überprüfen der Vorlage finden Sie unter Grundlegendes zu TextFSM-Vorlagen.
So verwenden Sie eine TextFSM-Vorlage und eine Ansicht in einer Junos PyEZ-Tabelle:
Erstellen Sie eine benutzerdefinierte Junos PyEZ-Tabelle, die die Argumente , , ,
use_textfsm
undview
und alle zusätzlichen Argumente enthält, diecommand
für Ihrenplatform
Betrieb erforderlich sind.key
--- ArpTableTextFSM2: command: show arp no-resolve platform: juniper_junos key: - ip - mac use_textfsm: True view: ArpViewTextFSM2
Erstellen Sie die Junos PyEZ-Ansicht, die definiert, welche Vorlagenfelder zurückgegeben werden sollen, sowie den entsprechenden Variablennamen für jedes Feld.
ArpViewTextFSM2: fields: mac: MAC ip: IP_ADDRESS interface: INTERFACE
In diesem Fall ordnet die Ansicht das
FLAGS
in der TextFSM-Vorlage definierte Feld nicht zu, und die analysierten Daten enthalten diesen Wert nicht.Erstellen Sie eine Junos PyEZ-Anwendung, die die Tabelle zum Abrufen der Daten verwendet.
from jnpr.junos import Device from jnpr.junos.factory.factory_loader import FactoryLoader from pprint import pprint import json import yaml import yamlordereddictloader yaml_table = """ --- ArpTableTextFSM2: command: show arp no-resolve platform: juniper_junos key: - ip - mac use_textfsm: True view: ArpViewTextFSM2 ArpViewTextFSM2: fields: mac: MAC ip: IP_ADDRESS interface: INTERFACE """ globals().update(FactoryLoader().load(yaml.load(yaml_table, Loader=yamlordereddictloader.Loader))) with Device(host='router1.example.net') as dev: arp_stats = ArpTableTextFSM2(dev).get() pprint(json.loads(arp_stats.to_json()))
Führen Sie die Anwendung aus.
user@host:~$ python3 junos-pyez-arptable-textfsm2.py {"('10.0.0.5', '02:01:00:00:00:05')": {'interface': 'em0.0', 'ip': '10.0.0.5', 'mac': '02:01:00:00:00:05'}, "('128.0.0.50', '02:00:00:00:00:10')": {'interface': 'em0.0', 'ip': '128.0.0.50', 'mac': '02:00:00:00:00:10'}, "('198.51.100.254', 'f8:c0:01:18:8b:67')": {'interface': 'fxp0.0', 'ip': '198.51.100.254', 'mac': 'f8:c0:01:18:8b:67'}, "('198.51.100.77', '30:7c:5e:48:4b:40')": {'interface': 'fxp0.0', 'ip': '198.51.100.77', 'mac': '30:7c:5e:48:4b:40'}}
Die Tabelle verwendet die NTC-Vorlage und die NTC-Ansicht, um die Ausgabefelder zu extrahieren. Für jedes Tabellenelement gibt die Anwendung den definierten Schlüssel und die Daten für die Felder zurück, die den in der Ansicht definierten Variablennamen zugeordnet sind.
So verwenden Sie benutzerdefinierte TextFSM-Vorlagen
Junos PyEZ-Tabellen können die TextFSM-Vorlagen verwenden, die als Teil des ntc-templates
Pakets installiert werden, oder sie können auf benutzerdefinierte TextFSM-Vorlagen verweisen. Um benutzerdefinierte TextFSM-Vorlagen in Ihrer Junos PyEZ-Anwendung zu verwenden, müssen Sie die Vorlage bereitstellen und dann beim Definieren der Tabelleninstanz den absoluten Pfad zum Vorlagenverzeichnis angeben.
So verwenden Sie eine benutzerdefinierte TextFSM-Vorlage in einer Junos PyEZ-Tabelle:
Erstellen Sie ein Verzeichnis für Ihre benutzerdefinierten Vorlagen.
user@host:~$ mkdir TextFSMTemplates
Erstellen Sie im Verzeichnis templates die Vorlage, und benennen Sie die Datei mit der platform_commandDateinamenskonvention .textfsm .
user@host:~$ vi TextFSMTemplates/my_platform_show_arp_no-resolve.textfsm
Erstellen Sie eine Junos PyEZ-Tabelle, die dieselben
platform
Werte wiecommand
der Dateiname der Vorlage definiert.--- ArpTableTextFSM3: command: show arp no-resolve platform: my_platform key: - MAC - IP_ADDRESS use_textfsm: True
Geben Sie in Ihrer Junos PyEZ-Anwendung den absoluten Pfad zum benutzerdefinierten Vorlagenverzeichnis an, wenn Sie die Tabelleninstanz definieren.
from jnpr.junos import Device from jnpr.junos.factory.factory_loader import FactoryLoader from pprint import pprint import json import yaml import yamlordereddictloader yaml_table = """ --- ArpTableTextFSM3: command: show arp no-resolve platform: my_platform key: - MAC - IP_ADDRESS use_textfsm: True """ globals().update(FactoryLoader().load(yaml.load(yaml_table, Loader=yamlordereddictloader.Loader))) with Device(host='router1.example.net') as dev: arp_stats = ArpTableTextFSM3(dev, template_dir='/home/user/TextFSMTemplates').get() pprint(json.loads(arp_stats.to_json()))
Führen Sie die Anwendung aus.
user@host:~$ python3 junos-pyez-arptable-textfsm3.py
So verwenden Sie Junos PyEZ-Tabellen mit TextFSM-Vorlagen, um die Befehlsausgabe eines beliebigen Anbieters zu analysieren
Junos PyEZ-Tabellen können TextFSM-Vorlagen verwenden, um Befehlsausgaben von Netzwerkgeräten eines beliebigen Herstellers zu analysieren. Sie können die Ausgabe in Ihrer Python-Anwendung abrufen oder die Ausgabe aus einer Datei lesen. Wenn Sie dann die Junos PyEZ-Tabelleninstanz erstellen, können Sie die Befehlsausgabezeichenfolge an das Argument der Tabelle übergeben, anstatt eine Device
Instanz raw
zu übergeben.
Betrachten Sie z. B. die folgende TextFSM-Vorlage:
user@host:~$ cat TextFSMTemplates/cisco_xr_show_alarms_detail.textfsm Value Required description (.+?) Value Required location (\S+) Value aid (\S+) Value tag (\S+) Value module (\S+) Start # Match the timestamp at beginning of command output ^Active Alarms (Detail) for .+ ^-+ -> Continue.Record ^Description:\s+${description}\s*$$ ^Location:\s+${location} ^AID:\s+${aid} ^Tag String:\s+${tag} ^Module Name:\s+${module}
Die Vorlage analysiert die show alarms detail
Befehlsausgabe des angegebenen Geräts.
RP/0/RP0/CPU0:host#show alarms detail Wed May 5 12:17:00.187 UTC -------------------------------------------------------------------------------- Active Alarms (Detail) for 0/RP0 -------------------------------------------------------------------------------- Description: hw_optics: RX LOS LANE-0 ALARM Location: 0/RP0/CPU0 AID: XR/HW_OPTICS/5 Tag String: DEV_SFP_OPTICS_PORT_RX_LOS_LANE0 Module Name: Optics0/0/0/31 EID: CHASSIS/LCC/1:CONTAINER/CC/1:PORT/OPTICS/31 Reporting Agent ID: 196713 Pending Sync: false Severity: Major Status: Set Group: Software Set Time: 04/27/2021 09:47:16 UTC Clear Time: - Service Affecting: NotServiceAffecting Transport Direction: NotSpecified Transport Source: NotSpecified Interface: N/A Alarm Name: OPTICS RX LOS LANE-0 -------------------------------------------------------------------------------- Description: hw_optics: RX LOS LANE-1 ALARM Location: 0/RP0/CPU0 AID: XR/HW_OPTICS/6 Tag String: DEV_SFP_OPTICS_PORT_RX_LOS_LANE1 Module Name: Optics0/0/0/31 EID: CHASSIS/LCC/1:CONTAINER/CC/1:PORT/OPTICS/31 Reporting Agent ID: 196713 Pending Sync: false Severity: Major Status: Set Group: Software Set Time: 04/27/2021 09:47:16 UTC Clear Time: - Service Affecting: NotServiceAffecting Transport Direction: NotSpecified Transport Source: NotSpecified Interface: N/A Alarm Name: OPTICS RX LOS LANE-1 ...
Im folgenden Beispiel wird eine Junos PyEZ-Tabelle definiert, die die benutzerdefinierte TextFSM-Vorlage cisco_xr_show_alarms_detail.textfsm in Verbindung mit einer View verwendet, um die show alarms detail
Befehlsausgabe zu analysieren. Im Beispiel wird die netmiko
Bibliothek verwendet, um die Daten direkt vom Gerät abzurufen. Wenn die Anwendung die Table-Instanz erstellt, wird das raw
Argument in der Befehlsausgabe übergeben, und das template_dir
Argument definiert den Pfad zu dem Verzeichnis, das die benutzerdefinierte Vorlage enthält.
from netmiko import ConnectHandler from jnpr.junos.factory.factory_loader import FactoryLoader from pprint import pprint import json import yaml import yamlordereddictloader yaml_table = """ --- XRAlarmsTable: command: show alarms detail key: - description - location platform: cisco_xr use_textfsm: True view: XRAlarmsView XRAlarmsView: fields: description: description location: location aid: aid tag: tag module: module severity: severity status: status group: group time: time affect: affect """ dev_credentials = { 'device_type': 'cisco_xr', 'host': '198.51.100.101', 'username': 'admin', 'password': 'password', } net_connect = ConnectHandler(**dev_credentials) output = net_connect.send_command('show alarms detail') globals().update(FactoryLoader().load(yaml.load(yaml_table, Loader=yamlordereddictloader.Loader))) stats = XRAlarmsTable(raw=output, template_dir='/home/user/TextFSMTemplates').get() pprint(json.loads(stats.to_json())) with open('show-alarms-detail.txt', 'w') as fp: fp.write(output)
Wenn Sie die Anwendung ausführen, ruft sie die Befehlsausgabe vom Gerät ab und verwendet die TextFSM-Vorlage im angegebenen Verzeichnis zusammen mit der Ansicht, um die Ausgabe zu analysieren. Junos PyEZ gibt nur die Felder zurück, die sowohl in der TextFSM-Vorlage als auch in der Junos PyEZ-Ansicht gemeinsam sind. Die Anwendung speichert auch die Befehlsausgabe in einer Datei, sodass die Ausgabe später verarbeitet werden kann, wie im nächsten Beispiel gezeigt.
user@host:~$ python3 junos-pyez-textfsm-alarms.py {"('hw_optics: RX LOL LANE-0 ALARM', '0/RP0/CPU0')": {'aid': 'XR/HW_OPTICS/29', 'description': 'hw_optics: ' 'RX LOL ' 'LANE-0 ' 'ALARM', 'location': '0/RP0/CPU0', 'module': 'Optics0/0/0/31', 'tag': 'DEV_SFP_OPTICS_PORT_RX_CDR_LOL_LANE0'}, "('hw_optics: RX LOL LANE-1 ALARM', '0/RP0/CPU0')": {'aid': 'XR/HW_OPTICS/30', 'description': 'hw_optics: ' 'RX LOL ' 'LANE-1 ' 'ALARM', 'location': '0/RP0/CPU0', 'module': 'Optics0/0/0/31', 'tag': 'DEV_SFP_OPTICS_PORT_RX_CDR_LOL_LANE1'}, ...
Im folgenden Beispiel werden die gleiche TextFSM-Vorlage und die gleiche Junos PyEZ-Ansicht wie im vorherigen Beispiel verwendet, aber in diesem Fall wird die Befehlsausgabe aus einer Datei gelesen.
from jnpr.junos.factory.factory_loader import FactoryLoader from pprint import pprint import json import yaml import yamlordereddictloader yaml_table = """ --- XRAlarmsTable: command: show alarms detail key: - description - location platform: cisco_xr use_textfsm: True view: XRAlarmsView XRAlarmsView: fields: description: description location: location aid: aid tag: tag module: module severity: severity status: status group: group time: time affect: affect """ with open('show-alarms-detail.txt') as fp: output = fp.read() globals().update(FactoryLoader().load(yaml.load(yaml_table, Loader=yamlordereddictloader.Loader))) stats = XRAlarmsTable(raw=output, template_dir='/home/user/TextFSMTemplates').get() pprint(json.loads(stats.to_json()))