Use o Junos PyEZ para instalar software em dispositivos Junos
O utilitário Junos PyEZ jnpr.junos.utils.sw.SW
permite que você instale ou atualize a imagem de software em dispositivos Junos. O install()
método instala o pacote de software especificado.
Este tópico discute os cenários de implantação suportados, como especificar a localização da imagem do software e o processo geral de instalação e opções ao usar o Junos PyEZ para atualizar um dispositivo. Ele também discute como usar o Junos PyEZ para realizar cenários de atualização mais especializados, como uma atualização de host VM, uma atualização unificada de software em serviço (ISSU unificada) ou uma atualização de software ininterrupta (NSSU) em dispositivos que oferecem suporte a esses recursos.
Cenários de implantação suportados
O utilitário Junos PyEZ jnpr.junos.utils.sw.SW
permite que você instale ou atualize a imagem de software em um dispositivo Junos individual ou nos membros em um Virtual Chassis misto ou não misto. Os cenários a seguir são suportados:
-
Dispositivos autônomos com um único mecanismo de roteamento
-
Dispositivos autônomos equipados com mecanismos de roteamento duplos
-
Chassi virtual da Série EX em configurações mistas e não mistas
-
Chassi virtual da Série QFX em configurações mistas e não mistas
-
Chassi virtual da Série EX e QFX mistas
-
Atualizações de host VM em mecanismos de roteamento com suporte para host VM
-
Configurações de implantação que têm alguma forma de recursos em serviço habilitados, como ISSU unificado ou NSSU
A partir do Junos PyEZ Release 2.6.8, você pode usar o member_id
argumento para instalar um pacote em um membro específico de um Chassi Virtual da Série EX.
O jnpr.junos.utils.sw.SW
utilitário não oferece suporte a dispositivos de atualização em um chassi virtual da Série MX, um cluster de chassi da Série SRX ou uma malha virtual de chassi (VCF).
Como especificar a localização da imagem do software
Quando você usa o Junos PyEZ para instalar software em dispositivos Junos, você pode baixar a imagem de software para o servidor de gerenciamento de configuração, e o install()
método, por padrão, o copia para o dispositivo-alvo antes de realizar a instalação. Você também pode instruir o install()
método a instalar uma imagem que já reside no dispositivo alvo ou reside em uma URL que é acessível a partir do dispositivo alvo.
A Tabela 1 descreve os parâmetros do install()
método que você deve definir dependendo da localização do pacote de software. Você deve sempre incluir o parâmetro ou pkg_set
o package
install()
método invocação.
Localização de pacotes de software |
|
|
|
---|---|---|---|
Servidor de gerenciamento de configuração |
Omitir ou definir |
Caminho de arquivo, incluindo o nome de arquivo do pacote de software ou pacotes no servidor local que executa o Junos PyEZ. |
(Opcional) Caminho até o diretório sobre o dispositivo-alvo ao qual o pacote ou os pacotes serão copiados. Padrão é /var/tmp. |
Dispositivo-alvo |
Definir para |
Nome de arquivo do pacote ou pacotes de software. |
(Opcional) Caminho até o diretório no dispositivo-alvo onde o pacote ou os pacotes já devem residir. Padrão é /var/tmp. |
URL |
– |
URL da perspectiva do dispositivo Junos alvo do qual o pacote de software é instalado. |
– |
O package
argumento é usado para instalar software em um único dispositivo Junos ou em membros em um Virtual Chassis não misto. O package
argumento é uma seqüência que especifica uma única imagem de software. Por exemplo:
package = 'jinstall-13.3R1.8-domestic-signed.tgz'
O pkg_set
argumento é usado para instalar software nos membros em um Virtual Chassis misto. Ele contém uma lista ou tuple de strings que especificam as imagens de software necessárias, em nenhuma ordem específica, para os vários membros do Virtual Chassis. Por exemplo:
pkg_set=['jinstall-qfx-5-13.2X51-D35.3-domestic-signed.tgz', 'jinstall-ex-4300-13.2X51-D35.3-domestic-signed.tgz']
Para pacotes residentes no servidor local que executa o Junos PyEZ, quando você omite o no_copy
argumento ou o define False
, o servidor copia o pacote de software especificado para o dispositivo. Incluir o package
argumento faz com que o servidor copie o pacote para o dispositivo alvo (dispositivo individual ou roteador primário ou switch em um Virtual Chassis não misto), e incluindo o pkg_set
argumento faz com que o servidor copie todos os pacotes da lista para o roteador ou switch principal em um Virtual Chassis misto. Por padrão, as imagens de software são colocadas no diretório /var/tmp , a menos que o remote_path
argumento especifique um diretório diferente.
Se você definir o no_copy
argumento para True, os pacotes de software necessários já devem existir no dispositivo alvo ou no dispositivo principal do Virtual Chassis antes do início da instalação. Os pacotes devem residir no diretório especificado pelo remote_path
argumento, ou se remote_path
forem omitidos, no diretório padrão /var/tmp .
O Junos PyEZ também oferece suporte à instalação de imagens de software de uma URL. Neste caso, o valor ou pkg_set
o package
valor devem ser uma URL da perspectiva do dispositivo Junos alvo. O pacote é copiado e instalado a partir da URL especificada, e os no-copy
argumentos e argumentos remote_path
são ignorados. Para obter informações sobre como especificar o formato da URL, consulte Formato para especificar nomes de arquivo e URLs nos comandos CLI do Junos OS.
Visão geral do processo de instalação
Para instalar uma imagem de software em um dispositivo Junos, um aplicativo Junos PyEZ se conecta ao dispositivo individual ou ao dispositivo principal em um Virtual Chassis, cria uma instância do SW
utilitário e chama o install()
método com quaisquer argumentos necessários ou opcionais. Por exemplo:
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'junos-install-mx-x86-64-17.2R1.13.tgz' with Device(host='router1.example.net') as dev: sw = SW(dev) # In Junos PyEZ Release 2.4.1 and earlier, install() returns a Boolean # ok = sw.install(package=pkg, validate=True, checksum_algorithm='sha256') # In Junos PyEZ Release 2.5.0 and later, install() returns a tuple ok, msg = sw.install(package=pkg, validate=True, checksum_algorithm='sha256') print("Status: " + str(ok) + ", Message: " + msg) if ok: sw.reboot()
Para a lista atual de parâmetros do install()
método, consulte instalar().
Se o pacote de software estiver localizado no servidor de gerenciamento de configuração e o no_copy
parâmetro for omitido ou definido em Falso, o install()
método realizará as seguintes operações antes de instalar o software:
-
Computa o checksum do pacote ou pacotes de software locais usando o algoritmo especificado no
checksum_algorithm
argumento, se o checksum ainda não for fornecido através dochecksum
argumento. Valores aceitáveischecksum_algorithm
são"md5"
,"sha1"
e"sha256"
. O padrão é"md5"
. -
Realiza uma limpeza de armazenamento no dispositivo-alvo para criar espaço para o pacote de software, a menos que
cleanfs
esteja definido paraFalse
. -
SCP ou FTP copia o pacote para o
remote_path
diretório, ou seremote_path
não for especificado, para o diretório /var/tmp , se um arquivo com o mesmo nome e checksum ainda não residir no local alvo no dispositivo. -
Computa o checksum do arquivo remoto e o compara com o valor do arquivo local.
Após o pacote de software estar no dispositivo alvo, seja baixado inicialmente, copiado do servidor de gerenciamento de configuração pelo install()
método ou copiado de uma URL pelo dispositivo alvo, o install()
método executa as seguintes operações:
-
Valida a configuração em relação ao novo pacote se o
validate
parâmetro for definido como verdadeiro -
Instala o pacote em todos os mecanismos de roteamento a menos que
all_re
esteja definido paraFalse
A partir do lançamento 2.1.5, o Junos PyEZ, por padrão, atualiza todos os mecanismos de roteamento em dispositivos individuais e membros em um Virtual Chassis. Em versões anteriores, ou se all_re=False
, o Junos PyEZ só atualiza o Mecanismo de Roteamento ao qual ele está conectado.
A partir do Junos PyEZ Release 2.5.0, o install()
método retorna uma tuple que contém o status da instalação e uma corda de mensagem. Em versões anteriores, o método retorna apenas o status da instalação. O status é True
se a instalação for bem sucedida e False
de outra forma. A sequência de mensagens fornece informações adicionais sobre o sucesso ou falha da instalação e pode incluir mensagens informativas ou mensagens de erro geradas pelo Junos PyEZ ou pelo dispositivo. Por exemplo:
Package junos-install-mx-x86-64-17.2R1.13.tgz couldn't be copied
O install()
método não reinicia automaticamente o dispositivo. Para reiniciar ou desligar o dispositivo após a instalação ser concluída, ligue para o reboot()
método ou shutdown()
o método, respectivamente.
O vídeo a seguir apresenta uma curta sessão de Python que demonstra como usar o Junos PyEZ para instalar o Junos OS.
Como especificar o tempo limite de instalação e checkum
O Junos PyEZ realiza operações em uma sessão netconf. O tempo padrão de um RPC NETCONF para o tempo de saída é de 30 segundos. Durante o processo de instalação, o Junos PyEZ aumenta o intervalo de tempo limite do RPC para 1800 segundos (30 minutos) ao copiar e instalar o pacote no dispositivo e para 300 segundos (5 minutos) ao computar o checksum. Em alguns casos, o processo de instalação ou o cálculo de checksum podem exceder esses intervalos de tempo.
Para aumentar o valor de tempo limite para o processo de instalação e o cálculo do checksum, inclua os parâmetros e checksum_timeout
os timeout
parâmetros, respectivamente, na chamada ao install()
método e configure-os para os valores apropriados. Por exemplo:
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'junos-install-mx-x86-64-17.2R1.13.tgz' with Device(host='router1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=pkg, validate=True, timeout=2400, checksum_timeout=400) if ok: sw.reboot()
Como registrar o processo de instalação
O processo de instalação do Junos PyEZ permite exibir ou registrar o progresso da instalação, incluindo o progress
argumento na chamada do install()
método. O argumento é definido para uma função de retorno de chamada, que deve ter um protótipo de função definido que inclui a Device
instância e relatar argumentos de strings. Você também pode definir progress=True
para usar sw.progress()
para relatórios básicos.
O exemplo a seguir imprime o progresso da instalação usando a myprogress
função.
from jnpr.junos import Device from jnpr.junos.utils.sw import SW def myprogress(dev, report): print("host: %s, report: %s" % (dev.hostname, report)) pkg = 'junos-install-mx-x86-64-17.2R1.13.tgz' with Device(host='router1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=pkg, validate=True, progress=myprogress) if ok: sw.reboot()
A saída de progresso está no formato definido pelo usuário.
user@server:~$ python3 junos-pyez-install.py Found package. Installing: junos-install-mx-x86-64-17.2R1.13.tgz host: router1.example.net, report: computing checksum on local package: junos-install-mx-x86-64-17.2R1.13.tgz host: router1.example.net, report: cleaning filesystem ... host: router1.example.net, report: before copy, computing checksum on remote package: /var/tmp/junos-install-mx-x86-64-17.2R1.13.tgz host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 38682624 / 386795750 (10%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 77365248 / 386795750 (20%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 116047872 / 386795750 (30%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 154730496 / 386795750 (40%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 193413120 / 386795750 (50%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 232079360 / 386795750 (60%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 270761984 / 386795750 (70%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 309444608 / 386795750 (80%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 348127232 / 386795750 (90%) host: router1.example.net, report: junos-install-mx-x86-64-17.2R1.13.tgz: 386795750 / 386795750 (100%) host: router1.example.net, report: after copy, computing checksum on remote package: /var/tmp/junos-install-mx-x86-64-17.2R1.13.tgz host: router1.example.net, report: checksum check passed. host: router1.example.net, report: installing software ... please be patient ... host: router1.example.net, report: software pkgadd package-result: 0 Output: Installing package '/var/tmp/junos-install-mx-x86-64-17.2R1.13.tgz' ... ...
Como realizar um upgrade de host VM
Em dispositivos que têm mecanismos de roteamento com suporte de host VM, o Junos OS funciona como uma máquina virtual (VM) em um host baseado em Linux (host VM). Um upgrade de host VM requer um pacote de instalação de host VM (junos-vmhost-install-tgzx) e atualiza o sistema operacional host e o Junos OS compatível. A atualização é realizada usando o comando de request vmhost software add
modo operacional, que corresponde ao <request-vmhost-package-add>
RPC.
A partir do Junos PyEZ Release 2.1.6, o sw.install()
método suporta o vmhost=True
argumento para realizar um upgrade de host VM. Quando o vmhost=True
argumento está presente, o sw.install()
método realiza a instalação usando o <request-vmhost-package-add>
RPC em vez do <request-package-add>
RPC.
O exemplo a seguir atualiza e reinicializa o Junos OS e o sistema operacional host em um único dispositivo de mecanismo de roteamento:
from jnpr.junos import Device from jnpr.junos.utils.sw import SW with Device(host='switch1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package='junos-vmhost-install-qfx-x86-64-18.1R1.9.tgz', vmhost=True, no_copy=True) if ok: sw.reboot(vmhost=True)
Para reiniciar apenas o software Junos OS, chame o sw.reboot()
método sem o vmhost
argumento.
Como realizar um ISSU unificado ou NSSU
O Junos PyEZ oferece suporte para realizar uma atualização unificada de software em serviço (ISSU unificada) ou uma atualização de software ininterrupta (NSSU) em dispositivos que oferecem suporte ao recurso e atendem aos requisitos necessários. A Tabela 2 descreve a versão Junos PyEZ na qual os recursos unificados de ISSU e NSSU são suportados pela primeira vez. Para obter mais informações sobre o ISSU e o NSSU unificados, consulte a documentação de software para o seu produto.
Versão do Junos PyEZ |
Suporte para recursos |
---|---|
2.1.0 |
Suporte para ISSU e NSSU unificados em dispositivos Junos com mecanismo de roteamento duplo. |
2.1.6 |
Suporte para ISSU unificado durante um upgrade de host VM para esses dispositivos com suporte de host VM que usam o |
O recurso ISSU unificado permite que você atualize entre duas versões diferentes do Junos OS sem interrupções no plano de controle e com o mínimo de interrupção do tráfego. Para realizar uma atualização unificada de software em serviço em dispositivos que oferecem suporte a esse recurso, inclua o issu=True
argumento no install()
método.
No exemplo a seguir, o método atualiza o install()
Junos OS em ambos os mecanismos de roteamento e reinicia o novo mecanismo de roteamento primário (anteriormente o antigo mecanismo de roteamento de backup) como parte do processo de instalação. Se a instalação for bem sucedida, o reboot()
método então reinicializa o mecanismo de roteamento conectado, que é o novo mecanismo de roteamento de backup (anteriormente o antigo mecanismo de roteamento primário).
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'junos-install-mx-x86-64-17.2R1.13.tgz' with Device(host='router1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=pkg, issu=True, progress=True) if ok: sw.reboot(all_re=False)
Para realizar uma atualização unificada de software em serviço em um mecanismo de roteamento com suporte de host VM que atenda aos requisitos necessários e suporte a ISSU unificada, inclua os argumentos e issu=True
o vmhost=True
install()
método. O dispositivo faz upgrades de um sistema operacional host e versão do Junos OS para a versão solicitada usando o <request-vmhost-package-in-service-upgrade>
RPC.
sw.install(package='junos-vmhost-install-qfx-x86-64-18.1R1.9.tgz', vmhost=True, issu=True, progress=True)
O recurso NSSU permite atualizar o software Junos OS em execução em um switch ou Virtual Chassis com mecanismos de roteamento redundantes com o mínimo de interrupção no tráfego da rede. Para realizar uma atualização ininterrupta de software em dispositivos que oferecem suporte a esse recurso, inclua o nssu=True
argumento no install()
método. Por exemplo:
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'jinstall-ex-4300–14.1X53-D44.3-domestic-signed.tgz' with Device(host='switch1.example.net') as dev: sw = SW(dev) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=pkg, nssu=True, progress=True) if ok: sw.reboot(all_re=False)
Como instalar software em um membro virtual do chassi da Série EX
Geralmente, quando você atualiza um Chassi Virtual da Série EX não misto, você acompanha o processo de instalação descrito na visão geral do processo de instalação para atualizar todo o Virtual Chassis. No entanto, pode haver momentos em que você precisa instalar software em switches de membros específicos em um Virtual Chassis. A partir do Junos PyEZ Release 2.6.8, você pode instalar um pacote de software em switches individuais de membros em um Virtual Chassis da Série EX usando o member_id
argumento. O member_id
argumento é uma lista de strings especificando os IDs dos membros nos quais instalar o software.
Por exemplo, o aplicativo Junos PyEZ a seguir atualiza o software no membro 0 e membro 1 no Virtual Chassis da Série EX:
from jnpr.junos import Device from jnpr.junos.utils.sw import SW pkg = 'junos-install-ex-x86-64-23.2R1.13.tgz' def myprogress(dev, report): print("host: {}, report: {}".format(dev.hostname, report)) with Device(host='switch2.example.net') as dev: sw = SW(dev) ok, msg = sw.install(package=pkg, member_id=['0', '1'], progress=myprogress, no_copy=True, reboot=False, cleanfs=False, force_host=False, timeout=4000) if ok: sw.reboot(all_re=False, member_id=['0', '1'])
user@server:~$ python3 junos-pyez-install-on-members.py host: switch2.example.net, report: request-package-checks-pending-install rpc is not supported on given device host: switch2.example.net, report: installing software on VC member: 0 ... please be patient ... host: switch2.example.net, report: software pkgadd package-result: 0 Output: Verified junos-install-ex-x86-64-23.2R1.13 signed by PackageProductionECP256_2023 method ECDSA256+SHA256 Verified auto-snapshot signed by PackageProductionECP256_2023 method ECDSA256+SHA256 ...
Exemplo: use o Junos PyEZ para instalar software em um dispositivo Junos
A biblioteca Junos PyEZ oferece métodos para realizar tarefas operacionais e de configuração em dispositivos Junos. Este exemplo descreve como usar o utilitário Junos PyEZ jnpr.junos.utils.sw.SW
para instalar ou atualizar a imagem de software em um dispositivo Junos.
- Requisitos
- Visão geral
- Configuração
- Execute o aplicativo Junos PyEZ
- Verificação
- Solucionando problemas
Requisitos
Este exemplo usa os seguintes componentes de hardware e software:
Servidor de gerenciamento de configuração executando Python 3.5 ou posterior e Junos PyEZ Versão 2.5 ou posterior
Dispositivo Junos com NETCONF habilitado e uma conta de usuário configurada com permissões apropriadas
Par de chave SSH público/privado configurado para o usuário apropriado no servidor Junos PyEZ e dispositivo Junos
Visão geral
Este exemplo apresenta um aplicativo Python que usa o utilitário Junos PyEZ SW
para atualizar o Junos OS no dispositivo especificado. Este exemplo pressupõe que a imagem do software reside no servidor local.
O aplicativo importa a classe Junos PyEZDevice
, que lida com a conexão com o dispositivo Junos; a SW
classe, que é usada para realizar as operações de instalação de software no dispositivo alvo; e exigiu exceções do jnpr.junos.exception
módulo, que contém exceções encontradas ao gerenciar dispositivos Junos. O aplicativo também importa os os
módulos Python e logging
, sys
para verificar a existência do pacote de software e executar funções básicas de registro.
O aplicativo define o update_progress()
método, que é usado pelo install()
método para relatar o progresso da instalação. Ao registrar o processo de instalação, você pode identificar mais facilmente o ponto onde ocorrem quaisquer falhas. Neste exemplo, as mensagens de progresso são enviadas para a saída padrão e também são registradas em um arquivo separado.
Antes de se conectar ao dispositivo e prosseguir com a instalação, o aplicativo verifica primeiro se o pacote de software existe. Se o arquivo não puder ser encontrado, o aplicativo sai com uma mensagem de erro. Se o arquivo existir, o aplicativo cria a Device
instância para o dispositivo alvo e chama o open()
método para estabelecer uma conexão e sessão NETCONF com o dispositivo.
O aplicativo cria uma instância do SW
utilitário e usa o install()
método para instalar a imagem do software Junos OS no dispositivo alvo. A package
variável define o caminho no servidor local para a nova imagem do Junos OS. Como o no_copy
parâmetro é padrão para Falso, o processo de instalação copia a imagem de software do servidor local para o dispositivo alvo. A remote_path
variável define o caminho no dispositivo-alvo ao qual o pacote de software é copiado. O padrão é /var/tmp. Embora não seja necessário, este exemplo configura explicitamente o parâmetro para clareza.
Quando o install()
método é chamado, o aplicativo:
-
Calcula o checksum MD5 local para a imagem do software
-
Realiza uma limpeza de armazenamento no dispositivo-alvo
-
Copia a imagem do software para o dispositivo-alvo
-
Computa o checksum MD5 remoto e o compara com o valor local
-
Valida a configuração em relação à nova imagem
-
Instala o pacote
Se a instalação for bem sucedida, o aplicativo então chama o reboot()
método para reiniciar o dispositivo. Após a realização da instalação, o aplicativo chama o close()
método para encerrar a sessão e a conexão netconf. O aplicativo inclui código para lidar com quaisquer exceções que possam ocorrer ao se conectar ao dispositivo ou realizar a instalação.
Configuração
Crie o aplicativo Junos PyEZ
Procedimento passo a passo
Para criar um aplicativo Python que usa o Junos PyEZ para instalar uma imagem de software em um dispositivo Junos:
Importe quaisquer módulos, aulas e objetos necessários.
import os, sys, logging from jnpr.junos import Device from jnpr.junos.utils.sw import SW from jnpr.junos.exception import ConnectError
Inclua quaisquer variáveis necessárias, que para este exemplo incluem o nome de host do dispositivo gerenciado, o caminho do pacote de software e o arquivo de log.
host = 'dc1a.example.com' package = '/var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz' remote_path = '/var/tmp' validate = True logfile = '/var/log/junos-pyez/install.log'
-
Definir o método de registro usado dentro do aplicativo e pelo
install()
método.def update_progress(dev, report): # log the progress of the installing process logging.info(report)
Crie uma
main()
definição de função e chamada de função e coloque as declarações restantes dentro da definição.def main(): if __name__ == "__main__": main()
Inicialize a instância do madeireiro.
# initialize logging logging.basicConfig(filename=logfile, level=logging.INFO, format='%(asctime)s:%(name)s: %(message)s') logging.getLogger().name = host logging.getLogger().addHandler(logging.StreamHandler()) logging.info('Information logged in {0}'.format(logfile))
(Opcional) Adicione um código que verifica a existência do pacote de software.
# verify package exists if not (os.path.isfile(package)): msg = 'Software package does not exist: {0}. '.format(package) logging.error(msg) sys.exit()
Crie uma instância da
Device
classe e forneça o nome de host e quaisquer parâmetros necessários para essa conexão específica.Em seguida, abra uma conexão e estabeleça uma sessão netconf com o dispositivo.
# open a connection with the device and start a NETCONF session dev = Device(host=host) try: dev.open() except ConnectError as err: logging.error('Cannot connect to device: {0}\n'.format(err)) return
Crie uma instância da
SW
utilidade.# Create an instance of SW sw = SW(dev)
Inclua código para instalar o pacote de software e reiniciar o dispositivo se a instalação for bem sucedida.
try: logging.info('Starting the software upgrade process: {0}' \ .format(package)) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=validate) except Exception as err: msg = 'Unable to install software, {0}'.format(err) logging.error(msg) ok = False if ok is True: logging.info('Software installation complete. Rebooting') rsp = sw.reboot() logging.info('Upgrade pending reboot cycle, please be patient.') logging.info(rsp) else: msg = 'Unable to install software, {0}'.format(ok) logging.error(msg)
Encerre a sessão da NETCONF e feche a conexão com o dispositivo.
# End the NETCONF session and close the connection dev.close()
Resultados
No servidor de gerenciamento de configuração, analise o aplicativo concluído. Se o aplicativo não exibir o código pretendido, repita as instruções neste exemplo para corrigir o aplicativo.
import os, sys, logging from jnpr.junos import Device from jnpr.junos.utils.sw import SW from jnpr.junos.exception import ConnectError host = 'dc1a.example.com' package = '/var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz' remote_path = '/var/tmp' validate = True logfile = '/var/log/junos-pyez/install.log' def update_progress(dev, report): # log the progress of the installing process logging.info(report) def main(): # initialize logging logging.basicConfig(filename=logfile, level=logging.INFO, format='%(asctime)s:%(name)s: %(message)s') logging.getLogger().name = host logging.getLogger().addHandler(logging.StreamHandler()) logging.info('Information logged in {0}'.format(logfile)) # verify package exists if not (os.path.isfile(package)): msg = 'Software package does not exist: {0}. '.format(package) logging.error(msg) sys.exit() dev = Device(host=host) try: dev.open() except ConnectError as err: logging.error('Cannot connect to device: {0}\n'.format(err)) return # Create an instance of SW sw = SW(dev) try: logging.info('Starting the software upgrade process: {0}' \ .format(package)) # Starting in Release 2.5.0, install() returns a tuple instead of a Boolean ok, msg = sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=validate) except Exception as err: msg = 'Unable to install software, {0}'.format(err) logging.error(msg) ok = False if ok is True: logging.info('Software installation complete. Rebooting') rsp = sw.reboot() logging.info('Upgrade pending reboot cycle, please be patient.') logging.info(rsp) else: msg = 'Unable to install software, {0}'.format(ok) logging.error(msg) # End the NETCONF session and close the connection dev.close() if __name__ == "__main__": main()
Execute o aplicativo Junos PyEZ
Execute o aplicativo
-
No servidor de gerenciamento de configuração, execute o aplicativo.
user@server:~$ python3 junos-pyez-install.py Information logged in /var/log/junos-pyez/install.log Starting the software upgrade process: /var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz computing local checksum on: /var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz cleaning filesystem ... starting thread (client mode): 0x282d4110L Connected (version 2.0, client OpenSSH_6.7) ...
Verificação
Verifique a instalação
Propósito
Verifique se a instalação do software foi bem sucedida.
Ação
Analise as mensagens de progresso, que são enviadas tanto para a saída padrão quanto para o arquivo de log que é definido no aplicativo, para obter detalhes sobre a instalação. A saída de arquivo de log de amostra é mostrada aqui. Alguma saída foi omitida por brevidade.
user@server:~$ cat /var/log/junos-pyez/install.log 2015-09-03 21:29:20,795:dc1a.example.com: Information logged in /var/log/junos-pyez/install.log 2015-09-03 21:29:35,257:dc1a.example.com: Starting the software upgrade process: /var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz 2015-09-03 21:29:35,257:dc1a.example.com: computing local checksum on: /var/tmp/junos-install/jinstall-13.3R1.8-domestic-signed.tgz 2015-09-03 21:29:47,025:dc1a.example.com: cleaning filesystem ... 2015-09-03 21:30:00,870:paramiko.transport: starting thread (client mode): 0x282d4110L 2015-09-03 21:30:01,006:paramiko.transport: Connected (version 2.0, client OpenSSH_6.7) ... 2015-09-03 21:30:01,533:paramiko.transport: userauth is OK 2015-09-03 21:30:04,002:paramiko.transport: Authentication (public key) successful! 2015-09-03 21:30:04,003:paramiko.transport: [chan 0] Max packet in: 32768 bytes 2015-09-03 21:30:04,029:paramiko.transport: [chan 0] Max packet out: 32768 bytes 2015-09-03 21:30:04,029:paramiko.transport: Secsh channel 0 opened. 2015-09-03 21:30:04,076:paramiko.transport: [chan 0] Sesch channel 0 request ok 2015-09-03 21:32:23,684:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 94437376 / 944211851 (10%) 2015-09-03 21:34:43,828:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 188858368 / 944211851 (20%) 2015-09-03 21:37:04,180:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 283279360 / 944211851 (30%) 2015-09-03 21:39:24,020:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 377700352 / 944211851 (40%) 2015-09-03 21:41:43,906:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 472121344 / 944211851 (50%) 2015-09-03 21:44:04,079:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 566542336 / 944211851 (60%) 2015-09-03 21:46:23,968:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 660963328 / 944211851 (70%) 2015-09-03 21:48:44,045:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 755384320 / 944211851 (80%) 2015-09-03 21:51:04,016:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 849805312 / 944211851 (90%) 2015-09-03 21:53:24,058:dc1a.example.com: jinstall-13.3R1.8-domestic-signed.tgz: 944211851 / 944211851 (100%) 2015-09-03 21:53:24,389:paramiko.transport: [chan 0] EOF sent (0) 2015-09-03 21:53:24,466:paramiko.transport: EOF in transport thread 2015-09-03 21:53:24,514:dc1a.example.com: computing remote checksum on: /var/tmp/jinstall-13.3R1.8-domestic-signed.tgz 2015-09-03 21:56:01,692:dc1a.example.com: checksum check passed. 2015-09-03 21:56:01,692:dc1a.example.com: validating software against current config, please be patient ... 2015-09-03 22:47:57,205:dc1a.example.com: installing software ... please be patient ... 2015-09-03 23:28:10,415:dc1a.example.com: Software installation complete. Rebooting 2015-09-03 23:28:11,525:dc1a.example.com: Upgrade pending reboot cycle, please be patient. 2015-09-03 23:28:11,525:dc1a.example.com: Shutdown NOW! [pid 55494]
Significado
O conteúdo do arquivo de log indica que a imagem foi copiada e instalada com sucesso no dispositivo alvo.
Solucionando problemas
Resolução de problemas de erros de tempo limite
Problema
O aplicativo gera uma mensagem RpcTimeoutError ou uma mensagem TimeoutExpiredError e a instalação falha.
RpcTimeoutError(host: dc1a.example.com, cmd: request-package-validate, timeout: 1800)
Operações longas podem exceder o intervalo de tempo limite do RPC, especialmente em dispositivos mais lentos, fazendo com que o RPC fique sem tempo antes que a operação possa ser concluída. O tempo padrão de um RPC NETCONF para o tempo de saída é de 30 segundos. Durante o processo de instalação, o Junos PyEZ aumenta o intervalo de tempo limite do RPC para 300 segundos (5 minutos) ao computar o checksum e para 1800 segundos (30 minutos) ao copiar e instalar o pacote no dispositivo.
Solução
Para acomodar operações de instalação ou checksum que possam exigir um tempo maior do que os intervalos de tempo limite de instalação e checkum padrão, definir o método timeout
e checksum_timeout
os install
parâmetros para os valores apropriados e refazer a execução do aplicativo. Por exemplo:
sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=True, timeout=2400, checksum_timeout=400)
Tabela de histórico de mudanças
O suporte de recursos é determinado pela plataforma e versão que você está usando. Use o Feature Explorer para determinar se um recurso é suportado em sua plataforma.
install()
método retorna uma tuple que contém o status da instalação e uma corda de mensagem.