Utilice tablas y vistas operativas de Junos PyEZ que analicen la salida estructurada
Las tablas operativas (operativas) de Junos PyEZ para salida estructurada extraen datos específicos de la salida XML de una RPC ejecutada en un dispositivo Junos. Después de cargar o importar la definición de tabla en el módulo Python, puede recuperar los elementos de tabla y extraer y manipular los datos.
Para recuperar información de un dispositivo específico, debe crear una instancia de Table y asociarla al Device
objeto que representa el dispositivo de destino. Por ejemplo:
from jnpr.junos import Device from jnpr.junos.op.ethport import EthPortTable with Device(host='router.example.com') as dev: eths = EthPortTable(dev)
En las siguientes secciones se explica cómo recuperar y manipular los datos:
Recuperar elementos de tabla
La propiedad Table item
determina qué elementos se extraen del resultado del comando operativo. Por ejemplo, la definición EthPortTable de Junos PyEZ, que se incluye aquí como referencia, ejecuta el show interfaces "[afgxe][et]-*" media
comando de forma predeterminada y extrae los physical-interface
elementos de la salida.
--- EthPortTable: rpc: get-interface-information args: media: True interface_name: '[afgxe][et]-*' args_key: interface_name item: physical-interface view: EthPortView
Para recuperar los elementos table en la secuencia de comandos de Python, llame al get()
método y proporcione los argumentos deseados. Si la definición de tabla incluye argumentos predeterminados en la args
propiedad, la RPC ejecutada incluye automáticamente estos argumentos cuando se llama a get()
menos que los invalide en la lista de argumentos.
Para recuperar todos los elementos table, llame al get()
método con una lista de argumentos vacía.
from jnpr.junos import Device from jnpr.junos.op.ethport import EthPortTable with Device(host='router.example.com') as dev: eths = EthPortTable(dev) eths.get()
También puede recuperar elementos de tabla específicos pasando opciones de comando como argumentos al get()
método. Si la opción de comando es una marca que no toma un valor, establezca la opción igual a True en la lista de argumentos. De lo contrario, incluya el argumento y el valor deseado como par clave-valor en la lista de argumentos. Puede revisar los posibles argumentos de los comandos operativos en la CLI de Junos.
De forma predeterminada, EthPortTable devuelve información para interfaces Ethernet que tienen nombres que coincidan con la expresión "[afgxe][et]-*"
. Para recuperar el elemento Table solo para la interfaz ge-0/3/0, incluya interface_name='ge-0/3/0'
como argumento a get()
.
eths = EthPortTable(dev) eths.get(interface_name='ge-0/3/0')
Si el nombre de la opción en la interfaz de línea de comandos (CLI) de Junos OS está guionado, debe cambiar los guiones del nombre a guiones bajos. Sin embargo, el valor del argumento es una cadena y, como tal, puede contener guiones.
Si el comando de la CLI toma un primer argumento opcional que no requiere que especifique explícitamente un nombre de opción o una palabra clave, puede omitir el nombre de opción en la lista de argumentos de get()
método siempre que la propiedad Table args_key
haga referencia a este argumento. En el ejemplo siguiente, el show interfaces
comando toma un nombre de interfaz como argumento opcional:
user@router> show interfaces ? Possible completions: <[Enter]> Execute this command <interface-name> Name of physical or logical interface ge-0/0/0 ge-0/0/0.0
La propiedad de definición args_key
EthPortTable define el argumento opcional como interface_name
, lo que le permite utilizar este argumento sin tener que especificar explícitamente el nombre de opción en la lista de argumentos del get()
método.
eths = EthPortTable(dev) eths.get('ge-0/3/0')
De forma predeterminada, Junos PyEZ normaliza todas las claves y valores de la tabla de operaciones, lo que elimina todos los espacios en blanco iniciales y finales y reemplaza secuencias de caracteres de espacios en blanco internos por un solo espacio. Para deshabilitar la normalización, incluya normalize=False
como argumento al get()
método.
eths = EthPortTable(dev) eths.get(interface_name='ge-0/3/0', normalize=False)
Elementos de tabla de acceso
Después de recuperar los elementos de tabla, puede tratarlos como un diccionario de Python, lo que le permite usar métodos en la biblioteca estándar de Python para acceder y manipular los elementos.
Para ver la lista de claves de diccionario correspondientes a los nombres de elemento de tabla, llame al keys()
método.
eths = EthPortTable(dev).get(interface_name='ge-0/3/0') print (eths.keys())
En este caso, solo hay una sola clave.
['ge-0/3/0']
Puede comprobar que una clave específica está presente en los elementos de tabla mediante el operador Python in
.
if 'ge-0/3/0' in eths:
Para ver una lista de los campos o valores asociados con cada clave, llame al values()
método. El values()
método devuelve una lista de tuplas con los pares nombre-valor para cada campo que se definió en la vista.
print (eths.values())
[[('oper', 'down'), ('rx_packets', '0'), ('macaddr', '00:00:5E:00:53:01'), ('description', None), ('rx_bytes', '0'), ('admin', 'up'), ('mtu', 1514), ('running', True), ('link_mode', None), ('tx_bytes', '0'), ('tx_packets', '0'), ('present', True)]]
Para ver la lista completa de elementos, incluidas las claves y los valores, llame al items()
método.
print (eths.items())
[('ge-0/3/0', [('oper', 'down'), ('rx_packets', '0'), ('macaddr', '00:00:5E:00:53:01'), ('description', None), ('rx_bytes', '0'), ('admin', 'up'), ('mtu', 1514), ('running', True), ('link_mode', None), ('tx_bytes', '0'), ('tx_packets', '0'), ('present', True)])]
Cómo iterar a través de una tabla
Las tablas admiten iteración, lo que le permite recorrer cada elemento table de la misma manera que recorrería una lista o un diccionario. Esto facilita el formatear e imprimir rápidamente los campos deseados.
La definición EthPortTable, que se incluye en el jnpr.junos.op
módulo, ejecuta el show interfaces "[afgxe][et]-*" media
comando y extrae los physical-interface
elementos de la salida. El siguiente código recorre los elementos e imprime el physical-interface
nombre y el estado operativo de cada puerto Ethernet:
from jnpr.junos import Device from jnpr.junos.op.ethport import EthPortTable with Device(host='router.example.com') as dev: eths = EthPortTable(dev) eths.get() for port in eths: print ("{}: {}".format(port.name, port.oper))
El oper
campo, que se define en EthPortView, corresponde al valor del oper-status
elemento en el resultado. La definición EthPortView no define un name
campo. De forma predeterminada, cada elemento view tiene una name
propiedad que hace referencia a la clave que identifica de forma única ese elemento.
El resultado incluye el nombre de interfaz y el estado operativo.
ge-0/3/0: up ge-0/3/1: up ge-0/3/2: up ge-0/3/3: up