Utiliser Junos PyEZ pour installer des logiciels sur des équipements Junos
L’utilitaire Junos PyEZ jnpr.junos.utils.sw.SW
vous permet d’installer ou de mettre à niveau l’image logicielle sur les équipements Junos. La install()
méthode installe le progiciel spécifié.
Cette rubrique traite des scénarios de déploiement pris en charge, de la spécification de l’emplacement de l’image logicielle, ainsi que du processus et des options d’installation généraux lors de l’utilisation de Junos PyEZ pour mettre à niveau un périphérique. Il explique également comment utiliser Junos PyEZ pour effectuer des scénarios de mise à niveau plus spécialisés, tels qu’une mise à niveau de l’hôte d’une machine virtuelle, une mise à niveau logicielle unifiée en service (ISSU unifiée) ou une mise à niveau logicielle ininterrompue (NSSU) sur les équipements qui prennent en charge ces fonctionnalités.
Scénarios de déploiement pris en charge
L’utilitaire Junos PyEZ jnpr.junos.utils.sw.SW
vous permet d’installer ou de mettre à niveau l’image logicielle sur un équipement Junos individuel ou sur les membres d’un Virtual Chassis mixte ou non mixte. Les scénarios suivants sont pris en charge :
-
Équipements autonomes avec un seul moteur de routage
-
Équipements autonomes équipés de deux moteurs de routage
-
EX Series Virtual Chassis dans des configurations mixtes et non mixtes
-
QFX Series Virtual Chassis dans des configurations mixtes et non mixtes
-
Mixte EX Series et QFX Series Virtual Chassis
-
Mises à niveau de l’hôte de machine virtuelle sur les moteurs de routage avec prise en charge de l’hôte de machine virtuelle
-
Configurations de déploiement sur lesquelles certaines fonctionnalités en service sont activées, telles que ISSU unifié ou NSSU
À partir de la version 2.6.8 de Junos PyEZ, vous pouvez utiliser l’argument member_id
pour installer un package sur un membre spécifique d’un EX Series Virtual Chassis.
L’utilitaire jnpr.junos.utils.sw.SW
ne prend pas en charge la mise à niveau des périphériques d’un MX Series Virtual Chassis, d’un cluster de châssis SRX Series ou d’un Virtual Chassis Fabric (VCF).
Comment spécifier l’emplacement de l’image logicielle
Lorsque vous utilisez Junos PyEZ pour installer des logiciels sur des équipements Junos, vous pouvez télécharger l’image logicielle sur le serveur de gestion de la configuration et la install()
méthode, par défaut, la copie sur l’équipement cible avant d’effectuer l’installation. Vous pouvez également demander à la install()
méthode d’installer une image qui réside déjà sur l’appareil cible ou qui réside à une URL accessible à partir de l’équipement cible.
Le Tableau 1 décrit les paramètres de install()
méthode que vous devez définir en fonction de l’emplacement du progiciel. Vous devez toujours inclure le package
paramètre ou pkg_set
dans l’appel de méthode install()
.
Emplacement du progiciel |
|
|
|
---|---|---|---|
Serveur de gestion de la configuration |
Omettre ou définir sur |
Chemin d’accès au fichier, y compris le nom de fichier du ou des packages logiciels sur le serveur local exécutant Junos PyEZ. |
(Facultatif) Chemin d’accès au répertoire de l’équipement cible vers lequel le ou les packages seront copiés. La valeur par défaut est /var/tmp. |
Équipement cible |
Se mettre à |
Nom de fichier du ou des progiciels. |
(Facultatif) Chemin d’accès au répertoire de l’équipement cible où le ou les packages doivent déjà résider. La valeur par défaut est /var/tmp. |
URL |
– |
URL du point de vue de l’équipement Junos cible à partir duquel le progiciel est installé. |
– |
L’argument package
est utilisé pour installer des logiciels sur un seul équipement Junos ou sur des membres d’un Virtual Chassis non mixte. L’argument package
est une chaîne qui spécifie une seule image logicielle. Par exemple:
package = 'jinstall-13.3R1.8-domestic-signed.tgz'
L’argument pkg_set
est utilisé pour installer des logiciels sur les membres d’un Virtual Chassis mixte. Il contient une liste ou un tuple de chaînes qui spécifient les images logicielles nécessaires, sans ordre particulier, pour les différents membres de Virtual Chassis. Par exemple:
pkg_set=['jinstall-qfx-5-13.2X51-D35.3-domestic-signed.tgz', 'jinstall-ex-4300-13.2X51-D35.3-domestic-signed.tgz']
Pour les packages résidant sur le serveur local exécutant Junos PyEZ, lorsque vous omettez l’argument no_copy
ou que vous le définissez sur False
, le serveur copie le package logiciel spécifié sur le périphérique. L’inclusion de l’argument package
oblige le serveur à copier le package sur l’équipement cible (périphérique individuel ou routeur principal ou commutateur dans un Virtual Chassis non mixte), et l’inclusion de l’argument pkg_set
entraîne la copie de tous les packages de la liste sur le routeur principal ou le commutateur dans un Virtual Chassis mixte. Par défaut, les images logicielles sont placées dans le répertoire /var/tmp , sauf si l’argument remote_path
spécifie un répertoire différent.
Si vous définissez l’argument no_copy
sur True, les packages logiciels nécessaires doivent déjà exister sur la machine cible ou la machine principale Virtual Chassis avant le début de l’installation. Les paquets doivent résider soit dans le répertoire spécifié par l’argument remote_path
, soit, s’il remote_path
est omis, dans le répertoire /var/tmp par défaut.
Junos PyEZ prend également en charge l’installation d’images logicielles à partir d’une URL. Dans ce cas, la package
valeur ou pkg_set
doit être une URL du point de vue de l’équipement Junos cible. Le package est copié et installé à partir de l’URL spécifiée, et les no-copy
arguments et remote_path
sont ignorés. Pour plus d’informations sur la spécification du format de l’URL, reportez-vous à la section Format de spécification des noms de fichiers et des URL dans les commandes CLI de Junos OS.
Vue d’ensemble du processus d’installation
Pour installer une image logicielle sur un équipement Junos, une application Junos PyEZ se connecte au périphérique individuel ou au périphérique principal d’un Virtual Chassis, crée une instance de l’utilitaire SW
et appelle la install()
méthode avec les arguments obligatoires ou facultatifs. Par exemple:
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()
Pour la liste actuelle des paramètres de install()
la méthode, consultez install().
Si le package logiciel se trouve sur le serveur de gestion de la configuration et que le no_copy
paramètre est omis ou défini sur False, la install()
méthode effectue les opérations suivantes avant d’installer le logiciel :
-
Calcule la somme de contrôle du ou des progiciels locaux à l’aide de l’algorithme spécifié dans l’argument
checksum_algorithm
, si la somme de contrôle n’est pas déjà fournie par l’argumentchecksum
. Les valeurs acceptableschecksum_algorithm
sont"md5"
,"sha1"
, et"sha256"
. La valeur par défaut est"md5"
. -
Effectue un nettoyage du stockage sur l’équipement cible afin de libérer de l’espace pour le progiciel, sauf si
cleanfs
la valeur est .False
-
SCP ou FTP copie le paquet dans le
remote_path
répertoire ou, s’ilremote_path
n’est pas spécifié, dans le répertoire /var/tmp , si un fichier portant le même nom et la même somme de contrôle ne réside pas déjà à l’emplacement cible sur le périphérique. -
Calcule la somme de contrôle du fichier distant et la compare à la valeur du fichier local.
Une fois que le progiciel est sur l’équipement cible, qu’il y ait été téléchargé initialement, copié à partir du serveur de gestion de la configuration par la install()
méthode ou copié à partir d’une URL par l’équipement cible, la install()
méthode effectue les opérations suivantes :
-
Valide la configuration par rapport au nouveau package si le
validate
paramètre est défini sur True -
Installe le package sur tous les moteurs de routage, sauf s’il
all_re
est défini surFalse
À partir de la version 2.1.5, Junos PyEZ met à niveau par défaut tous les moteurs de routage sur les équipements individuels et les membres d’un Virtual Chassis. Dans les versions antérieures, ou si all_re=False
, Junos PyEZ met uniquement à niveau le moteur de routage auquel il est connecté.
À partir de la version 2.5.0 de Junos PyEZ, la install()
méthode renvoie un tuple contenant l’état de l’installation et une chaîne de message. Dans les versions antérieures, la méthode renvoie uniquement l’état de l’installation. L’état est True
si l’installation est réussie et False
non. La chaîne de message fournit des informations supplémentaires sur la réussite ou l’échec de l’installation et peut inclure des messages d’information ou des messages d’erreur générés par Junos PyEZ ou l’équipement. Par exemple:
Package junos-install-mx-x86-64-17.2R1.13.tgz couldn't be copied
La install()
méthode ne redémarre pas automatiquement l’appareil. Pour redémarrer ou arrêter l’appareil une fois l’installation terminée, appelez la reboot()
méthode ou shutdown()
respectivement.
La vidéo suivante présente une courte session Python qui illustre comment utiliser Junos PyEZ pour installer Junos OS.
Comment spécifier les délais d’installation et de somme de contrôle
Junos PyEZ effectue des opérations sur une session NETCONF. Le délai d’expiration par défaut d’un RPC NETCONF est de 30 secondes. Au cours du processus d’installation, Junos PyEZ augmente l’intervalle entre le délai d’expiration RPC à 1800 secondes (30 minutes) lors de la copie et de l’installation du package sur l’équipement et à 300 secondes (5 minutes) lors du calcul de la somme de contrôle. Dans certains cas, le processus d’installation ou le calcul de la somme de contrôle peut dépasser ces intervalles de temps.
Pour augmenter la valeur du délai d’expiration pour le processus d’installation et le calcul de la somme de contrôle, incluez respectivement les timeout
paramètres et checksum_timeout
dans l’appel à la install()
méthode et définissez-les sur les valeurs appropriées. Par exemple:
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()
Comment consigner le processus d’installation
Le processus d’installation de Junos PyEZ vous permet d’afficher ou de consigner la progression de l’installation en incluant l’argument progress
dans l’appel de install()
méthode. L’argument est défini sur une fonction de rappel, qui doit avoir un prototype de fonction défini qui inclut les arguments de chaîne d’instance Device
et de rapport. Vous pouvez également le configurer progress=True
pour les sw.progress()
rapports de base.
L’exemple suivant imprime la progression de l’installation à l’aide de la myprogress
fonction.
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()
La sortie de progression est dans le format défini par l’utilisateur.
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' ... ...
Mise à niveau d’un hôte de machine virtuelle
Sur les équipements dotés de moteurs de routage avec prise en charge d’hôtes de machines virtuelles, Junos OS s’exécute en tant que machine virtuelle (VM) sur un hôte basé sur Linux (hôte de machine virtuelle). Une mise à niveau d’hôte de machine virtuelle nécessite un package d’installation d’hôte de machine virtuelle (junos-vmhost-install-x.tgz) et met à niveau le système d’exploitation hôte et les Junos OS compatibles. La mise à niveau est effectuée à l’aide de la request vmhost software add
commande mode opérationnel, qui correspond au <request-vmhost-package-add>
RPC.
À partir de la version 2.1.6 de Junos PyEZ, la sw.install()
méthode prend en charge l’argument permettant d’effectuer une mise à niveau d’hôte vmhost=True
de machine virtuelle. Lorsque l’argument vmhost=True
est présent, la sw.install()
méthode effectue l’installation à l’aide du <request-vmhost-package-add>
RPC au lieu du <request-package-add>
RPC.
L’exemple suivant met à niveau et redémarre Junos OS et le système d’exploitation hôte sur un seul périphérique du moteur de routage :
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)
Pour redémarrer uniquement le logiciel Junos OS, appelez la sw.reboot()
méthode sans l’argument vmhost
.
Comment effectuer un ISSU unifié ou NSSU
Junos PyEZ permet d’effectuer une mise à niveau logicielle en service unifié (ISSU unifiée) ou une mise à niveau logicielle ininterrompue (NSSU) sur les équipements qui prennent en charge cette fonctionnalité et répondent aux exigences requises. Le Tableau 2 présente la version de Junos PyEZ dans laquelle les fonctionnalités unifiées ISSU et NSSU sont prises en charge pour la première fois. Pour plus d’informations sur l’ISSU unifié et le NSSU, reportez-vous à la documentation logicielle de votre produit.
Lancement de Junos PyEZ |
Prise en charge des fonctionnalités |
---|---|
2.1.0 |
Prise en charge d’ISSU et NSSU unifiés sur les équipements Junos à double moteur de routage. |
2.1.6 |
Prise en charge d’ISSU unifié lors d’une mise à niveau d’hôte de machine virtuelle pour les équipements avec prise en charge d’hôte de machine virtuelle qui utilisent la |
La fonctionnalité ISSU unifié vous permet de passer d’une version de Junos OS à une autre sans perturbation du plan de contrôle et avec une perturbation minimale du trafic. Pour effectuer une mise à niveau logicielle unifiée en service sur les appareils qui prennent en charge cette fonctionnalité, incluez l’argument issu=True
dans la install()
méthode.
Dans l’exemple suivant, la méthode met à niveau install()
Junos OS sur les deux moteurs de routage et redémarre le nouveau moteur de routage principal (anciennement l’ancien moteur de routage de secours) dans le cadre du processus d’installation. Si l’installation réussit, la reboot()
méthode redémarre alors le moteur de routage connecté, qui est le nouveau moteur de routage de secours (anciennement l’ancien moteur de routage 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)
Pour effectuer une mise à niveau logicielle unifiée en service sur un moteur de routage avec prise en charge de l’hôte de machine virtuelle qui répond aux exigences nécessaires et prend en charge l’ISSU unifié, incluez les vmhost=True
arguments et issu=True
dans la install()
méthode. L’équipement effectue une mise à niveau d’un système d’exploitation hôte et d’une version de Junos OS vers la version demandée à l’aide du <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)
La fonctionnalité NSSU vous permet de mettre à niveau le logiciel Junos OS exécuté sur un commutateur ou Virtual Chassis avec des moteurs de routage redondants avec une perturbation minimale du trafic réseau. Pour effectuer une mise à niveau logicielle ininterrompue sur les appareils qui prennent en charge cette fonctionnalité, incluez l’argument nssu=True
dans la install()
méthode. Par exemple:
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)
Comment installer un logiciel sur un membre EX Series Virtual Chassis
En règle générale, lorsque vous mettez à niveau un EX Series Virtual Chassis non mixte, vous devez suivre le processus d’installation décrit dans Présentation du processus d’installation pour mettre à niveau l’ensemble du Virtual Chassis. Toutefois, il peut arriver que vous ayez besoin d’installer un logiciel sur des commutateurs membres spécifiques dans un Virtual Chassis. À partir de la version 2.6.8 de Junos PyEZ, vous pouvez installer un package logiciel sur des commutateurs membres individuels dans un EX Series Virtual Chassis à l’aide de l’argument member_id
. L’argument member_id
est une liste de chaînes spécifiant les ID de membre sur lesquels installer le logiciel.
Par exemple, l’application Junos PyEZ suivante met à niveau le logiciel sur les membres 0 et 1 dans le EX Series Virtual Chassis :
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 ...
Exemple : Utilisation de Junos PyEZ pour installer un logiciel sur un équipement Junos
La bibliothèque Junos PyEZ fournit des méthodes permettant d’effectuer des tâches opérationnelles et de configuration sur les équipements Junos. Cet exemple explique comment utiliser l’utilitaire Junos PyEZ jnpr.junos.utils.sw.SW
pour installer ou mettre à niveau l’image logicielle sur un équipement Junos.
Exigences
Cet exemple utilise les composants matériels et logiciels suivants :
Serveur de gestion de la configuration exécutant Python 3.5 ou version ultérieure et Junos PyEZ version 2.5 ou ultérieure
Équipement Junos sur lequel NETCONF est activé et compte d’utilisateur configuré avec les autorisations appropriées
Paire de clés publique/privée SSH configurée pour l’utilisateur approprié sur le serveur Junos PyEZ et le périphérique Junos
Aperçu
Cet exemple présente une application Python qui utilise l’utilitaire Junos PyEZ SW
pour mettre à niveau Junos OS sur le périphérique spécifié. Cet exemple suppose que l’image logicielle réside sur le serveur local.
L’application importe la classe Junos PyEZ Device
, qui gère la connexion avec le périphérique Junos, la classe, qui est utilisée pour effectuer les opérations d’installation du logiciel sur le périphérique cible, et les SW
exceptions requises du module, qui contient les exceptions rencontrées lors de la jnpr.junos.exception
gestion des périphériques Junos. L’application importe également les os
modules , sys
, et logging
Python pour vérifier l’existence du progiciel et exécuter des fonctions de journalisation de base.
L’application définit la update_progress()
méthode, qui est utilisée par la install()
méthode pour rendre compte de l’avancement de l’installation. En consignant le processus d’installation, vous pouvez plus facilement identifier le point où les pannes se produisent. Dans cet exemple, les messages de progression sont envoyés à la sortie standard et également enregistrés dans un fichier séparé.
Avant de se connecter à l’appareil et de procéder à l’installation, l’application vérifie d’abord que le progiciel existe. Si le fichier est introuvable, l’application se ferme avec un message d’erreur. Si le fichier existe, l’application crée l’instance Device
de l’équipement cible et appelle la open()
méthode pour établir une connexion et une session NETCONF avec l’appareil.
L’application crée une instance de l’utilitaire SW
et utilise la install()
méthode pour installer l’image logicielle Junos OS sur l’équipement cible. La package
variable définit le chemin d’accès sur le serveur local à la nouvelle image Junos OS. Étant donné que la valeur par défaut du no_copy
paramètre est False, le processus d’installation copie l’image logicielle du serveur local vers l’équipement cible. La remote_path
variable définit le chemin d’accès sur l’équipement cible sur lequel le progiciel est copié. La valeur par défaut est /var/tmp. Bien que cela ne soit pas obligatoire, cet exemple configure explicitement le paramètre pour plus de clarté.
Lorsque la install()
méthode est appelée, l’application :
-
Calcule la somme de contrôle MD5 locale pour l’image logicielle
-
Effectue un nettoyage du stockage sur l’équipement cible
-
Copie l’image logicielle sur l’équipement cible
-
Calcule la somme de contrôle MD5 distante et la compare à la valeur locale
-
Valide la configuration par rapport à la nouvelle image
-
Installe le package
Si l’installation réussit, l’application appelle la reboot()
méthode pour redémarrer l’appareil. Après avoir effectué l’installation, l’application appelle la close()
méthode pour mettre fin à la session et à la connexion NETCONF. L’application comprend un code pour gérer les exceptions qui pourraient se produire lors de la connexion à l’appareil ou de l’installation.
Configuration
Création de l’application Junos PyEZ
Procédure étape par étape
Pour créer une application Python qui utilise Junos PyEZ pour installer une image logicielle sur un périphérique Junos :
Importez tous les modules, classes et objets requis.
import os, sys, logging from jnpr.junos import Device from jnpr.junos.utils.sw import SW from jnpr.junos.exception import ConnectError
Incluez toutes les variables requises, ce qui, dans cet exemple, inclut le nom d’hôte de l’équipement géré, le chemin d’accès au progiciel et le fichier journal.
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'
-
Définissez la méthode de journalisation utilisée dans l’application et par la
install()
méthode.def update_progress(dev, report): # log the progress of the installing process logging.info(report)
Créez une définition de fonction et un
main()
appel de fonction, puis placez les instructions restantes dans la définition.def main(): if __name__ == "__main__": main()
Initialisez l’instance de l’enregistreur.
# 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))
(Facultatif) Ajoutez du code qui vérifie l’existence du progiciel.
# verify package exists if not (os.path.isfile(package)): msg = 'Software package does not exist: {0}. '.format(package) logging.error(msg) sys.exit()
Créez une instance de la
Device
classe et fournissez le nom d’hôte et tous les paramètres requis pour cette connexion spécifique.Ouvrez ensuite une connexion et établissez une session NETCONF avec l’appareil.
# 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
Créez une instance de l’utilitaire
SW
.# Create an instance of SW sw = SW(dev)
Incluez le code pour installer le progiciel et pour redémarrer l’appareil si l’installation réussit.
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)
Mettez fin à la session NETCONF et fermez la connexion avec l’appareil.
# End the NETCONF session and close the connection dev.close()
Résultats
Sur le serveur de gestion de la configuration, examinez la demande terminée. Si l’application n’affiche pas le code prévu, répétez les instructions de cet exemple pour corriger l’application.
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()
Exécuter l’application Junos PyEZ
Exécuter l’application
-
Sur le serveur de gestion de la configuration, exécutez l’application.
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) ...
Vérification
Vérifier l’installation
But
Vérifiez que l’installation du logiciel a réussi.
Action
Pour plus d’informations sur l’installation, consultez les messages de progression, qui sont envoyés à la fois à la sortie standard et au fichier journal défini dans l’application. Un exemple de sortie de fichier journal est présenté ici. Certains résultats ont été omis par souci de concision.
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]
Signification
Le contenu du fichier journal indique que l’image a été copiée et installée avec succès sur l’équipement cible.
Dépannage
Résoudre les erreurs de délai d’expiration
Problème
L’application génère un message RpcTimeoutError ou un message TimeoutExpiredError et l’installation échoue.
RpcTimeoutError(host: dc1a.example.com, cmd: request-package-validate, timeout: 1800)
Les opérations longues peuvent dépasser l’intervalle de délai d’expiration du RPC, en particulier sur les périphériques les plus lents, ce qui entraîne l’expiration du délai d’attente du RPC avant la fin de l’opération. Le délai d’expiration par défaut d’un RPC NETCONF est de 30 secondes. Au cours du processus d’installation, Junos PyEZ augmente l’intervalle entre le délai d’expiration RPC à 300 secondes (5 minutes) lors du calcul de la somme de contrôle et à 1800 secondes (30 minutes) lors de la copie et de l’installation du package sur l’équipement.
Solution
Pour prendre en charge les opérations d’installation ou de somme de contrôle qui peuvent nécessiter un délai plus long que les intervalles d’installation et de délai d’expiration de la somme de contrôle par défaut, définissez la méthode timeout
et checksum_timeout
les install
paramètres sur les valeurs appropriées, puis réexécutez l’application. Par exemple:
sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=True, timeout=2400, checksum_timeout=400)
Tableau de l’historique des modifications
La prise en charge des fonctionnalités est déterminée par la plate-forme et la version que vous utilisez. Utilisez l’Explorateur de fonctionnalités pour déterminer si une fonctionnalité est prise en charge sur votre plateforme.
install()
méthode renvoie un tuple contenant l’état de l’installation et une chaîne de message.