Cómo usar RPCs y comandos de modo operativo en scripts operativos
La mayoría de los comandos del modo operativo de Junos OS tienen equivalentes XML. Los scripts operativos 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 para desarrolladores operativos de la API XML de Junos.
El uso de RPCs y comandos de modo operativo en scripts operativos se analiza con más detalle en las siguientes secciones:
Uso de RPCs en scripts operativos
Para usar una RPC en una secuencia de comandos OP SLAX o XSLT, incluya el RPC en una declaración de variable y, luego, invoque la RPC mediante la jcs:invoke()
función de extensión o jcs:execute()
con la variable RPC como argumento. La jcs:invoke()
función ejecuta la RPC en el dispositivo local. La jcs:execute()
función, junto con un identificador de conexión, ejecuta la RPC en un dispositivo remoto.
El siguiente fragmento de código, que invoca una RPC en el dispositivo local, se expande y se describe por completo en ejemplo: Personalizar el resultado del comando mostrar interfaces terse mediante una secuencia de comandos de operación:
Sintaxis de 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);
El siguiente fragmento de código invoca la misma RPC en un dispositivo remoto:
Sintaxis de XSLT
<xsl:variable name="rpc"> <get-interface-information/> # Junos RPC for the show interfaces command </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 los scripts operativos de Python, las RPCs 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 la RPC anexando la propiedad y el nombre del rpc
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.
Para ejecutar la RPC en el dispositivo local, cree la Device
instancia con una lista de argumentos vacía. Para ejecutar la RPC en un dispositivo remoto, cree una instancia de uso de Device
los argumentos adecuados para conectarse a ese dispositivo.
El código siguiente invoca una RPC en el dispositivo local e imprime la respuesta:
Sintaxis de Python
from jnpr.junos import Device from lxml import etree with Device() as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
El código siguiente invoca el mismo RPC en un dispositivo remoto e imprime la respuesta:
Sintaxis de Python
from jnpr.junos import Device from lxml import etree import jcs user = jcs.get_input('Enter username: ') password = jcs.get_secret('Enter user password: ') with Device(host='198.51.100.1', user=user, password=password) as jdev: rsp = jdev.rpc.get_interface_information() print (etree.tostring(rsp, encoding='unicode'))
Para ejecutar una RPC en un dispositivo remoto, se debe establecer una sesión SSH . Para que la secuencia de comandos establezca la conexión, debe configurar la información de clave de host SSH para el dispositivo remoto en el dispositivo local donde se ejecutará la secuencia de comandos, o la información de 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 una RPC, configure la información de clave de host SSH con uno de los siguientes métodos:
Para configurar hosts SSH conocidos en el dispositivo local, incluya la
host
instrucción y especifique opciones de nombre de host y host para el dispositivo remoto en el[edit security ssh-known-hosts]
nivel de jerarquía 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, use el comando de
set security ssh-known-hosts load-key-file filename
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
Como alternativa, 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 de hosts conocido de ese usuario. En el ejemplo siguiente, la raíz se 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 del
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.
Mostrar las etiquetas RPC para un comando
Puede mostrar las etiquetas XML RPC para los comandos de modo operativo en la CLI del dispositivo. Para mostrar las etiquetas XML 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>
Las secuencias de comandos SLAX y XSLT pueden ejecutar RPCs mediante las etiquetas XML RPC. Las secuencias de comandos de Python deben convertir las etiquetas RPC y las opciones de comando 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 correspondientes de Python, consulte Uso de Junos PyEZ para ejecutar RPCs en dispositivos que ejecutan Junos OS.
Uso de comandos de modo operativo en scripts operativos
Algunos comandos de modo operativo no tienen equivalentes XML. Las secuencias de comandos SLAX y XSLT pueden ejecutar comandos que no tienen ningún equivalente XML mediante el <command>
elemento. Las secuencias de comandos de Python pueden ejecutar estos comandos mediante el método Junos PyEZ cli()
definido en la Device
clase.
Si un comando no aparece en la Referencia de desarrollador operativo de la API XML de Junos, el comando no tiene un equivalente XML. Otra forma de determinar si un comando tiene un equivalente XML es emitir el comando seguido del comando, por | display xml
ejemplo:
user@host> operational-mode-command | display xml
Si el resultado solo incluye elementos de etiqueta como <output>
, <cli>
y <banner>
, el comando podría no tener un equivalente XML. En el ejemplo siguiente, el resultado indica que el show host
comando no tiene ningún equivalente XML:
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, el resultado del comando en | display xml
canalización no incluye elementos de etiqueta distintos <output>
de , <cli>
y <banner>
solo porque la característica relevante 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 para que el show services cos statistics forwarding-class | display xml
comando se muestre. La salida es similar a esta:
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 de la Referencia para desarrolladores operativos de la API XML de Junos suele ser más confiable.
Los scripts operativos SLAX y XSLT pueden incluir comandos que no tienen equivalente XML. Use el <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 de código se expande y se describe por completo en Ejemplo: Mostrar información de nombre de host DNS mediante una secuencia de comandos de operación.
<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> ...
Las secuencias de comandos op de Python pueden ejecutar comandos que no tienen ningún 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 el resultado 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'
para devolver el resultado formateado 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 .