Crear scripts de acción para RPCs YANG en dispositivos Junos
Puede agregar modelos de datos YANG que definan llamadas de procedimiento remoto (RPC) personalizadas en dispositivos Junos compatibles. Cuando agregue una RPC yang no automática a un dispositivo, también debe proporcionar una secuencia de comandos de acción que sirva como controlador de LA. La definición de RPC hace referencia a la secuencia de comandos de acción, que se invoca cuando se ejecuta el RPC. La secuencia de comandos de acción realiza las operaciones y recupera la información requerida por el RPC y devuelve los elementos de salida XML necesarios según se define en la instrucción RPC output
.
Los scripts de acción se pueden escribir en lenguaje de hoja de estilo Alternative SyntaX (SLAX) o Python. Los scripts de acción SLAX son similares a los scripts operativos SLAX y pueden realizar cualquier función disponible a través de las RPC compatibles con el protocolo de administración XML de Junos y la API XML de Junos. Los scripts de acción de Python pueden aprovechar todas las características y construcciones del lenguaje Python, lo que proporciona una mayor flexibilidad sobre los scripts SLAX. Además, los scripts de acción de Python admiten API de Junos PyEZ , que facilitan la ejecución de RPCs y la realización de tareas operativas y de configuración en dispositivos Junos. Los scripts de Python también pueden aprovechar la biblioteca, lo que simplifica el lxml
manejo de XPath. Además, a partir de Junos OS versión 19.3R1, los dispositivos que ejecutan Junos OS con soporte FreeBSD actualizado usan IPv6 en scripts de acción de Python.
En este tema, se describe cómo crear una secuencia de comandos de acción, incluyendo cómo analizar los argumentos de entrada de RPC, acceder a datos operativos y de configuración en la secuencia de comandos, emitir la salida XML y validar y cargar la secuencia de comandos en un dispositivo.
Placa de caldera de script de acción
Placa de script SLAX
Los scripts de acción SLAX deben incluir la placa de caldera necesaria tanto para la funcionalidad de script básica como para cualquier funcionalidad opcional utilizada dentro del script, como las funciones de extensión de Junos OS y las plantillas con nombre. Además, la secuencia de comandos debe declarar todos los parámetros de entrada DECL mediante la param
instrucción. La placa de caldera de script de acción SLAX es la siguiente:
version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "/var/db/scripts/import/junos.xsl"; param $input-param1; param $input-param2; match / { <action-script-results> { /* insert your code here */ } }
Placa de caldera de scripts python
Los scripts de acción de Python deben incluir una línea de directiva de intérprete que especifique la versión de Python utilizada para ejecutar la secuencia de comandos. En la Tabla 1 se describen las líneas de directiva de intérprete que puede utilizar en las diferentes versiones.
Versiones compatibles | conlas líneas de directiva del intérprete | de versión python |
---|---|---|
Python 3 |
|
Junos OS versión 20.2R1 y posteriores Junos OS Evolved versión 21.1R1 y posteriores |
Python 2.7 |
|
Junos OS versión 20.1 y anteriores Junos OS Evolved versión 22.2 y anteriores |
A partir de Junos OS versión 20.2R1 y Junos OS Evolved versión 22.3R1, el dispositivo usa Python 3 para ejecutar scripts de acción y traducción yang. En versiones anteriores, Junos OS solo usa Python 2.7 para ejecutar estos scripts, y Junos OS Evolved usa Python 2.7 de forma predeterminada para ejecutar los scripts.
Además, los scripts de acción de Python deben importar cualquier biblioteca, módulo u objeto que se use en la secuencia de comandos. Por ejemplo, además de las bibliotecas estándar de Python, los scripts de acción de Python pueden importar lo siguiente:
-
jcs
biblioteca: permite que el script use funciones de extensión de Junos OS y funcionalidad de plantilla denominada Junos OS en el script. -
jnpr.junos
módulo y clases: permite que el script use Junos PyEZ. -
lxml
biblioteca: simplifica el manejo de XPath.
Por ejemplo:
#!/usr/bin/python3 import jcs from jnpr.junos import Device from lxml import etree
Análisis de argumentos de entrada de RPC
- Descripción general del argumento de entrada
- Argumentos de entrada de script SLAX
- Argumentos de entrada de script de Python
Descripción general del argumento de entrada
Una RPC puede definir parámetros de entrada mediante la instrucción opcional input
. Cuando ejecuta una RPC y proporciona argumentos de entrada, Junos OS invoca la secuencia de comandos de acción de LAR y pasa esos argumentos a la secuencia de comandos. En una secuencia de comandos de acción Python o SLAX, puede tener acceso a los argumentos de entrada de RPC de la misma manera que tendría acceso a los argumentos de línea de comandos de una secuencia de comandos de Python normal o una secuencia de comandos de junos OS SLAX op, respectivamente.
Considere la siguiente input
instrucción para la get-host-status
RPC:
rpc get-host-status { description "RPC example to retrieve host status"; junos:command "show host-status" { junos:action-execute { junos:script "rpc-host-status.py"; } } input { leaf hostip { description "IP address of the target host"; type string; } leaf level { type enumeration { enum brief { description "Display brief output"; } enum detail { description "Display detailed output"; } } } leaf test { description "empty argument"; type empty; } } ...
El RPC se puede ejecutar en la CLI o a través de una sesión de protocolo NETCONF o Junos XML. Por ejemplo, puede ejecutar el siguiente comando en la CLI:
user@host> show host-status hostip 198.51.100.1 level detail test
De manera similar, puede ejecutar el siguiente RPC en una sesión remota:
<rpc> <get-host-status> <hostip>198.51.100.1</hostip> <level>detail</level> <test/> </get-host-status> </rpc>
Cuando se ejecuta el comando o ELP, el dispositivo invoca la secuencia de comandos de acción y pasa los argumentos. En las siguientes secciones, se explica cómo procesar los argumentos en la secuencia de comandos de acción SLAX o Python.
A partir de Junos OS versión 19.2R1, las RPCs yang personalizadas admiten parámetros de entrada de tipo empty
cuando se ejecuta el comando de RPC en la CLI de Junos OS, y el valor pasado a la secuencia de comandos de acción es el nombre del parámetro. En versiones anteriores, los parámetros de entrada del tipo empty
solo se admiten cuando se ejecuta el RPC en una sesión de protocolo NETCONF o Junos XML, y el valor pasado a la secuencia de comandos de acción es la cadena 'none'
.
Argumentos de entrada de script SLAX
En los scripts de acción SLAX, debe declarar los parámetros de entrada mediante la param
instrucción. Los nombres de parámetros deben ser idénticos a los nombres de parámetros definidos en el módulo YANG.
Cuando se invoca, la secuencia de comandos asigna el valor de cada argumento al parámetro correspondiente, al que puede hacer referencia en todo el script. Debe incluir el símbolo del signo de dólar ($) al declarar el parámetro y al tener acceso a su valor. Si un parámetro es tipo empty
, el nombre del parámetro se pasa como su valor.
param $hostip; param $level; param $test;
Para obtener más información acerca de los parámetros SLAX, consulte Descripción general de parámetros SLAX en la Guía del usuario de automatización de scripts.
Argumentos de entrada de script de Python
Para scripts de acción de Python, los argumentos se pasan a la secuencia de comandos de la siguiente manera:
-
El primer argumento siempre es la ruta del archivo del script de acción.
-
Los siguientes argumentos de la lista son el nombre y el valor de cada parámetro de entrada suministrado por el usuario.
El nombre del argumento se pasa de la siguiente manera:
-
En Junos OS versión 21.1 y anteriores, el dispositivo pasa en el nombre del argumento.
-
En la versión 21.2R1 y posteriores de Junos OS, el dispositivo prefija un guión único (-) a nombres de argumento de un solo carácter y prefijos dos guiones (-) a nombres de argumentos de varios caracteres.
Nota:Cuando se ejecuta el comando de RPC en la CLI, los argumentos se pasan al script en el orden dado en la línea de comandos. En una sesión de protocolo NETCONF o Junos XML, el orden de los argumentos en el XML es arbitrario, por lo que los argumentos se pasan al script en el orden en que se declaran en la instrucción RPC
input
. -
-
Los dos últimos argumentos de la lista, que son proporcionados por el sistema y no por el usuario, son
'rpc_name'
y el nombre de la RPC.
En las siguientes secciones se analiza cómo manejar los argumentos que se pasan a scripts de acción de Python en las diferentes versiones.
- Scripts de acción de Python (21.2R1 o posterior)
- Scripts de acción de Python (21.1 y versiones anteriores)
Scripts de acción de Python (21.2R1 o posterior)
A partir de Junos OS versión 21.2R1 y Junos OS Evolved versión 21.2R1, cuando el dispositivo pasa los nombres de argumentos de entrada a la secuencia de comandos de acción de Python, prefija un guión único (-) a nombres de argumentos de un solo carácter y prefijos dos guiones (-) a nombres de argumentos de varios caracteres. Esto le permite usar bibliotecas estándar de análisis de línea de comandos para manejar los argumentos.
Para el ejemplo anterior de YANG RPC, la lista de argumentos de entrada del sys.argv
script de acción es:
['/var/db/scripts/action/rpc-host-status.py', '--hostip', '198.51.100.1', '--level', 'detail', '--test', 'test', '--rpc_name', 'get-host-status']
El siguiente código python de ejemplo usa la argparse
biblioteca para manejar los argumentos. En este caso, el analizador también debe tener en cuenta el rpc_name
argumento que el sistema pasa a la secuencia de comandos.
#!/usr/bin/python3 import argparse parser = argparse.ArgumentParser(description='This is a demo script.') parser.add_argument('--hostip', required=True) parser.add_argument('--level', required=False, default='brief') parser.add_argument('--test', required=False) parser.add_argument('--rpc_name', required=True) args = parser.parse_args() # access argument values by using args.hostip, args.level, and args.test
Scripts de acción de Python (21.1 y versiones anteriores)
En junos OS versión 21.1 y anteriores, el dispositivo pasa los nombres de argumentos de entrada a la secuencia de comandos de acción de Python exactamente como se dan en el comando o EN LA RPC. Puede acceder a los argumentos de entrada a través de la sys.argv
lista.
Para el ejemplo anterior de YANG RPC, la lista de argumentos de entrada del sys.argv
script de acción es:
['/var/db/scripts/action/rpc-host-status.py', 'hostip', '198.51.100.1', 'level', 'detail', 'test', 'test', 'rpc_name', 'get-host-status']
El siguiente código python de ejemplo muestra una forma de extraer el valor para cada argumento de la sys.arv
lista para el ejemplo de RPC. En el ejemplo se define primero un diccionario que contiene los nombres de argumentos posibles como claves y un valor predeterminado para cada argumento. Luego, el código comprueba cada clave de la sys.argv
lista y recupera el índice del nombre del argumento en la lista, si está presente. A continuación, el código extrae el valor del argumento en la posición de índice adyacente y lo almacena en el diccionario para la clave adecuada. Este método garantiza que si los argumentos se pasan a la secuencia de comandos en un orden diferente durante la ejecución, se recupera el valor correcto para un argumento determinado.
import sys # Define default values for arguments args = {'hostip': None, 'level': 'brief', 'test': None} # Retrieve user input and store the values in the args dictionary for arg in args.keys(): if arg in sys.argv: index = sys.argv.index(arg) args[arg] = sys.argv[index+1]
Recuperación de datos operativos y de configuración
Los scripts de acción pueden recuperar datos operativos y de configuración de un dispositivo que ejecuta Junos OS y, luego, analizar los datos para obtener la información necesaria. Los scripts de acción SLAX pueden recuperar información del dispositivo mediante la ejecución de RPC compatibles con el protocolo de administración XML de Junos y la API XML de Junos. Los scripts de acción de Python pueden recuperar información operativa y de configuración mediante las API de Junos PyEZ o cli -c 'command'
el para ejecutar comandos de CLI en el script de acción como lo haría desde el shell. Para recuperar información operativa con el cli -c
método, incluya el comando operativo deseado. Para recuperar la información de configuración, utilice el show configuration
comando.
El siguiente fragmento de SLAX ejecuta el show interfaces
comando en el dispositivo local mediante la etiqueta de solicitud equivalente <get-interface-information>
:
var $rpc = <get-interface-information>; var $out = jcs:invoke($rpc); /* parse for relevant information and return as XML tree for RPC output */
El siguiente código Python usa Junos PyEZ para ejecutar el get_interface_information
RPC, que es equivalente al show interfaces
comando cli:
#!/usr/bin/python3 from jnpr.junos import Device from lxml import etree with Device() as dev: res = dev.rpc.get_interface_information() # parse for relevant information and return as XML tree for RPC output
Para obtener más información acerca de cómo usar Junos PyEZ para ejecutar RPC en dispositivos que ejecutan Junos OS, consulte Uso de Junos PyEZ para ejecutar RPC en dispositivos que ejecutan Junos OS.
El siguiente código python ejecuta el show interfaces | display xml
comando y convierte la salida de cadena en un árbol XML que se puede analizar para los datos necesarios mediante construcciones XPath:
#!/usr/bin/python3 import subprocess from lxml import etree cmd = ['cli', '-c', 'show interfaces | display xml'] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) tmp = proc.stdout.read() root = etree.fromstring(tmp.strip()) # parse for relevant information and return as XML tree for RPC output
Emisión de la salida XML de RPC
Una RPC puede definir elementos de salida mediante la instrucción opcional output
. La secuencia de comandos de acción debe definir y emitir los elementos XML necesarios para la salida de RPC. La jerarquía XML emitida por el script debe reflejar el árbol definido por los contenedores y las instrucciones leaf en la definición de la instrucción RPC output
. Para devolver la salida XML, la secuencia de comandos de acción debe emitir la jerarquía de salida de RPC y solo la jerarquía de salida. Los scripts SLAX deben usar la copy-of
instrucción para emitir el XML, y los scripts de Python pueden usar print
instrucciones.
Por ejemplo, considere la siguiente instrucción YANG RPC output
:
output { container host-status-information { container host-status-info { leaf host { type string; description "Host IP"; } leaf status { type string; description "Host status"; } leaf date { type string; description "Date and time"; } } } }
La secuencia de comandos de acción debe generar y emitir la salida XML correspondiente, por ejemplo:
<host-status-information> <host-status-info> <host>198.51.100.1</host> <status>Active</status> <date>2016-10-10</date> </host-status-info> <host-status-info> <host>198.51.100.2</host> <status>Inactive</status> <date>2016-10-10</date> </host-status-info> </host-status-information>
Después de recuperar los valores de los elementos de salida necesarios, una secuencia de comandos de Python puede emitir la jerarquía de salida XML mediante el siguiente código:
from lxml import etree ... xml = ''' <host-status-information> <host-status-info> <host>{0}</host> <status>{1}</status> <date>{2}</date> </host-status-info> </host-status-information> '''.format(hostip, pingstatus, now) tree = etree.fromstring(xml) print (etree.tostring(tree))
De manera similar, una secuencia de comandos de acción SLAX puede usar lo siguiente:
var $node = { <host-status-information> { <host-status-info> { <host> $ip; <status> $pingstatus; <date> $date; } } } copy-of $node;
Validación y carga de scripts de acción en un dispositivo
En la definición de YANG RPC, se especifica la secuencia de comandos de acción de LAR al incluir las junos:command
instrucciones y junos:action-execute
el junos:script
subestato, que toma el nombre de archivo de la secuencia de comandos de acción como su valor. Debe definir una sola secuencia de comandos de acción para cada RPC. Por ejemplo:
rpc rpc-name { ... junos:command "show sw-info" { junos:action-execute { junos:script "sw-info.py"; } } ... }
A partir de Junos OS versión 17.3, la action-execute
instrucción es una subestación a command
. En versiones anteriores, las action-execute
instrucciones y command
se colocan en el mismo nivel, y la command
instrucción es opcional.
Los módulos YANG que definen RPCs para dispositivos que ejecutan Junos OS deben importar el módulo de extensiones DDL de Junos OS.
Los scripts de acción de Python deben cumplir los siguientes requisitos antes de poder ejecutar los scripts en dispositivos que ejecutan Junos OS.
-
El propietario del archivo es raíz o un usuario de la clase de inicio de sesión de Junos OS
super-user
. -
Solo el propietario del archivo tiene permiso de escritura para el archivo.
-
La secuencia de comandos incluye una línea de directiva de intérprete como se describe en la placa de caldera de script de acción.
-
La
language python
instrucción olanguage python3
se configura en el[edit system scripts]
nivel de jerarquía para habilitar la ejecución de scripts de Python sin firmar.
A partir de Junos OS versión 20.2R1 y Junos OS Evolved versión 22.3R1, el dispositivo usa Python 3 para ejecutar scripts de acción y traducción yang. En versiones anteriores, Junos OS solo usa Python 2.7 para ejecutar estos scripts, y Junos OS Evolved usa Python 2.7 de forma predeterminada para ejecutar los scripts.
Los usuarios solo pueden ejecutar scripts de Python sin firmar en dispositivos que ejecutan Junos OS cuando los permisos de archivo de la secuencia de comandos incluyen permiso de lectura para la primera clase en la que el usuario se encuentra, en el orden de usuario, grupo u otros.
Puede validar la sintaxis de una secuencia de comandos de acción en la CLI emitiendo el request system yang validate action-script
comando y proporcionando la ruta a la secuencia de comandos. Por ejemplo:
user@host> request system yang validate action-script /var/tmp/sw-info.py Scripts syntax validation : START Scripts syntax validation : SUCCESS
Para usar una secuencia de comandos de acción, debe cargarla en el dispositivo con el módulo YANG que contiene la RPC correspondiente. Utilice los request system yang add
comandos o request system yang update
para agregar módulos YANG y sus scripts de acción asociados a un paquete YANG nuevo o existente en el dispositivo. Después de agregar los módulos y los scripts de acción al dispositivo, puede ejecutar sus RPCs personalizados. Cuando ejecuta un RPC, el dispositivo invoca la secuencia de comandos a la que se hace referencia.
Solución de problemas de scripts de acción
De forma predeterminada, los scripts de acción registran mensajes de seguimiento informativo cuando se ejecuta la secuencia de comandos. Puede ver los mensajes de seguimiento para comprobar que la RPC invocó la secuencia de comandos y que la secuencia de comandos se ejecutó correctamente. Si el script falla por cualquier motivo, los errores se registran en el archivo de seguimiento.
Junos OS
Para ver los mensajes de seguimiento de scripts de acción en dispositivos Junos OS en ejecución, vea el contenido del archivo action.log trace.
user@host> show log action.log
Junos OS evolucionado
Para ver los mensajes de seguimiento de scripts de acción en dispositivos Junos OS Evolved, vea los mensajes de seguimiento de aplicación cscript, que incluyen datos de seguimiento para todos los tipos de script.
user@host> show trace application cscript
empty
cuando se ejecuta el comando de RPC en la CLI de Junos OS, y el valor pasado a la secuencia de comandos de acción es el nombre del parámetro.
action-execute
instrucción es una subestación a
command
.