Verwenden von Junos PyEZ zum Installieren von Software auf Junos-Geräten
Mit dem Dienstprogramm Junos PyEZ jnpr.junos.utils.sw.SW
können Sie das Software-Image auf Junos-Geräten installieren oder aktualisieren. Die install()
Methode installiert das angegebene Softwarepaket.
In diesem Thema werden die unterstützten Bereitstellungsszenarien, die Angabe des Speicherorts des Software-Images sowie der allgemeine Installationsprozess und die Optionen bei der Verwendung von Junos PyEZ zum Upgrade eines Geräts erläutert. Außerdem wird erläutert, wie Junos PyEZ verwendet werden kann, um speziellere Upgrade-Szenarien durchzuführen, wie z. B. ein VM-Host-Upgrade, ein einheitliches In-Service-Software-Upgrade (Unified ISSU) oder ein Nonstop-Software-Upgrade (NSSU) auf Geräten, die diese Funktionen unterstützen.
Unterstützte Bereitstellungsszenarien
Mit dem Dienstprogramm Junos PyEZ jnpr.junos.utils.sw.SW
können Sie das Software-Image auf einem einzelnen Junos-Gerät oder auf den Mitgliedern in einem gemischten oder nicht gemischten Virtual Chassis installieren oder aktualisieren. Die folgenden Szenarien werden unterstützt:
-
Eigenständige Geräte mit einer einzigen Routing-Engine
-
Eigenständige Geräte mit zwei Routing-Engines
-
Virtual Chassis der EX-Serie in Mixed- und Non-Mixed-Mode-Konfigurationen
-
Virtual Chassis der QFX-Serie in Mixed- und Non-Mixed-Mode-Konfigurationen
-
Gemischte Virtual Chassis der EX-Serie und QFX-Serie
-
VM-Host-Upgrades auf Routing-Engines mit VM-Host-Support
-
Bereitstellungskonfigurationen, für die In-Service-Funktionen aktiviert sind, z. B. einheitliches ISSU oder NSSU
Ab Junos PyEZ, Version 2.6.8, können Sie das member_id
Argument verwenden, um ein Paket auf einem bestimmten Mitglied eines Virtual Chassis der EX-Serie zu installieren.
Das jnpr.junos.utils.sw.SW
Dienstprogramm unterstützt keine Aktualisierung von Geräten in einem Virtual Chassis der MX-Serie, einem Chassis-Cluster der SRX-Serie oder einer Virtual Chassis Fabric (VCF).
Angeben des Speicherorts für das Software-Image
Wenn Sie Junos PyEZ verwenden, um Software auf Junos-Geräten zu installieren, können Sie das Software-Image auf den Konfigurationsmanagement-Server herunterladen, und die install()
Methode kopiert es standardmäßig auf das Zielgerät, bevor Sie die Installation durchführen. Sie können die install()
Methode auch anweisen, ein Image zu installieren, das sich bereits auf dem Zielgerät oder unter einer URL befindet, die vom Zielgerät aus erreichbar ist.
In Tabelle 1 sind die Methodenparameter aufgeführt, die install()
Sie je nach Speicherort des Softwarepakets festlegen müssen. Sie müssen immer entweder den package
or pkg_set
-Parameter in den install()
Methodenaufruf einschließen.
Speicherort des Softwarepakets |
|
|
|
---|---|---|---|
Konfigurationsverwaltungsserver |
Weglassen oder setzen auf |
Dateipfad einschließlich des Dateinamens des Softwarepakets oder der Pakete auf dem lokalen Server, auf dem Junos PyEZ ausgeführt wird. |
(Optional) Pfad zu dem Verzeichnis auf dem Zielgerät, in das das Paket oder die Pakete kopiert werden. Der Standardwert ist /var/tmp. |
Zielgerät |
Setzen Sie auf |
Dateiname des Softwarepakets oder der Softwarepakete. |
(Optional) Pfad zu dem Verzeichnis auf dem Zielgerät, in dem sich das Paket oder die Pakete bereits befinden müssen. Der Standardwert ist /var/tmp. |
Weblinks |
– |
URL aus der Perspektive des Junos-Zielgeräts, von dem aus das Softwarepaket installiert wird. |
– |
Das package
Argument wird verwendet, um Software auf einem einzelnen Junos-Gerät oder auf Bauteilen in einem nicht gemischten Virtual Chassis zu installieren. Das package
Argument ist eine Zeichenfolge, die ein einzelnes Softwareabbild angibt. Zum Beispiel:
package = 'jinstall-13.3R1.8-domestic-signed.tgz'
Das pkg_set
Argument wird verwendet, um Software auf den Bauteilen in einem gemischten virtuellen Chassis zu installieren. Sie enthält eine Liste oder ein Tupel von Zeichenfolgen, die die erforderlichen Software-Images in beliebiger Reihenfolge für die verschiedenen Virtual Chassis-Member angeben. Zum Beispiel:
pkg_set=['jinstall-qfx-5-13.2X51-D35.3-domestic-signed.tgz', 'jinstall-ex-4300-13.2X51-D35.3-domestic-signed.tgz']
Bei Paketen, die sich auf dem lokalen Server befinden, auf dem Junos PyEZ ausgeführt wird, kopiert der Server das angegebene Softwarepaket auf das Gerät, wenn Sie das no_copy
Argument weglassen oder auf False
festlegen. Das Einschließen des package
Arguments bewirkt, dass der Server das Paket auf das Zielgerät kopiert (einzelnes Gerät oder primärer Router oder Switch in einem nicht gemischten Virtual Chassis), und das Einschließen des pkg_set
Arguments bewirkt, dass der Server alle Pakete in der Liste auf den primären Router oder Switch in einem gemischten Virtual Chassis kopiert. Standardmäßig werden Software-Images im Verzeichnis /var/tmp abgelegt, es sei denn, das Argument remote_path
gibt ein anderes Verzeichnis an.
Wenn Sie das no_copy
Argument auf True festlegen, müssen die erforderlichen Softwarepakete bereits auf dem Zielgerät oder dem primären Virtual Chassis-Gerät vorhanden sein, bevor die Installation beginnt. Die Pakete müssen sich entweder in dem durch das remote_path
Argument angegebenen Verzeichnis oder, falls remote_path
es weggelassen wird, im Standardverzeichnis /var/tmp befinden.
Junos PyEZ unterstützt auch die Installation von Software-Images über eine URL. In diesem Fall muss der package
Wert "oder pkg_set
" eine URL aus der Perspektive des Junos-Zielgeräts sein. Das Paket wird von der angegebenen URL kopiert und installiert, und die no-copy
Argumente und remote_path
werden ignoriert. Weitere Informationen zum Angeben des URL-Formats finden Sie unter Format zum Angeben von Dateinamen und URLs in Junos OS CLI-Befehlen.
Überblick über den Installationsprozess
Um ein Software-Image auf einem Junos-Gerät zu installieren, stellt eine Junos PyEZ-Anwendung eine Verbindung mit dem einzelnen Gerät oder dem primären Gerät in einem Virtual Chassis her, erstellt eine Instanz des SW
Dienstprogramms und ruft die install()
Methode mit allen erforderlichen oder optionalen Argumenten auf. Zum Beispiel:
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()
Die aktuelle Liste der install()
Methodenparameter finden Sie unter install().
Wenn sich das Softwarepaket auf dem Konfigurationsverwaltungsserver befindet und der no_copy
Parameter weggelassen oder auf False festgelegt ist, führt die install()
Methode vor der Installation der Software die folgenden Vorgänge aus:
-
Berechnet die Prüfsumme des lokalen Softwarepakets bzw. der lokalen Softwarepakete mit dem im
checksum_algorithm
Argument angegebenen Algorithmus, wenn die Prüfsumme nicht bereits über daschecksum
Argument bereitgestellt wird. Zulässigechecksum_algorithm
Werte sind"md5"
,"sha1"
und"sha256"
. Der Standardwert ist"md5"
. -
Führt eine Speicherbereinigung auf dem Zielgerät durch, um Speicherplatz für das Softwarepaket zu schaffen, es sei denn
cleanfs
, es ist aufFalse
festgelegt. -
SCP oder FTP kopiert das Paket in das
remote_path
Verzeichnis oder, fallsremote_path
nicht angegeben, in das Verzeichnis /var/tmp , wenn sich nicht bereits eine Datei mit demselben Namen und derselben Prüfsumme am Zielspeicherort auf dem Gerät befindet. -
Berechnet die Prüfsumme der Remotedatei und vergleicht sie mit dem Wert der lokalen Datei.
Nachdem sich das Softwarepaket auf dem Zielgerät befindet, unabhängig davon, ob es ursprünglich dorthin heruntergeladen, von der install()
Methode vom Konfigurationsverwaltungsserver oder vom Zielgerät aus einer URL kopiert wurde, führt die install()
Methode die folgenden Vorgänge aus:
-
Überprüft die Konfiguration anhand des neuen Pakets, wenn der
validate
Parameter auf True festgelegt ist -
Installiert das Paket auf allen Routing-Engines, es sei denn
all_re
, es ist aufFalse
Ab Version 2.1.5 aktualisiert Junos PyEZ standardmäßig alle Routing-Engines auf einzelnen Geräten und Mitgliedern in einem virtuellen Chassis. In früheren Versionen oder wenn all_re=False
, aktualisiert Junos PyEZ nur die Routing-Engine, mit der es verbunden ist.
Ab Junos PyEZ, Version 2.5.0, gibt die install()
Methode ein Tupel zurück, das den Status der Installation und eine Meldungszeichenfolge enthält. In früheren Versionen gibt die Methode nur den Status der Installation zurück. Der Status ist True
, ob die Installation erfolgreich war und False
nicht. Die Meldungszeichenfolge enthält zusätzliche Informationen über den Erfolg oder Misserfolg der Installation und kann Informationsmeldungen oder Fehlermeldungen enthalten, die von Junos PyEZ oder dem Gerät generiert werden. Zum Beispiel:
Package junos-install-mx-x86-64-17.2R1.13.tgz couldn't be copied
Die install()
Methode startet das Gerät nicht automatisch neu. Um das Gerät nach Abschluss der Installation neu zu starten oder herunterzufahren, rufen Sie die or-Methode shutdown()
bzw. aufreboot()
.
Das folgende Video zeigt eine kurze Python-Sitzung, in der veranschaulicht wird, wie Sie Junos PyEZ zur Installation von Junos OS verwenden.
Festlegen von Installations- und Prüfsummen-Timeouts
Junos PyEZ führt Vorgänge über eine NETCONF-Sitzung aus. Die Standardzeit für ein Timeout eines NETCONF-RPCs beträgt 30 Sekunden. Während des Installationsvorgangs erhöht Junos PyEZ das RPC-Timeout-Intervall beim Kopieren und Installieren des Pakets auf dem Gerät auf 1800 Sekunden (30 Minuten) und beim Berechnen der Prüfsumme auf 300 Sekunden (5 Minuten). In einigen Fällen kann der Installationsprozess oder die Prüfsummenberechnung diese Zeitintervalle überschreiten.
Um den Timeoutwert für den Installationsprozess und die Prüfsummenberechnung zu erhöhen, schließen Sie die timeout
Parameter und checksum_timeout
in den Aufruf der install()
Methode ein, und legen Sie sie auf die entsprechenden Werte fest. Zum Beispiel:
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()
So protokollieren Sie den Installationsprozess
Der Junos PyEZ-Installationsprozess ermöglicht es Ihnen, den Fortschritt der Installation anzuzeigen oder zu protokollieren, indem Sie das Argument progress
in den install()
Methodenaufruf aufnehmen. Das Argument wird auf eine Rückruffunktion festgelegt, für die ein Funktionsprototyp definiert sein muss, der die Instanz- und Berichtszeichenfolgenargumente Device
enthält. Sie können auch die Verwendung sw.progress()
für die grundlegende Berichterstellung festlegenprogress=True
.
Im folgenden Beispiel wird der Installationsfortschritt mithilfe der myprogress
Funktion ausgegeben.
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()
Die Fortschrittsausgabe erfolgt im benutzerdefinierten Format.
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' ... ...
Durchführen eines VM-Host-Upgrades
Auf Geräten mit Routing-Engines mit VM-Host-Unterstützung wird Junos OS als virtuelle Maschine (VM) über einen Linux-basierten Host (VM-Host) ausgeführt. Für ein Upgrade eines VM-Hosts ist ein VM-Host-Installationspaket (junos-vmhost-install-x.tgz) erforderlich, mit dem das Hostbetriebssystem und das kompatible Junos-Betriebssystem aktualisiert werden. Das Upgrade wird mit dem Befehl Betriebsmodus ausgeführt, der request vmhost software add
dem <request-vmhost-package-add>
RPC entspricht.
Ab Junos PyEZ, Version 2.1.6, unterstützt die sw.install()
Methode das vmhost=True
Argument zum Ausführen eines VM-Host-Upgrades. Wenn das Argument vmhost=True
vorhanden ist, führt die sw.install()
Methode die Installation mit dem <request-vmhost-package-add>
RPC anstelle des <request-package-add>
RPC aus.
Im folgenden Beispiel werden sowohl das Junos-Betriebssystem als auch das Hostbetriebssystem auf einem einzelnen Routing-Engine-Gerät aktualisiert und neu gestartet:
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)
Wenn Sie nur die Junos OS-Software neu starten möchten, rufen Sie die sw.reboot()
Methode ohne das vmhost
Argument auf.
So führen Sie eine einheitliche ISSU oder NSSU durch
Junos PyEZ bietet Unterstützung für die Durchführung eines einheitlichen In-Service-Software-Upgrades (Unified ISSU) oder eines Nonstop-Software-Upgrades (NSSU) auf Geräten, die die Funktion unterstützen und die erforderlichen Anforderungen erfüllen. Tabelle 2 beschreibt die Junos PyEZ-Version, in der die vereinheitlichten ISSU- und NSSU-Funktionen erstmals unterstützt werden. Weitere Informationen zu einheitlichem ISSU und NSSU finden Sie in der Softwaredokumentation für Ihr Produkt.
Junos PyEZ-Version |
Funktionsunterstützung |
---|---|
2.1.0 |
Unterstützung für einheitliche ISSU und NSSU auf Junos-Geräten mit dualer Routing-Engine. |
2.1.6 |
Unterstützung für Unified ISSU während eines VM-Host-Upgrades für Geräte mit VM-Host-Unterstützung, die den |
Die einheitliche ISSU-Funktion ermöglicht Ihnen ein Upgrade zwischen zwei verschiedenen Junos OS-Versionen ohne Unterbrechung auf der Steuerungsebene und mit minimaler Unterbrechung des Datenverkehrs. Um ein einheitliches In-Service-Softwareupgrade auf Geräten durchzuführen, die diese Funktion unterstützen, schließen Sie das Argument issu=True
in die install()
Methode ein.
Im folgenden Beispiel aktualisiert die install()
Methode Junos OS auf beiden Routing-Engines und startet die neue primäre Routing-Engine (zuvor die alte Backup-Routing-Engine) im Rahmen des Installationsvorgangs neu. Wenn die Installation erfolgreich ist, startet die reboot()
Methode das verbundene Routingmodul neu, bei dem es sich um das neue Backup-Routingmodul (zuvor das alte primäre Routingmodul) handelt.
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)
Um ein einheitliches In-Service-Softwareupgrade auf einer Routing-Engine mit VM-Host-Unterstützung durchzuführen, die die erforderlichen Anforderungen erfüllt und eine einheitliche ISSU unterstützt, schließen Sie die vmhost=True
Argumente and issu=True
in die install()
Methode ein. Das Gerät wird mithilfe des <request-vmhost-package-in-service-upgrade>
RPC von einem Hostbetriebssystem und einer Junos OS-Version auf die angeforderte Version aktualisiert.
sw.install(package='junos-vmhost-install-qfx-x86-64-18.1R1.9.tgz', vmhost=True, issu=True, progress=True)
Mit der NSSU-Funktion können Sie die Junos OS-Software, die auf einem Switch oder Virtual Chassis ausgeführt wird, mit redundanten Routing-Engines bei minimaler Unterbrechung des Netzwerkdatenverkehrs aktualisieren. Um ein unterbrechungsfreies Softwareupgrade auf Geräten durchzuführen, die diese Funktion unterstützen, schließen Sie das Argument nssu=True
in die install()
Methode ein. Zum Beispiel:
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)
So installieren Sie Software auf einem Virtual Chassis-Bauteil der EX-Serie
Wenn Sie ein Upgrade eines nicht gemischten Virtual Chassis der EX-Serie durchführen, befolgen Sie im Allgemeinen den Installationsprozess, der in der Übersicht über den Installationsprozess beschrieben ist, um das gesamte Virtual Chassis zu aktualisieren. Es kann jedoch vorkommen, dass Sie Software auf bestimmten Komponenten-Switches in einem virtuellen Chassis installieren müssen. Ab Junos PyEZ, Version 2.6.8, können Sie mithilfe des member_id
Arguments ein Softwarepaket auf einzelnen Member-Switches in einem Virtual Chassis der EX-Serie installieren. Das member_id
Argument ist eine Liste von Zeichenfolgen, die die Member-IDs angeben, auf denen die Software installiert werden soll.
Mit der folgenden Junos PyEZ-Anwendung wird beispielsweise die Software auf Bauteil 0 und Bauteil 1 im virtuellen Chassis der EX-Serie aktualisiert:
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 ...
Beispiel: Verwenden von Junos PyEZ zum Installieren von Software auf einem Junos-Gerät
Die Junos PyEZ-Bibliothek stellt Methoden zum Ausführen von Betriebs- und Konfigurationsaufgaben auf Junos-Geräten bereit. In diesem Beispiel wird beschrieben, wie Sie das Dienstprogramm Junos PyEZ jnpr.junos.utils.sw.SW
verwenden, um das Software-Image auf einem Junos-Gerät zu installieren oder zu aktualisieren.
- Anforderungen
- Überblick
- Konfiguration
- Ausführen der Junos PyEZ-Anwendung
- Verifizierung
- Fehlerbehebung
Anforderungen
In diesem Beispiel werden die folgenden Hardware- und Softwarekomponenten verwendet:
Konfigurationsverwaltungsserver mit Python 3.5 oder höher und Junos PyEZ Version 2.5 oder höher
Junos-Gerät mit aktiviertem NETCONF und einem mit den entsprechenden Berechtigungen konfigurierten Benutzerkonto
Öffentliches/privates SSH-Schlüsselpaar, das für den entsprechenden Benutzer auf dem Junos PyEZ-Server und dem Junos-Gerät konfiguriert ist
Überblick
Dieses Beispiel zeigt eine Python-Anwendung, die das Dienstprogramm Junos PyEZ SW
verwendet, um Junos OS auf dem angegebenen Gerät zu aktualisieren. In diesem Beispiel wird davon ausgegangen, dass sich das Softwareabbild auf dem lokalen Server befindet.
Die Anwendung importiert die Junos PyEZ-Klasse Device
, die die Verbindung mit dem Junos-Gerät verwaltet, die SW
Klasse, die zum Ausführen der Softwareinstallationsvorgänge auf dem Zielgerät verwendet wird, sowie erforderliche Ausnahmen aus dem jnpr.junos.exception
Modul, das Ausnahmen enthält, die bei der Verwaltung von Junos-Geräten auftreten. Die Anwendung importiert auch die os
Module , sys
und logging
Python, um die Existenz des Softwarepakets zu überprüfen und grundlegende Protokollierungsfunktionen auszuführen.
Die Anwendung definiert die update_progress()
Methode, die von der install()
Methode verwendet wird, um Berichte über den Fortschritt der Installation zu erstellen. Durch die Protokollierung des Installationsvorgangs können Sie den Punkt, an dem Fehler auftreten, leichter identifizieren. In diesem Beispiel werden Statusmeldungen an die Standardausgabe gesendet und auch in einer separaten Datei protokolliert.
Bevor eine Verbindung zum Gerät hergestellt und mit der Installation fortgefahren wird, überprüft die Anwendung zunächst, ob das Softwarepaket vorhanden ist. Wenn die Datei nicht gefunden werden kann, wird das Programm mit einer Fehlermeldung beendet. Wenn die Datei vorhanden ist, erstellt die Anwendung die Device
Instanz für das Zielgerät und ruft die open()
Methode auf, um eine Verbindung und eine NETCONF-Sitzung mit dem Gerät herzustellen.
Die Anwendung erstellt eine Instanz des SW
Dienstprogramms und verwendet die install()
Methode, um das Junos OS-Software-Image auf dem Zielgerät zu installieren. Die package
Variable definiert den Pfad auf dem lokalen Server zum neuen Junos OS-Image. Da der no_copy
Parameter standardmäßig auf "False" festgelegt ist, wird bei der Installation das Softwareabbild vom lokalen Server auf das Zielgerät kopiert. Die remote_path
Variable definiert den Pfad auf dem Zielgerät, auf den das Softwarepaket kopiert wird. Der Standardwert ist /var/tmp. Obwohl nicht erforderlich, wird der Parameter in diesem Beispiel aus Gründen der Übersichtlichkeit explizit konfiguriert.
Wenn die install()
Methode aufgerufen wird, führt die Anwendung Folgendes aus:
-
Berechnet die lokale MD5-Prüfsumme für das Software-Image
-
Führt eine Speicherbereinigung auf dem Zielgerät durch
-
Kopiert das Software-Image auf das Zielgerät
-
Berechnet die Remote-MD5-Prüfsumme und vergleicht sie mit dem lokalen Wert
-
Überprüft die Konfiguration anhand des neuen Images
-
Installiert das Paket
Wenn die Installation erfolgreich ist, ruft die Anwendung die reboot()
Methode auf, um das Gerät neu zu starten. Nach dem Ausführen der Installation ruft die Anwendung die close()
Methode zum Beenden der NETCONF-Sitzung und -Verbindung auf. Die Anwendung enthält Code zum Behandeln von Ausnahmen, die beim Herstellen einer Verbindung mit dem Gerät oder beim Ausführen der Installation auftreten können.
Konfiguration
Erstellen der Junos PyEZ-Anwendung
Schritt-für-Schritt-Anleitung
So erstellen Sie eine Python-Anwendung, die Junos PyEZ verwendet, um ein Software-Image auf einem Junos-Gerät zu installieren:
Importieren Sie alle erforderlichen Module, Klassen und Objekte.
import os, sys, logging from jnpr.junos import Device from jnpr.junos.utils.sw import SW from jnpr.junos.exception import ConnectError
Fügen Sie alle erforderlichen Variablen ein, die in diesem Beispiel den Hostnamen des verwalteten Geräts, den Softwarepaketpfad und die Protokolldatei enthalten.
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'
-
Definieren Sie die Protokollierungsmethode, die in der Anwendung und von der
install()
Methode verwendet wird.def update_progress(dev, report): # log the progress of the installing process logging.info(report)
Erstellen Sie eine Funktionsdefinition und einen
main()
Funktionsaufruf, und platzieren Sie die restlichen Anweisungen in der Definition.def main(): if __name__ == "__main__": main()
Initialisieren Sie die Protokollierungsinstanz.
# 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))
(Optional) Fügen Sie Code hinzu, der das Vorhandensein des Softwarepakets überprüft.
# verify package exists if not (os.path.isfile(package)): msg = 'Software package does not exist: {0}. '.format(package) logging.error(msg) sys.exit()
Erstellen Sie eine Instanz der
Device
Klasse, und geben Sie den Hostnamen und alle Parameter an, die für diese spezifische Verbindung erforderlich sind.Öffnen Sie dann eine Verbindung, und stellen Sie eine NETCONF-Sitzung mit dem Gerät her.
# 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
Erstellen Sie eine Instanz des
SW
Dienstprogramms.# Create an instance of SW sw = SW(dev)
Fügen Sie Code hinzu, um das Softwarepaket zu installieren und das Gerät neu zu starten, wenn die Installation erfolgreich ist.
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)
Beenden Sie die NETCONF-Sitzung, und beenden Sie die Verbindung mit dem Gerät.
# End the NETCONF session and close the connection dev.close()
Befund
Überprüfen Sie auf dem Konfigurationsverwaltungsserver die abgeschlossene Anwendung. Wenn die Anwendung nicht den gewünschten Code anzeigt, wiederholen Sie die Anweisungen in diesem Beispiel, um die Anwendung zu korrigieren.
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()
Ausführen der Junos PyEZ-Anwendung
Ausführen der Anwendung
-
Führen Sie die Anwendung auf dem Konfigurationsverwaltungsserver aus.
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) ...
Verifizierung
Überprüfen Sie die Installation
Zweck
Vergewissern Sie sich, dass die Softwareinstallation erfolgreich war.
Aktion
Weitere Informationen zur Installation finden Sie in den Statusmeldungen, die sowohl an die Standardausgabe als auch an die in der Anwendung definierte Protokolldatei gesendet werden. Ein Beispiel für die Ausgabe einer Protokolldatei ist hier dargestellt. Einige Ausgaben wurden der Kürze halber weggelassen.
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]
Bedeutung
Der Inhalt der Protokolldatei gibt an, dass das Image erfolgreich auf das Zielgerät kopiert und dort installiert wurde.
Fehlerbehebung
Beheben von Timeout-Fehlern
Problem
Die Anwendung generiert eine RpcTimeoutError-Meldung oder eine TimeoutExpiredError-Meldung, und die Installation schlägt fehl.
RpcTimeoutError(host: dc1a.example.com, cmd: request-package-validate, timeout: 1800)
Lange Vorgänge können das RPC-Timeoutintervall überschreiten, insbesondere auf langsameren Geräten, was zu einem Timeout des RPC führt, bevor der Vorgang abgeschlossen werden kann. Die Standardzeit für ein Timeout eines NETCONF-RPCs beträgt 30 Sekunden. Während des Installationsvorgangs erhöht Junos PyEZ das RPC-Timeout-Intervall auf 300 Sekunden (5 Minuten) bei der Berechnung der Prüfsumme und auf 1800 Sekunden (30 Minuten) beim Kopieren und Installieren des Pakets auf dem Gerät.
Lösung
Um Installations- oder Prüfsummenvorgänge zu berücksichtigen, die möglicherweise länger dauern als die standardmäßigen Installations- und Prüfsummen-Timeoutintervalle, legen Sie die Methode timeout
und checksum_timeout
die install
Parameter auf die entsprechenden Werte fest, und führen Sie die Anwendung erneut aus. Zum Beispiel:
sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=True, timeout=2400, checksum_timeout=400)
Tabelle "Änderungshistorie"
Die Funktionsunterstützung hängt von der Plattform und der Version ab, die Sie verwenden. Verwenden Sie den Feature-Explorer , um festzustellen, ob ein Feature auf Ihrer Plattform unterstützt wird.
install()
Methode ein Tupel zurück, das den Status der Installation und eine Meldungszeichenfolge enthält.