Use las tablas PyEZ de Junos con plantillas de TextFSM
Las tablas operativas (op) de Junos PyEZ pueden hacer referencia a una plantilla de TextFSM, sola o con una vista de Junos PyEZ, para analizar la salida de comandos de CLI o VTY desde cualquier dispositivo de red.
Comprender las plantillas de TextFSM
Las tablas de operaciones de Junos PyEZ pueden extraer datos de la salida de comando CLI o VTY de un dispositivo de red. La tabla puede hacer referencia a una vista para asignar campos en la salida del comando a objetos de Python. Las tablas de operaciones de Junos PyEZ también pueden hacer referencia a una plantilla de TextFSM, sola o con una vista, para analizar la salida del comando. Las tablas de operaciones de Junos PyEZ pueden usar plantillas de TextFSM para analizar la salida de comandos de cualquier dispositivo de red, independientemente del proveedor, el sistema operativo de red o el comando.
TextFSM es una biblioteca de Python que analiza la salida de CLI semiformateada, como la salida del comando show, de los dispositivos de red. Fue desarrollado por Google y luego lanzado bajo la licencia Apache 2.0. El módulo requiere una plantilla y algún texto de entrada. La plantilla utiliza expresiones regulares para describir cómo analizar los datos y puede definir y aplicar varias plantillas a los mismos datos.
TextFSMCliTable permite a los usuarios asignar un comando en una plataforma determinada a la plantilla que analiza la salida del comando. Network to Code, una empresa de automatización de redes, ha desarrollado un contenedor de Python junto CliTable con un repositorio de plantillas de TextFSM para dispositivos de red. Puede instalar la ntc-templates biblioteca en su servidor o entorno virtual de Junos PyEZ, según corresponda. A continuación, haga referencia a las plantillas NTC y otras plantillas de TextFSM en sus tablas PyEZ de Junos.
El análisis de plantillas NTC muestra la salida del comando de los dispositivos de red. Cada plantilla NTC define los campos de salida esperados para un comando determinado y, para cada elemento, asigna los datos a un encabezado. El nombre de archivo de la plantilla NTC identifica la plataforma (proveedor y sistema operativo de red) y el comando (con guiones bajos), por lo que el sistema puede determinar fácilmente qué plantilla usar. El formato de nombre de archivo utiliza la sintaxis siguiente:
platform_command.textfsm
Por ejemplo, considere la plantilla juniper_junos_show_arp_no-resolve.textfsm .
Value Required MAC_ADDRESS ([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_ADDRESS}\s+${IP_ADDRESS}\s+${INTERFACE}\s+${FLAGS} -> Record
^Total.*
^\s*$$
^{master:\d+}
^. -> Error
La plantilla analiza la show arp no-resolve salida del comando de dispositivos de Juniper Networks que ejecutan Junos OS o Junos OS evolucionado.
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 172.16.0.50 em0.0 none Total entries: 4
Las tablas de operaciones de Junos PyEZ pueden utilizar una plantilla NTC u otra plantilla de TextFSM para analizar la salida de comandos no estructurados. La tabla utiliza una plantilla TextFSM definiendo los siguientes campos. Junos PyEZ utiliza los platform valores y command para determinar el nombre de archivo de la plantilla.
-
command: command: comando que genera la salida que se va a analizar. El comando debe asignarse a la cadena de comandos en el nombre de archivo de una plantilla NTC u otra plantilla de TextFSM. -
key: key—Campo definido en la plantilla de TextFSM o en la vista PyEZ de Junos que se utiliza para identificar de forma exclusiva el elemento de registro. -
platform: platform—Proveedor y sistema operativo para la plantilla TextFSM, por ejemplo,juniper_junos. El valor de plataforma debe coincidir con la cadena de plataforma en el nombre de archivo de una plantilla NTC u otra plantilla de TextFSM. -
use_textfsm: True—Establecer enTruepara analizar la salida del comando utilizando la plantilla TextFSM para la plataforma y el comando dados.
Cómo usar plantillas de TextFSM para analizar la salida de comandos
Las tablas PyEZ de Junos pueden usar plantillas de TextFSM, incluidas las plantillas NTC predefinidas, para analizar la salida del comando show de los dispositivos Junos.
Para usar plantillas de TextFSM en una tabla PyEZ de Junos:
-
Instale la
ntc-templatesbiblioteca en su servidor o entorno virtual de Junos PyEZ.user@host:~$ pip install ntc-templates
-
Cree una tabla PyEZ de Junos personalizada que incluya los argumentos, ,
commandkeyplatform, yuse_textfsmlos argumentos, así como cualquier argumento adicional necesario para sus operaciones.--- ArpTableTextFSM: command: show arp no-resolve platform: juniper_junos key: MAC_ADDRESS use_textfsm: True
La aplicación Junos PyEZ utiliza los
platformvalores ycommandpara determinar el nombre de archivo de la plantilla, que en este caso es juniper_junos_show_arp_no-resolve.textfsm. Elkeyvalor debe coincidir con un encabezado de la plantilla. -
Cree una aplicación Junos PyEZ que utilice la tabla para recuperar los datos.
import json from pprint import pprint import yaml from yamlloader import ordereddict from jnpr.junos import Device from jnpr.junos.factory.factory_loader import FactoryLoader yaml_table = """ --- ArpTableTextFSM: command: show arp no-resolve platform: juniper_junos key: MAC_ADDRESS use_textfsm: True """ globals().update(FactoryLoader().load(yaml.load(yaml_table, Loader=ordereddict.Loader))) with Device(host='router1.example.net') as dev: arp_stats = ArpTableTextFSM(dev).get() pprint(json.loads(arp_stats.to_json()))
-
Ejecute la aplicación.
user@host:~$ python junos-pyez-arptable-textfsm.py {'02:00:00:00:00:10': {'FLAGS': 'none', 'INTERFACE': 'em0.0', 'IP_ADDRESS': '172.16.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'}}La tabla utiliza la plantilla NTC para extraer los campos de salida. Para cada elemento de la tabla, la aplicación devuelve la clave definida y los datos de cada campo.
Cómo usar plantillas TextFSM con vistas PyEZ de Junos para analizar la salida de comandos
Las tablas PyEZ de Junos pueden combinar una plantilla de TextFSM y una vista de PyEZ de Junos para analizar la salida del comando. La plantilla TextFSM asigna los datos a un encabezado. En la vista, puede asignar los nombres de las variables a los encabezados definidos en la plantilla para los campos que desea devolver. Combine la plantilla y la vista, por ejemplo, cuando desee utilizar nombres de variables diferentes a los definidos en la plantilla o cuando desee devolver campos diferentes. Junos PyEZ devuelve solo los campos que son comunes tanto a la plantilla TextFSM como a la vista de Junos PyEZ.
En el ejemplo siguiente se utiliza la plantilla juniper_junos_show_arp_no-resolve.textfsm para analizar la salida del comando. La vista de PyEZ de Junos asigna los datos a nuevos nombres de variables y devuelve solo un subconjunto de los campos. Para revisar la plantilla, consulte Descripción de las plantillas de TextFSM.
Para usar una plantilla TextFSM y una vista en una tabla PyEZ de Junos:
-
Cree una tabla PyEZ de Junos personalizada que incluya los argumentos, , , y
viewlosplatformcommandkeyuse_textfsmargumentos, así como cualquier argumento adicional necesario para sus operaciones.--- ArpTableTextFSM2: command: show arp no-resolve platform: juniper_junos key: - ip - mac use_textfsm: True view: ArpViewTextFSM2 -
Cree la vista de Junos PyEZ que define qué campos de plantilla devolver y el nombre de variable correspondiente para cada campo.
ArpViewTextFSM2: fields: mac: MAC_ADDRESS ip: IP_ADDRESS interface: INTERFACEEn este caso, View no asigna el
FLAGScampo definido en la plantilla TextFSM y los datos analizados no incluyen este valor. -
Cree una aplicación Junos PyEZ que utilice la tabla para recuperar los datos.
import json from pprint import pprint import yaml from yamlloader import ordereddict from jnpr.junos import Device from jnpr.junos.factory.factory_loader import FactoryLoader yaml_table = """ --- ArpTableTextFSM2: command: show arp no-resolve platform: juniper_junos key: - ip - mac use_textfsm: True view: ArpViewTextFSM2 ArpViewTextFSM2: fields: mac: MAC_ADDRESS ip: IP_ADDRESS interface: INTERFACE """ globals().update(FactoryLoader().load(yaml.load(yaml_table, Loader=ordereddict.Loader))) with Device(host='router1.example.net') as dev: arp_stats = ArpTableTextFSM2(dev).get() pprint(json.loads(arp_stats.to_json()))
-
Ejecute la aplicación.
user@host:~$ python 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'}, "('172.16.0.50', '02:00:00:00:00:10')": {'interface': 'em0.0', 'ip': '172.16.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'}}La tabla utiliza la plantilla NTC y la vista PyEZ de Junos para extraer los campos de salida. Para cada elemento de la tabla, la aplicación devuelve la clave definida y los datos de los campos definidos en la vista.
Cómo usar plantillas personalizadas de TextFSM
Las tablas PyEZ de Junos pueden utilizar las plantillas de TextFSM que se instalan como parte del ntc-templates paquete. También pueden hacer referencia a plantillas personalizadas de TextFSM. Para utilizar plantillas personalizadas de TextFSM en su aplicación Junos PyEZ, primero debe preparar la plantilla. A continuación, cuando defina la instancia de Table en la aplicación, especifique la ruta absoluta al directorio de la plantilla.
Para usar una plantilla TextFSM personalizada en una tabla PyEZ de Junos:
-
Cree un directorio para sus plantillas personalizadas.
user@host:~$ mkdir TextFSMTemplates
-
En el directorio templates, cree la plantilla y asigne un nombre al archivo utilizando la convención de nombre de platform_commandarchivo .textfsm .
user@host:~$ vi TextFSMTemplates/my_platform_show_arp_no-resolve.textfsm
-
Cree una tabla PyEZ de Junos que defina los mismos
platformvalores quecommandel nombre de archivo de la plantilla.--- ArpTableTextFSM3: command: show arp no-resolve platform: my_platform key: - MAC_ADDRESS - IP_ADDRESS use_textfsm: True -
En su aplicación Junos PyEZ, especifique la ruta absoluta al directorio de plantillas personalizadas cuando defina la instancia de tabla.
import json from pprint import pprint import yaml from yamlloader import ordereddict from jnpr.junos import Device from jnpr.junos.factory.factory_loader import FactoryLoader yaml_table = """ --- ArpTableTextFSM3: command: show arp no-resolve platform: my_platform key: - MAC_ADDRESS - IP_ADDRESS use_textfsm: True """ globals().update(FactoryLoader().load(yaml.load(yaml_table, Loader=ordereddict.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()))
-
Ejecute la aplicación.
user@host:~$ python junos-pyez-arptable-textfsm3.py
Cómo usar las tablas PyEZ de Junos con plantillas TextFSM para analizar la salida de comandos de cualquier proveedor
Las tablas PyEZ de Junos pueden usar plantillas de TextFSM para analizar la salida de comandos desde el dispositivo de red de cualquier proveedor. La aplicación de Python puede recuperar la salida de un dispositivo o puede leer la salida de un archivo. A continuación, cuando cree la instancia de tabla PyEZ de Junos, puede pasar la cadena de salida del comando al argumento de raw la tabla en lugar de pasar una Device instancia.
Por ejemplo, considere la siguiente plantilla de TextFSM:
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}
La plantilla analiza la show alarms detail salida del comando del dispositivo dado.
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 ...
En el ejemplo siguiente se define una tabla PyEZ Junos que utiliza la plantilla personalizada de TextFSM, cisco_xr_show_alarms_detail.textfsm, y una vista para analizar la salida del show alarms detail comando. En el ejemplo, se usa la netmiko biblioteca para recuperar los datos directamente del dispositivo. Cuando la aplicación crea la instancia de Table, el raw argumento pasa la salida del comando y el template_dir argumento define la ruta al directorio que contiene la plantilla personalizada.
import json from pprint import pprint import yaml from yamlloader import ordereddict from netmiko import ConnectHandler from jnpr.junos.factory.factory_loader import FactoryLoader 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=ordereddict.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)
Cuando ejecuta la aplicación, recupera la salida del comando del dispositivo. Luego, la aplicación usa la plantilla TextFSM en el directorio especificado junto con View para analizar la salida. Junos PyEZ devuelve solo los campos que son comunes tanto a la plantilla TextFSM como a la vista de Junos PyEZ. La aplicación guarda la salida del comando en un archivo, por lo que puede procesar la salida más adelante, como se muestra en el ejemplo siguiente.
user@host:~$ python 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'},
...
En el siguiente ejemplo, se utiliza la misma plantilla de TextFSM y Junos PyEZ View que en el ejemplo anterior, pero en este caso, la aplicación lee la salida del comando de un archivo.
import json from pprint import pprint import yaml from yamlloader import ordereddict from jnpr.junos.factory.factory_loader import FactoryLoader 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=ordereddict.Loader))) stats = XRAlarmsTable(raw=output, template_dir='/home/user/TextFSMTemplates').get() pprint(json.loads(stats.to_json()))