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.
TextFSMCliTable 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-templatesBibliothek 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,platformunduse_textfsmund alle zusätzlichen Argumente enthält, diecommandfü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
platformWerte 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_textfsmundviewund alle zusätzlichen Argumente enthält, diecommandfür IhrenplatformBetrieb erforderlich sind.key--- ArpTableTextFSM2: command: show arp no-resolve platform: juniper_junos key: - ip - mac use_textfsm: True view: ArpViewTextFSM2Erstellen 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: INTERFACEIn diesem Fall ordnet die Ansicht das
FLAGSin 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
platformWerte wiecommandder Dateiname der Vorlage definiert.--- ArpTableTextFSM3: command: show arp no-resolve platform: my_platform key: - MAC - IP_ADDRESS use_textfsm: TrueGeben 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()))