Cómo usar RPCs y comandos de modo operativo en scripts de eventos
La mayoría de los comandos del modo operativo de Junos OS tienen equivalentes XML. Los scripts de eventos pueden ejecutar estos comandos XML en un dispositivo local o remoto mediante el protocolo de llamada a procedimiento remoto (RPC). Todos los comandos de modo operativo que tienen equivalentes XML se enumeran en la Referencia del desarrollador operativo de la API XML de Junos.
Los scripts SLAX y XSLT ejecutan RPCs en un dispositivo local o remoto mediante el uso de las jcs:invoke()
funciones de extensión o jcs:execute()
, respectivamente. En los scripts de Python, las RPC son fáciles de ejecutar mediante las API de Junos PyEZ . Cada instancia de la clase Junos PyEZ Device
tiene una rpc
propiedad que le permite ejecutar cualquier RPC disponible a través de la API XML de Junos. Después de establecer una sesión con un dispositivo local o remoto, puede ejecutar el RPC anexando la propiedad y el rpc
nombre del método RPC a la instancia del dispositivo. El valor devuelto es un objeto XML que comienza en el primer elemento bajo la <rpc-reply>
etiqueta.
El uso de RPCs y comandos de modo operativo en scripts de eventos se analiza con más detalle en las siguientes secciones:
Ejecución de RPCs en un dispositivo local
En una secuencia de comandos de eventos SLAX o XSLT, para ejecutar un RPC en el dispositivo local, incluya el RPC en una declaración de variable y llame a la jcs:invoke()
función de extensión con la variable RPC como argumento. El siguiente fragmento de código invoca una RPC en el dispositivo local:
Sintaxis XSLT
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </xsl:variable> <xsl:variable name="out" select="jcs:invoke($rpc)"/> ...
Sintaxis SLAX
var $rpc = <get-interface-information>; var $out = jcs:invoke($rpc);
En una secuencia de comandos de evento python, para ejecutar una RPC en el dispositivo local, cree la Device
instancia usando una lista de argumentos vacía y anexe la rpc
propiedad y el nombre de método y la lista de argumentos de LAP a la instancia del dispositivo.
Sintaxis de Python
from jnpr.junos import Device with Device() as jdev: rsp = jdev.rpc.get_interface_information()
Cuando se crea la Device
instancia con una lista de argumentos vacía para conectarse al dispositivo local, Junos OS usa los privilegios de acceso del usuario configurado en el [edit event-options event-script file filename python-script-user]
nivel de jerarquía. Si se omite la python-script-user
instrucción, Junos OS usa los privilegios de acceso del usuario genérico y sin privilegios y del grupo nobody
.
Ejecución de RPCs en un dispositivo remoto
En una secuencia de comandos de eventos SLAX o XSLT, para ejecutar un RPC en un dispositivo remoto, primero incluya el RPC en una declaración de variable y cree un controlador de conexión mediante la jcs:open()
función de extensión con los argumentos necesarios para conectarse al dispositivo remoto. A continuación, llame a la jcs:execute()
función de extensión e incluya el controlador de conexión y la variable RPC como argumentos. Por ejemplo:
Sintaxis XSLT
<xsl:variable name="rpc"> <get-interface-information/> </xsl:variable> <xsl:variable name="connection" select="jcs:open('198.51.100.1', 'bsmith', 'test123')"/> <xsl:variable name="out" select="jcs:execute($connection, $rpc)"/> <xsl:value-of select="jcs:close($connection)"/> ...
Sintaxis SLAX
var $rpc = <get-interface-information>; var $connection = jcs:open("198.51.100.1", "bsmith","test123"); var $out = jcs:execute($connection, $rpc); expr jcs:close($connection); ...
En una secuencia de comandos de evento python, para ejecutar una RPC en un dispositivo remoto, primero cree una instancia de uso de Device
los argumentos necesarios para conectarse al dispositivo remoto. A continuación, ejecute el RPC anexando la rpc
propiedad y el nombre del método y la lista de argumentos a la instancia del dispositivo.
Sintaxis de Python
from jnpr.junos import Device with Device(host='198.51.100.1', user='bsmith', passwd='test123') as jdev: rsp = jdev.rpc.get_interface_information()
Junos OS se conecta a y ejecuta operaciones en el dispositivo remoto mediante los privilegios de acceso del usuario especificados en la Device()
lista de argumentos, incluso si un usuario diferente está configurado para la python-script-user
instrucción en el [edit event-options event-script file filename]
nivel de jerarquía.
Para evitar agregar los detalles de la conexión remota directamente a una secuencia de comandos de evento, puede especificar detalles de ejecución remota para cada secuencia de comandos de evento que ejecute RPCs en un dispositivo remoto en el [edit event-options event-script file filename remote-execution]
nivel jerárquico. Recomendamos agregar los detalles de ejecución remota a la configuración en lugar de directamente en la secuencia de comandos de evento, ya que toda la información está disponible en una sola ubicación y la frase de contraseña está cifrada en la configuración.
Para cada dispositivo remoto en el que se ejecuta un RPC, configure el nombre de host del dispositivo y el nombre de usuario y la frase de contraseña correspondientes.
[edit event-options event-script file filename] remote-execution { remote-hostname { username username; passphrase passphrase; } }
Los nombres de host remotos y su nombre de usuario y frase de contraseña correspondientes, además de los detalles del evento, se pasan como entrada al script de evento cuando se ejecuta mediante una política de eventos. Para obtener más información acerca de los detalles que se reenvían a la secuencia de comandos de eventos, consulte Usar detalles de evento y ejecución remota en scripts de eventos.
Un script de evento hace referencia a los detalles de ejecución remota en la lista de argumentos de la función utilizada para crear la conexión al host remoto. Una vez establecida la conexión, la secuencia de comandos puede ejecutar RPCs en ese dispositivo.
En los scripts de eventos de Python, hace referencia a los detalles de la ejecución remota en la lista de argumentos de la instancia de Junos PyEZ Device()
. El código siguiente itera a través de los detalles de ejecución remota para todos los hosts configurados para esa secuencia de comandos de evento y se conecta a y ejecuta el mismo RPC en cada host.
Sintaxis de Python
from junos import Junos_Remote_Execution_Details from jnpr.junos import Device def main() for remote in Junos_Remote_Execution_Details(): hostname = remote.host username = remote.user passphrase = remote.passwd with Device(host=hostname, user=username, passwd=passphrase) as jdev: inv = jdev.rpc.get_interface_information() #process RPC information... if __name__ == "__main__": main()
En scripts SLAX o XSLT, cree una conexión al host remoto mediante la jcs:open()
función y haga referencia a los detalles de ejecución remota en la lista de argumentos. Por ejemplo:
Sintaxis XSLT
<xsl:variable name="rpc"> <get-interface-information/> </xsl:variable> <xsl:for-each select="event-script-input/remote-execution-details"> <xsl:variable name="d" select="remote-execution-detail"/> <xsl:variable name="connection" select="jcs:open($d/remote-hostname,$d/username,$d/passphrase)"/> <xsl:variable name="out" select="jcs:execute($connection, $rpc)"/> <xsl:value-of select="jcs:close($connection)"/> ... </xsl:for-each>
Sintaxis SLAX
var $rpc = <get-interface-information>; for-each (event-script-input/remote-execution-details) { var $d = remote-execution-detail; var $connection = jcs:open($d/remote-hostname,$d/username,$d/passphrase); var $out = jcs:execute($connection, $rpc); expr jcs:close($connection); ... }
Para ejecutar un RPC en un dispositivo remoto, debe establecerse una sesión SSH. Para que la secuencia de comandos establezca la conexión, debe configurar la información de la clave de host SSH para el dispositivo remoto en el dispositivo local donde se ejecutará la secuencia de comandos, o bien la información de la clave de host SSH para el dispositivo remoto debe existir en el archivo hosts conocido del usuario que ejecuta la secuencia de comandos. Para cada dispositivo remoto en el que se ejecuta la RPC, configure la información de clave de host SSH mediante uno de los métodos siguientes:
Para configurar hosts conocidos de SSH en el dispositivo local, incluya la
host
instrucción y especifique las opciones de nombre de host y clave de host para el dispositivo remoto en el[edit security ssh-known-hosts]
nivel jerárquico de la configuración.Para recuperar manualmente la información de la clave de host SSH, emita el comando de
set security ssh-known-hosts fetch-from-server hostname
modo de configuración para indicar a Junos OS que se conecte al dispositivo remoto y agregue la clave.user@host# set security ssh-known-hosts fetch-from-server router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
Para importar manualmente información de clave de host SSH desde un archivo, utilice el
set security ssh-known- hosts load-key-file filename
comando de modo de configuración y especifique el archivo de hosts conocidos.user@host# set security ssh-known-hosts load-key-file /var/tmp/known_hosts Import SSH host keys from trusted source /var/tmp/known_hosts ? [yes,no] (no) yes
Alternativamente, el usuario que ejecuta la secuencia de comandos puede iniciar sesión en el dispositivo local, SSH en el dispositivo remoto y, luego, aceptar manualmente la clave de host, que se agrega al archivo hosts conocidos de ese usuario. En el ejemplo siguiente, la raíz inicia sesión en el enrutador1. Para ejecutar una RPC remota en el enrutador2, la raíz agrega la clave de host del enrutador2 mediante la emisión del comando de
ssh router2
modo operativo y la aceptación manual de la clave.root@router1> ssh router2 The authenticity of host 'router2 (198.51.100.1)' can't be established. RSA key fingerprint is 30:18:99:7a:3c:ed:40:04:0f:fd:c1:57:7e:6b:f3:90. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'router2,198.51.100.1' (RSA) to the list of known hosts.
Después de configurar la clave de host SSH necesaria y obtener un controlador de conexión al dispositivo remoto, la secuencia de comandos de evento puede ejecutar RPC con la jcs:execute()
función de extensión en ese dispositivo remoto.
Mostrar las etiquetas RPC para un comando
Puede mostrar las etiquetas XML de RPC para comandos de modo operativo en la CLI del dispositivo. Para mostrar las etiquetas XML de RPC para un comando, escriba display xml rpc
después del símbolo de canalización ( | ).
En el siguiente ejemplo, se muestran las etiquetas RPC para el show route
comando:
user@host> show route | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.1I0/junos"> <rpc> <get-route-information> </get-route-information> </rpc> <cli> <banner></banner> </cli> </rpc-reply>
Los scripts SLAX y XSLT pueden ejecutar RPC mediante las etiquetas XML de RPC. Los scripts de Python deben convertir las etiquetas y las opciones de comando de LAR en un formato adecuado para Python. Para obtener más información acerca del uso de Junos PyEZ para ejecutar RPCs y acerca de la asignación de etiquetas RPC al método y los argumentos de método de Python correspondientes, consulte Uso de Junos PyEZ para ejecutar RPC en dispositivos que ejecutan Junos OS.
Uso de comandos del modo operativo en scripts de eventos
Algunos comandos de modo operativo no tienen equivalentes XML. Los scripts SLAX y XSLT pueden ejecutar comandos que no tengan xml equivalente mediante el <command>
elemento. Los scripts de Python pueden ejecutar estos comandos mediante el método Junos PyEZ cli()
definido en la Device
clase.
Si un comando no se muestra en la Referencia del desarrollador operativo de la API XML de Junos, el comando no tiene un xml equivalente. Otra forma de determinar si un comando tiene un xml equivalente es emitir el comando seguido del | display xml
comando.
user@host> operational-mode-command | display xml
Si el resultado solo incluye elementos de etiqueta como <output>
, <cli>
, y <banner>
, es posible que el comando no tenga un XML equivalente. En el siguiente ejemplo, el resultado indica que el show host
comando no tiene xml equivalente:
user@host> show host hostname | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <output> ... </output> <cli> <banner></banner> </cli> </rpc-reply>
Para algunos comandos que tienen un equivalente XML, la salida del comando canalado | display xml
no incluye elementos de etiqueta distintos a <output>
, <cli>
y <banner>
solo porque la característica correspondiente no está configurada. Por ejemplo, el show services cos statistics forwarding-class
comando tiene un equivalente XML que devuelve el resultado en la <service-cos-forwarding-class-statistics>
etiqueta de respuesta, pero si la configuración no incluye ninguna instrucción en el [edit class-of-service]
nivel de jerarquía, no hay datos reales que el show services cos statistics forwarding-class | display xml
comando muestre. El resultado es similar a este:
user@host> show services cos statistics forwarding-class | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/8.3I0/junos"> <cli> <banner></banner> </cli> </rpc-reply>
Por esta razón, la información en la Referencia del desarrollador operativo de la API XML de Junos suele ser más confiable.
Los scripts de eventos SLAX y XSLT pueden ejecutar comandos que no tienen xml equivalente. Utilice los <command>
, <xsl:value-of>
, y <output>
los elementos de la secuencia de comandos, como se muestra en el siguiente fragmento de código. Este fragmento se expande y se describe completamente en el ejemplo: Mostrar información de nombre de host DNS mediante una secuencia de comandos operativo.
<xsl:variable name="query"> <command> <xsl:value-of select="concat('show host ', $hostname)"/> </command> </xsl:variable> <xsl:variable name="result" select="jcs:invoke($query)"/> <xsl:variable name="host" select="$result"/> <output> <xsl:value-of select="concat('Name: ', $host)"/> </output> ...
Los scripts de eventos de Python pueden ejecutar comandos que no tienen equivalente XML mediante el uso de API de Junos PyEZ. El cli()
método definido en la Device
clase ejecuta un comando de modo operativo y devuelve la salida en formato de texto. Por ejemplo:
from jnpr.junos import Device def main(): with Device() as jdev: res = jdev.cli('show host hostname', warning=False) print (res) if __name__ == "__main__": main()
También puede especificar format='xml'
que devuelva la salida formateada como elementos XML de Junos OS. Para obtener más información acerca del método Junos PyEZ cli
, consulte http://junos-pyez.readthedocs.org/en/latest/_modules/jnpr/junos/device.html#Device.cli .