Como usar RPCs e comandos de modo operacional em scripts de operação
A maioria dos comandos de modo operacional Junos OS tem equivalentes XML. Os scripts de operação podem executar esses comandos XML em um dispositivo local ou remoto usando o protocolo de chamada de procedimento remoto (RPC). Todos os comandos de modo operacional que têm equivalentes XML estão listados na Referência de Desenvolvedor Operacional de API Junos XML.
O uso de RPCs e comandos de modo operacional em scripts de operação é discutido com mais detalhes nas seguintes seções:
Usando RPCs em scripts de operação
Para usar um RPC em um script de operação SLAX ou XSLT, inclua o RPC em uma declaração variável e, em seguida, invoque o RPC usando a jcs:invoke()
função ou jcs:execute()
extensão com variável RPC como argumento. A jcs:invoke()
função executa o RPC no dispositivo local. A jcs:execute()
função, em conjunto com uma alça de conexão, executa o RPC em um dispositivo remoto.
O trecho a seguir, que invoca um RPC no dispositivo local, é expandido e totalmente descrito no exemplo: Personalize a saída das interfaces de show terse Command usando um script de operação:
Sintaxe 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)"/> ...
Sintaxe SLAX
var $rpc = <get-interface-information>; var $out = jcs:invoke($rpc);
O trecho a seguir invoca o mesmo RPC em um dispositivo remoto:
Sintaxe 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)"/> ...
Sintaxe 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);
Nos scripts de op Python, os RPCs são fáceis de executar usando APIs Junos PyEZ . Cada instância da classe Junos PyEZ Device
tem uma rpc
propriedade que permite que você execute qualquer RPC disponível através da API Junos XML. Após estabelecer uma sessão com um dispositivo local ou remoto, você pode executar o RPC anexando o nome do rpc
método de propriedade e RPC à instância do dispositivo. O valor de devolução é um objeto XML a partir do primeiro elemento sob a <rpc-reply>
tag.
Para executar o RPC no dispositivo local, crie a Device
instância usando uma lista de argumentos vazia. Para executar o RPC em um dispositivo remoto, crie uma instância de uso dos Device
argumentos apropriados para se conectar a esse dispositivo.
O código a seguir invoca um RPC no dispositivo local e imprime a resposta:
Sintaxe 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'))
O código a seguir invoca o mesmo RPC em um dispositivo remoto e imprime a resposta:
Sintaxe 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 executar um RPC em um dispositivo remoto, uma sessão de SSH deve ser estabelecida. Para que o script estabeleça a conexão, você deve configurar as informações-chave do host SSH para o dispositivo remoto no dispositivo local onde o script será executado, ou as informações-chave do host SSH para o dispositivo remoto devem existir no arquivo de hosts conhecido do usuário que executa o script. Para cada dispositivo remoto onde um RPC é executado, configure as informações-chave do host SSH com um dos seguintes métodos:
Para configurar hosts conhecidos de SSH no dispositivo local, inclua a
host
declaração e especifique as opções de nome de host e host para o dispositivo remoto no[edit security ssh-known-hosts]
nível de hierarquia da configuração.Para recuperar manualmente as informações chave do host SSH, emita o comando do
set security ssh-known-hosts fetch-from-server hostname
modo de configuração para instruir o Junos OS a se conectar ao dispositivo remoto e adicionar a chave.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 as informações-chave do host SSH de um arquivo, use o comando de
set security ssh-known-hosts load-key-file filename
modo de configuração e especifique o arquivo de hosts conhecidos.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, o usuário que executa o script pode fazer login no dispositivo local, SSH para o dispositivo remoto e, em seguida, aceitar manualmente a chave do host, que é adicionada ao arquivo de hosts conhecido do usuário. No exemplo a seguir, a raiz está logada no roteador1. Para executar um RPC remoto no roteador2, a raiz adiciona a chave host do roteador2, emitindo o comando do
ssh router2
modo operacional e aceitando manualmente a chave.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.
Exibindo as tags RPC para um comando
Você pode exibir as tags RPC XML para comandos de modo operacional na CLI do dispositivo. Para exibir as etiquetas RPC XML para um comando, entre display xml rpc
após o símbolo do pipe (|).
O exemplo a seguir exibe as tags RPC para o 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>
Os scripts SLAX e XSLT podem executar RPCs usando as tags RPC XML. Os scripts Python devem converter as tags RPC e as opções de comando em um formato adequado para Python. Para obter mais informações sobre o uso do Junos PyEZ para executar RPCs e sobre o mapeamento das tags RPC ao método Python correspondente e aos argumentos do método, consulte o uso do Junos PyEZ para executar RPCs em dispositivos que executam o Junos OS.
Usando comandos de modo operacional em scripts de operação
Alguns comandos de modo operacional não têm equivalentes XML. Scripts SLAX e XSLT podem executar comandos que não têm equivalente XML usando o <command>
elemento. Os scripts Python podem executar esses comandos usando o método Junos PyEZ cli()
definido na Device
classe.
Se um comando não estiver listado no Junos XML API Operational Developer Reference, o comando não tem um equivalente XML. Outra maneira de determinar se um comando tem um equivalente XML é emitir o comando seguido pelo | display xml
comando, por exemplo:
user@host> operational-mode-command | display xml
Se a saída incluir apenas elementos de tag como <output>
, <cli>
e <banner>
, o comando pode não ter um equivalente XML. No exemplo a seguir, a saída indica que o show host
comando não tem 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 alguns comandos que têm um equivalente XML, a saída do comando encanado | display xml
não inclui elementos de tag que <output>
não sejam , <cli>
e <banner>
apenas porque o recurso relevante não está configurado. Por exemplo, o show services cos statistics forwarding-class
comando tem um equivalente XML que devolve a <service-cos-forwarding-class-statistics>
saída na tag de resposta, mas se a configuração não incluir nenhuma declaração no nível de [edit class-of-service]
hierarquia, então não há dados reais para o show services cos statistics forwarding-class | display xml
comando exibir. A saída é semelhante 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 isso, as informações na referência de desenvolvedor operacional de API Junos XML geralmente são mais confiáveis.
Os scripts de op SLAX e XSLT podem incluir comandos que não têm equivalente XML. Use os <command>
elementos <xsl:value-of>
e <output>
os elementos do script, conforme mostrado no seguinte trecho de código. Este trecho é expandido e totalmente descrito em Exemplo: Exibir informações de nome de host DNS usando um script de operação.
<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> ...
Os scripts de operação Python podem executar comandos que não têm equivalente XML usando APIs Junos PyEZ. O cli()
método definido na Device
classe executa um comando de modo operacional e devolve a saída em formato de texto. Por exemplo:
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()
Você também pode especificar format='xml'
a devolução da saída formatada como elementos Junos OS XML. Para obter mais informações sobre o método Junos PyEZ cli()
, consulte http://junos-pyez.readthedocs.org/en/latest/_modules/jnpr/junos/device.html#Device.cli .