Usar tablas de Junos PyEZ con plantillas TextFSM
RESUMEN Las tablas op de Junos PyEZ pueden hacer referencia a una plantilla de TextFSM, sola o junto con una vista de Junos PyEZ, para analizar la salida del comando CLI o VTY desde cualquier dispositivo de red.
Descripción de las plantillas de TextFSM
Las tablas de operaciones de Junos PyEZ pueden extraer datos de la salida del comando CLI o VTY. La tabla puede hacer referencia a una vista para asignar campos en la salida del comando a objetos de Python. A partir de Junos PyEZ versión 2.4.0, Junos PyEZ op Tables también puede hacer referencia a una plantilla de TextFSM, sola o junto con una vista, para analizar la salida del comando. Las tablas op de Junos PyEZ pueden usar plantillas de TextFSM para analizar la salida de comandos desde 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, desde dispositivos de red. Fue desarrollado por Google y más tarde lanzado bajo la licencia Apache 2.0. El módulo requiere una plantilla y algo de 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.
TextFSM
CliTable
permite a los usuarios asignar un comando de 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 TextFSM para dispositivos de red. Puede instalar la ntc-templates
biblioteca en su servidor o entorno virtual de Junos PyEZ, según corresponda, y luego hacer referencia a las plantillas NTC y otras plantillas de TextFSM en sus tablas de Junos PyEZ.
Las plantillas NTC analizan la salida del comando show 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 plantilla NTC identifica el proveedor, el sistema operativo de red y el comando (con guiones bajos), de modo que el sistema pueda determinar fácilmente qué plantilla usar para una plataforma y un comando determinados.
vendor_os_command.textfsm
Por ejemplo, considere la plantilla 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
La plantilla analiza la show arp no-resolve
salida del comando de los dispositivos Junos de Juniper Networks.
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
Las tablas op de Junos PyEZ pueden usar una plantilla NTC u otra plantilla 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 el resultado 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 TextFSM o en la vista Junos PyEZ 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
: indique que la tabla PyEZ de Junos debe analizar la salida del comando utilizando la plantilla TextFSM para la plataforma y el comando dados.
Cómo utilizar plantillas TextFSM para analizar la salida de comandos
Las tablas PyEZ de Junos pueden usar plantillas 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 biblioteca en su
ntc-templates
servidor o entorno virtual de Junos PyEZ.user@host:~$ pip3 install ntc_templates
Cree una tabla personalizada de Junos PyEZ que incluya los , , y
use_textfsm
argumentosplatform
command
key
, así como cualquier argumento adicional necesario para sus operaciones.--- ArpTableTextFSM: command: show arp no-resolve platform: juniper_junos key: MAC use_textfsm: True
La aplicación Junos PyEZ utiliza los
platform
valores ycommand
para determinar el nombre de archivo de la plantilla, que en este caso es juniper_junos_show_arp_no-resolve.textfsm.Cree una aplicación Junos PyEZ que utilice la tabla para recuperar los datos.
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()))
Ejecute la aplicación.
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'}}
La tabla utiliza la plantilla NTC para extraer los campos de salida. Para cada elemento de tabla, la aplicación devuelve la clave definida y los datos de cada campo.
Cómo utilizar plantillas de TextFSM con vistas de Junos PyEZ para analizar la salida del comando
Las tablas Junos PyEZ pueden combinar una plantilla TextFSM y una vista Junos PyEZ 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. Esto es útil, por ejemplo, cuando desea utilizar nombres de variables diferentes a los definidos en la plantilla o cuando desea devolver campos diferentes. Junos PyEZ solo devuelve los campos que son comunes tanto a la plantilla TextFSM como a la vista Junos PyEZ.
En el ejemplo siguiente se utiliza la plantilla juniper_junos_show_arp_no-resolve.textfsm para analizar el resultado del comando. La vista PyEZ de Junos asigna los datos a nuevos nombres de variables y solo devuelve un subconjunto de los campos. Para revisar la plantilla, consulte Descripción de las plantillas de TextFSM.
Para usar una plantilla de TextFSM y una vista en una tabla PyEZ de Junos:
Cree una tabla de Junos PyEZ personalizada que incluya los , ,
platform
use_textfsm
, yview
argumentoscommand
key
, 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 ip: IP_ADDRESS interface: INTERFACE
En este caso, la vista no asigna el
FLAGS
campo 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.
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()))
Ejecute la aplicación.
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'}}
La tabla utiliza la plantilla NTC y View para extraer los campos de salida. Para cada elemento de tabla, la aplicación devuelve la clave definida y los datos de los campos asignados a los nombres de variable definidos en la vista.
Cómo usar plantillas personalizadas de TextFSM
Las tablas de Junos PyEZ pueden usar las plantillas de TextFSM que se instalan como parte del ntc-templates
paquete o pueden hacer referencia a plantillas personalizadas de TextFSM. Para utilizar plantillas personalizadas de TextFSM en su aplicación Junos PyEZ, debe provisionalizar la plantilla y, a continuación, especificar la ruta absoluta al directorio de la plantilla al definir la instancia de tabla.
Para usar una plantilla TextFSM personalizada en una tabla PyEZ de Junos:
Cree un directorio para las plantillas personalizadas.
user@host:~$ mkdir TextFSMTemplates
En el directorio de plantillas, cree la plantilla y asigne un nombre al archivo mediante la convención de nombre de platform_commandarchivo .textfsm .
user@host:~$ vi TextFSMTemplates/my_platform_show_arp_no-resolve.textfsm
Cree una tabla de Junos PyEZ que defina los mismos
platform
valores ycommand
como el nombre de archivo de la plantilla.--- ArpTableTextFSM3: command: show arp no-resolve platform: my_platform key: - MAC - IP_ADDRESS use_textfsm: True
En la aplicación Junos PyEZ, especifique la ruta absoluta al directorio de plantillas personalizadas cuando defina la instancia de tabla.
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()))
Ejecute la aplicación.
user@host:~$ python3 junos-pyez-arptable-textfsm3.py
Cómo utilizar las tablas de Junos PyEZ 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 del dispositivo de red de cualquier proveedor. Puede recuperar la salida en su aplicación Python o leer la salida de un archivo. A continuación, cuando cree la instancia de Junos PyEZ Table, 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 desde el 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 de Junos PyEZ que utiliza la plantilla personalizada de TextFSM, cisco_xr_show_alarms_detail.textfsm, junto con una vista para analizar el resultado del show alarms detail
comando. En el ejemplo se utiliza la netmiko
biblioteca para recuperar los datos directamente del dispositivo. Cuando la aplicación crea la instancia de tabla, el raw
argumento pasa en el resultado del comando y el template_dir
argumento define la ruta de acceso al directorio que contiene la plantilla personalizada.
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)
Al ejecutar la aplicación, recupera el resultado del comando del dispositivo y utiliza la plantilla TextFSM en el directorio especificado junto con View para analizar la salida. Junos PyEZ solo devuelve los campos que son comunes tanto a la plantilla TextFSM como a la vista Junos PyEZ. La aplicación también guarda la salida del comando en un archivo, por lo que la salida se puede procesar más tarde, como se muestra en el siguiente ejemplo.
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'}, ...
En el ejemplo siguiente se utiliza la misma plantilla TextFSM y Junos PyEZ View que en el ejemplo anterior, pero en este caso, el resultado del comando se lee desde un archivo.
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()))