Usar Junos PyEZ para instalar software en dispositivos Junos
La utilidad Junos PyEZ jnpr.junos.utils.sw.SW
le permite instalar o actualizar la imagen de software en dispositivos Junos. El install()
método instala el paquete de software especificado.
En este tema se describen los escenarios de implementación admitidos, cómo especificar la ubicación de la imagen de software, y el proceso y las opciones generales de instalación cuando se utiliza Junos PyEZ para actualizar un dispositivo. También se explica cómo usar Junos PyEZ para realizar escenarios de actualización más especializados, como una actualización de host de máquina virtual, una actualización de software unificada en servicio (ISSU unificada) o una actualización de software sin interrupciones (NSSU) en dispositivos que admiten estas características.
Escenarios de implementación admitidos
La utilidad Junos PyEZ jnpr.junos.utils.sw.SW
le permite instalar o actualizar la imagen del software en un dispositivo Junos individual o en los miembros de un Virtual Chassis mixto o no mezclado. Se admiten los siguientes escenarios:
-
Dispositivos independientes con un solo motor de enrutamiento
-
Dispositivos independientes equipados con motores de enrutamiento duales
-
Chasis virtual de la serie EX en configuraciones de modo mixto y no mixto
-
Chasis virtual de la serie QFX en configuraciones de modo mixto y no mixto
-
Chasis virtual mixto de las series EX y QFX
-
Actualizaciones de host de VM en motores de enrutamiento con soporte de host de VM
-
Configuraciones de implementación que tienen algún tipo de características en servicio habilitadas, como ISSU o NSSU unificadas
A partir de Junos PyEZ versión 2.6.8, puede utilizar el argumento para instalar un paquete en un miembro específico de un chasis virtual de la member_id
serie EX.
La jnpr.junos.utils.sw.SW
utilidad no admite la actualización de dispositivos en un Virtual Chassis de la serie MX, un clúster de chasis de la serie SRX o una Virtual Chassis Fabric (VCF).
Cómo especificar la ubicación de la imagen de software
Cuando utilice Junos PyEZ para instalar software en dispositivos Junos, puede descargar la imagen de software en el servidor de administración de configuración y el install()
método, de forma predeterminada, la copia en el dispositivo de destino antes de realizar la instalación. También puede indicar install()
al método que instale una imagen que ya resida en el dispositivo de destino o que resida en una dirección URL accesible desde el dispositivo de destino.
En la tabla 1 se describen los parámetros de install()
método que debe establecer en función de la ubicación del paquete de software. Siempre debe incluir el package
parámetro o pkg_set
en la invocación del install()
método.
Ubicación del paquete de software |
|
|
|
---|---|---|---|
Servidor de administración de configuración |
Omitir o establecer en |
Ruta del archivo, incluido el nombre de archivo del paquete o paquetes de software en el servidor local que ejecuta Junos PyEZ. |
(Opcional) Ruta al directorio del dispositivo de destino en el que se copiarán el paquete o paquetes. El valor predeterminado es /var/tmp. |
Dispositivo de destino |
Establecer en |
Nombre de archivo del paquete o paquetes de software. |
(Opcional) Ruta al directorio del dispositivo de destino donde ya deben residir el paquete o paquetes. El valor predeterminado es /var/tmp. |
URL |
– |
URL desde la perspectiva del dispositivo Junos de destino desde el que está instalado el paquete de software. |
– |
El package
argumento se utiliza para instalar software en un único dispositivo Junos o en miembros de un Virtual Chassis no mixto. El package
argumento es una cadena que especifica una sola imagen de software. Por ejemplo:
package = 'jinstall-13.3R1.8-domestic-signed.tgz'
El pkg_set
argumento se utiliza para instalar software en los miembros de un Virtual Chassis mixto. Contiene una lista o tupla de cadenas que especifican las imágenes de software necesarias, sin ningún orden en particular, para los distintos miembros del Virtual Chassis. Por ejemplo:
pkg_set=['jinstall-qfx-5-13.2X51-D35.3-domestic-signed.tgz', 'jinstall-ex-4300-13.2X51-D35.3-domestic-signed.tgz']
En el caso de los paquetes que residen en el servidor local que ejecuta Junos PyEZ, cuando se omite el no_copy
argumento o se establezca en False
, el servidor copia el paquete de software especificado en el dispositivo. Incluir el package
argumento hace que el servidor copie el paquete en el dispositivo de destino (dispositivo individual o enrutador principal o conmutador en un Virtual Chassis no mixto) e incluir el pkg_set
argumento hace que el servidor copie todos los paquetes de la lista en el enrutador principal o conmutador en un Virtual Chassis mixto. De forma predeterminada, las imágenes de software se colocan en el directorio /var/tmp a menos que el remote_path
argumento especifique un directorio diferente.
Si establece el no_copy
argumento en True, los paquetes de software necesarios ya deben existir en el dispositivo de destino o en el dispositivo principal de Virtual Chassis antes de que comience la instalación. Los paquetes deben residir en el directorio especificado por el remote_path
argumento o, si remote_path
se omite, en el directorio /var/tmp predeterminado.
Junos PyEZ también admite la instalación de imágenes de software desde una URL. En este caso, el package
valor o pkg_set
debe ser una URL desde la perspectiva del dispositivo Junos de destino. El paquete se copia y se instala desde la dirección URL especificada, y se omiten los no-copy
argumentos y remote_path
. Para obtener información acerca de cómo especificar el formato de la URL, consulte Formato para especificar nombres de archivo y URL en comandos de la CLI de Junos OS.
Descripción general del proceso de instalación
Para instalar una imagen de software en un dispositivo Junos, una aplicación Junos PyEZ se conecta al dispositivo individual o al dispositivo principal en un Virtual Chassis, crea una instancia de la SW
utilidad y llama install()
al método con los argumentos obligatorios u opcionales. Por ejemplo:
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 obtener la lista actual de parámetros de install()
método, consulte install().
Si el paquete de software se encuentra en el servidor de administración de configuración y el no_copy
parámetro se omite o se establece en False, el install()
método realiza las siguientes operaciones antes de instalar el software:
-
Calcula la suma de comprobación del paquete o paquetes de software local mediante el algoritmo especificado en el
checksum_algorithm
argumento, si la suma de comprobación no se proporciona ya a través delchecksum
argumento. Los valores aceptableschecksum_algorithm
son"md5"
,"sha1"
, y"sha256"
. El valor predeterminado es"md5"
. -
Realiza una limpieza de almacenamiento en el dispositivo de destino para crear espacio para el paquete de software, a menos que
cleanfs
esté establecido enFalse
. -
SCP o FTP copian el paquete en el
remote_path
directorio, o siremote_path
no se especifica, en el directorio /var/tmp , si un archivo con el mismo nombre y suma de comprobación aún no reside en la ubicación de destino en el dispositivo. -
Calcula la suma de comprobación del archivo remoto y la compara con el valor del archivo local.
Después de que el paquete de software está en el dispositivo de destino, ya sea descargado allí inicialmente, copiado desde el servidor de administración de configuración por el install()
método o copiado desde una dirección URL por el dispositivo de destino, el install()
método realiza las siguientes operaciones:
-
Valida la configuración con respecto al nuevo paquete si el
validate
parámetro se establece en True -
Instala el paquete en todos los motores de enrutamiento, a menos que
all_re
se establezca enFalse
A partir de la versión 2.1.5, Junos PyEZ actualiza de forma predeterminada todos los motores de enrutamiento en dispositivos individuales y miembros en un Virtual Chassis. En versiones anteriores, o si all_re=False
, Junos PyEZ solo actualiza el motor de enrutamiento al que está conectado.
A partir de Junos PyEZ versión 2.5.0, el install()
método devuelve una tupla que contiene el estado de la instalación y una cadena de mensaje. En versiones anteriores, el método devuelve sólo el estado de la instalación. El estado es True
si la instalación se realiza correctamente y False
de lo contrario. La cadena de mensaje proporciona información adicional sobre el éxito o el error de la instalación y puede incluir mensajes informativos o de error generados por Junos PyEZ o el dispositivo. Por ejemplo:
Package junos-install-mx-x86-64-17.2R1.13.tgz couldn't be copied
El install()
método no reinicia automáticamente el dispositivo. Para reiniciar o apagar el dispositivo una vez completada la instalación, llame reboot()
al método o shutdown()
, respectivamente.
El siguiente vídeo presenta una breve sesión de Python que muestra cómo usar Junos PyEZ para instalar Junos OS.
Cómo especificar tiempos de espera de instalación y suma de comprobación
Junos PyEZ realiza operaciones a través de una sesión de NETCONF. El tiempo predeterminado para que se agote el tiempo de espera de una RPC de NETCONF es de 30 segundos. Durante el proceso de instalación, Junos PyEZ aumenta el intervalo de tiempo de espera de RPC a 1800 segundos (30 minutos) al copiar e instalar el paquete en el dispositivo y a 300 segundos (5 minutos) al calcular la suma de comprobación. En algunos casos, el proceso de instalación o el cálculo de la suma de comprobación pueden superar estos intervalos de tiempo.
Para aumentar el valor del tiempo de espera para el proceso de instalación y el cálculo de la suma de comprobación, incluya los timeout
parámetros y checksum_timeout
, respectivamente, en la llamada al install()
método y establézcalos en los valores adecuados. Por ejemplo:
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()
Cómo registrar el proceso de instalación
El proceso de instalación de Junos PyEZ permite mostrar o registrar el progreso de la instalación incluyendo el progress
argumento en la llamada al install()
método. El argumento se establece en una función de devolución de llamada, que debe tener definido un prototipo de función que incluya los argumentos de cadena de Device
instancia e informe. También puede configurarlo progress=True
para usarlo sw.progress()
para informes básicos.
En el ejemplo siguiente se imprime el progreso de la instalación mediante la myprogress
función.
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()
El resultado del progreso está en el formato definido por el usuario.
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' ... ...
Cómo realizar una actualización de host de máquina virtual
En los dispositivos que tienen motores de enrutamiento compatibles con host de máquina virtual, Junos OS se ejecuta como una máquina virtual (VM) a través de un host basado en Linux (host VM). Una actualización de host de máquina virtual requiere un paquete de instalación de host de máquina virtual (junos-vmhost-install-x.tgz) y actualiza el sistema operativo del host y Junos OS compatible. La actualización se realiza mediante el comando del request vmhost software add
modo operativo, que corresponde al <request-vmhost-package-add>
RPC.
A partir de Junos PyEZ versión 2.1.6, el sw.install()
método admite el argumento para realizar una actualización de host de vmhost=True
máquina virtual. Cuando el vmhost=True
argumento está presente, el sw.install()
método realiza la instalación utilizando el <request-vmhost-package-add>
RPC en lugar del <request-package-add>
RPC.
En el siguiente ejemplo, se actualiza y reinicia Junos OS y el sistema operativo host en un único dispositivo de motor de enrutamiento:
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 solo el software Junos OS, llame sw.reboot()
al método sin el vmhost
argumento.
Cómo realizar una ISSU o NSSU unificada
Junos PyEZ proporciona soporte para realizar una actualización de software unificada en servicio (ISSU unificada) o una actualización de software sin interrupciones (NSSU) en dispositivos que admiten la función y cumplen con los requisitos necesarios. En la Tabla 2 se describe la versión de Junos PyEZ en la que se admiten por primera vez las funciones unificadas de ISSU y NSSU. Para obtener más información acerca de ISSU y NSSU unificadas, consulte la documentación del software del producto.
Versión de Junos PyEZ |
Soporte de características |
---|---|
2.1.0 |
Compatibilidad con ISSU y NSSU unificadas en dispositivos Junos con motor de enrutamiento dual. |
2.1.6 |
Compatibilidad con ISSU unificada durante una actualización de host de máquina virtual para aquellos dispositivos compatibles con host de máquina virtual que usan el |
La función ISSU unificada le permite actualizar entre dos versiones diferentes de Junos OS sin interrupciones en el plano de control y con una interrupción mínima del tráfico. Para realizar una actualización de software unificada en servicio en dispositivos compatibles con esta característica, incluya el issu=True
argumento en el install()
método.
En el ejemplo siguiente, el método actualiza Junos install()
OS en ambos motores de enrutamiento y reinicia el nuevo motor de enrutamiento principal (anteriormente el antiguo motor de enrutamiento de reserva) como parte del proceso de instalación. Si la instalación se realiza correctamente, el reboot()
método reinicia el motor de enrutamiento conectado, que es el nuevo motor de enrutamiento de reserva (anteriormente el antiguo motor de enrutamiento principal).
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 una actualización unificada de software en servicio en un motor de enrutamiento con compatibilidad con host de máquina virtual que cumpla los requisitos necesarios y admita ISSU unificada, incluya los vmhost=True
argumentos y issu=True
en el install()
método. El dispositivo se actualiza desde una versión de SO host y Junos OS a la versión solicitada mediante RPC <request-vmhost-package-in-service-upgrade>
.
sw.install(package='junos-vmhost-install-qfx-x86-64-18.1R1.9.tgz', vmhost=True, issu=True, progress=True)
La función NSSU le permite actualizar el software Junos OS que se ejecuta en un conmutador o en un chasis virtual con motores de enrutamiento redundantes con una interrupción mínima del tráfico de red. Para realizar una actualización de software sin interrupciones en dispositivos compatibles con esta característica, incluya el nssu=True
argumento en el install()
método. Por ejemplo:
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)
Cómo instalar software en un miembro de chasis virtual de la serie EX
Generalmente, cuando se actualiza un Virtual Chassis no mixto de la serie EX, se sigue el proceso de instalación descrito en Descripción general del proceso de instalación para actualizar todo el Virtual Chassis. Sin embargo, puede haber ocasiones en las que necesite instalar software en conmutadores miembro específicos de un chasis virtual. A partir de Junos PyEZ versión 2.6.8, puede instalar un paquete de software en conmutadores miembro individuales en un chasis virtual de la serie EX utilizando el member_id
argumento. El member_id
argumento es una lista de cadenas que especifican los ID de miembro en los que instalar el software.
Por ejemplo, la siguiente aplicación Junos PyEZ actualiza el software del miembro 0 y del miembro 1 del chasis virtual de la serie 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 ...
Ejemplo: Usar Junos PyEZ para instalar software en un dispositivo Junos
La biblioteca Junos PyEZ proporciona métodos para realizar tareas operativas y de configuración en dispositivos Junos. En este ejemplo se describe cómo usar la utilidad Junos PyEZ jnpr.junos.utils.sw.SW
para instalar o actualizar la imagen de software en un dispositivo Junos.
- Requisitos
- Visión general
- Configuración
- Ejecute la aplicación Junos PyEZ
- Verificación
- Solución de problemas
Requisitos
En este ejemplo se utilizan los siguientes componentes de hardware y software:
Servidor de administración de configuración que ejecuta Python 3.5 o posterior y Junos PyEZ versión 2.5 o posterior
Dispositivo Junos con NETCONF habilitado y una cuenta de usuario configurada con los permisos adecuados
Par de claves pública y privada SSH configurado para el usuario adecuado en el servidor Junos PyEZ y el dispositivo Junos
Visión general
En este ejemplo se presenta una aplicación Python que utiliza la utilidad Junos PyEZ SW
para actualizar Junos OS en el dispositivo especificado. En este ejemplo se supone que la imagen de software reside en el servidor local.
La aplicación importa la clase Junos PyEZ Device
, que maneja la conexión con el dispositivo Junos; la SW
clase, que se utiliza para realizar las operaciones de instalación del software en el dispositivo de destino; y las excepciones necesarias del jnpr.junos.exception
módulo, que contiene las excepciones encontradas al administrar dispositivos Junos. La aplicación también importa los os
módulos , sys
, y logging
Python para verificar la existencia del paquete de software y realizar funciones básicas de registro.
La aplicación define el update_progress()
método, que es utilizado por el install()
método para informar sobre el progreso de la instalación. Al registrar el proceso de instalación, puede identificar más fácilmente el punto donde se producen errores. En este ejemplo, los mensajes de progreso se envían a la salida estándar y también se registran en un archivo independiente.
Antes de conectarse al dispositivo y continuar con la instalación, la aplicación primero verifica que el paquete de software existe. Si no se encuentra el archivo, la aplicación se cierra con un mensaje de error. Si el archivo existe, la aplicación crea la Device
instancia para el dispositivo de destino y llama open()
al método para establecer una conexión y una sesión NETCONF con el dispositivo.
La aplicación crea una instancia de la SW
utilidad y utiliza el install()
método para instalar la imagen del software Junos OS en el dispositivo de destino. La package
variable define la ruta del servidor local a la nueva imagen de Junos OS. Dado que el no_copy
valor predeterminado del parámetro es False, el proceso de instalación copia la imagen de software del servidor local al dispositivo de destino. La remote_path
variable define la ruta en el dispositivo de destino en el que se copia el paquete de software. El valor predeterminado es /var/tmp. Aunque no es obligatorio, este ejemplo configura explícitamente el parámetro para mayor claridad.
Cuando se llama al install()
método, la aplicación:
-
Calcula la suma de comprobación MD5 local para la imagen de software
-
Realiza una limpieza de almacenamiento en el dispositivo de destino
-
Copia la imagen del software en el dispositivo de destino
-
Calcula la suma de comprobación MD5 remota y la compara con el valor local
-
Valida la configuración con respecto a la nueva imagen
-
Instala el paquete
Si la instalación se realiza correctamente, la aplicación llama reboot()
al método para reiniciar el dispositivo. Después de realizar la instalación, la aplicación llama close()
al método para terminar la sesión y la conexión de NETCONF. La aplicación incluye código para manejar cualquier excepción que pueda ocurrir al conectarse al dispositivo o realizar la instalación.
Configuración
Crear la aplicación Junos PyEZ
Procedimiento paso a paso
Para crear una aplicación Python que utilice Junos PyEZ para instalar una imagen de software en un dispositivo Junos:
Importe los módulos, clases y objetos necesarios.
import os, sys, logging from jnpr.junos import Device from jnpr.junos.utils.sw import SW from jnpr.junos.exception import ConnectError
Incluya las variables necesarias, que en este ejemplo incluyen el nombre de host del dispositivo administrado, la ruta del paquete de software y el archivo de registro.
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'
-
Defina el método de registro utilizado dentro de la aplicación y por el
install()
método.def update_progress(dev, report): # log the progress of the installing process logging.info(report)
Cree una definición de función y una llamada a
main()
una función, y coloque las instrucciones restantes dentro de la definición.def main(): if __name__ == "__main__": main()
Inicialice la instancia del registrador.
# 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) Agregue código que compruebe la existencia del paquete 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()
Cree una instancia de la
Device
clase y proporcione el nombre de host y los parámetros necesarios para esa conexión específica.A continuación, abra una conexión y establezca una sesión de NETCONF con el 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
Cree una instancia de la
SW
utilidad.# Create an instance of SW sw = SW(dev)
Incluya código para instalar el paquete de software y para reiniciar el dispositivo si la instalación se realiza correctamente.
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)
Finalice la sesión de NETCONF y cierre la conexión con el dispositivo.
# End the NETCONF session and close the connection dev.close()
Resultados
En el servidor de administración de configuración, revise la aplicación completada. Si la aplicación no muestra el código deseado, repita las instrucciones de este ejemplo para corregir la aplicación.
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()
Ejecute la aplicación Junos PyEZ
Ejecutar la aplicación
-
En el servidor de administración de configuración, ejecute la aplicación.
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) ...
Verificación
Verificar la instalación
Propósito
Compruebe que la instalación del software se ha realizado correctamente.
Acción
Revise los mensajes de progreso, que se envían tanto a la salida estándar como al archivo de registro definido en la aplicación, para obtener detalles sobre la instalación. Aquí se muestra la salida del archivo de registro de muestra. Algunos resultados se han omitido por brevedad.
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
El contenido del archivo de registro indica que la imagen se copió e instaló correctamente en el dispositivo de destino.
Solución de problemas
Solucionar errores de tiempo de espera
Problema
La aplicación genera un mensaje RpcTimeoutError o un mensaje TimeoutExpiredError y se produce un error en la instalación.
RpcTimeoutError(host: dc1a.example.com, cmd: request-package-validate, timeout: 1800)
Las operaciones largas pueden superar el intervalo de tiempo de espera de RPC, especialmente en dispositivos más lentos, lo que hace que el RPC agote el tiempo de espera antes de que se pueda completar la operación. El tiempo predeterminado para que se agote el tiempo de espera de una RPC de NETCONF es de 30 segundos. Durante el proceso de instalación, Junos PyEZ aumenta el intervalo de tiempo de espera de RPC a 300 segundos (5 minutos) al calcular la suma de comprobación y a 1800 segundos (30 minutos) al copiar e instalar el paquete en el dispositivo.
Solución
Para acomodar operaciones de instalación o suma de comprobación que pueden requerir más tiempo que los intervalos de tiempo de espera predeterminados de instalación y suma de comprobación, establezca el método timeout
y checksum_timeout
los parámetros en los install
valores adecuados y vuelva a ejecutar la aplicación. Por ejemplo:
sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=True, timeout=2400, checksum_timeout=400)
Tabla de historial de cambios
La compatibilidad con las funciones viene determinada por la plataforma y la versión que esté utilizando. Utilice el Explorador de características para determinar si una característica es compatible con su plataforma.
install()
método devuelve una tupla que contiene el estado de la instalación y una cadena de mensaje.