Junos PyEZ を使用して Junos デバイスにソフトウェアをインストールする
Junos PyEZ jnpr.junos.utils.sw.SW
ユーティリティを使用すると、Junos デバイスにソフトウェア イメージをインストールまたはアップグレードできます。 install()
メソッドは、指定されたソフトウェア パッケージをインストールします。
このトピックでは、サポートされている導入シナリオ、ソフトウェア イメージの場所を指定する方法、Junos PyEZ を使用してデバイスをアップグレードする際の一般的なインストール プロセスとオプションについて説明します。また、Junos PyEZを使用して、VMホストのアップグレード、統合型ISSU(統合型インサービスソフトウェアアップグレード)、またはこれらの機能をサポートするデバイス上でノンストップソフトウェアアップグレード(NSSU)など、より専門的なアップグレードシナリオを実行する方法についても説明します。
サポートされている導入シナリオ
Junos PyEZ jnpr.junos.utils.sw.SW
ユーティリティを使用すると、個々のJunosデバイスまたは混合または非混合バーチャルシャーシのメンバーにソフトウェアイメージをインストールまたはアップグレードできます。次のシナリオがサポートされています。
-
単一のルーティングエンジンを持つスタンドアロンデバイス
-
デュアルルーティングエンジンを搭載したスタンドアロンデバイス
-
EXシリーズバーチャルシャーシ(混合モードおよび非混合モード構成)
-
QFXシリーズバーチャルシャーシ(混合モードおよび非混合モード構成)
-
EXシリーズとQFXシリーズの混合バーチャルシャーシ
-
VMホストをサポートするルーティングエンジンでのVMホストのアップグレード
-
統合型ISSUやNSSUなど、 何らかの形式のインサービス 機能が有効になっている展開構成
Junos PyEZリリース2.6.8以降、 member_id
引数を使用してEXシリーズバーチャルシャーシの特定のメンバーにパッケージをインストールできるようになりました。
jnpr.junos.utils.sw.SW
ユーティリティは、MXシリーズ仮想シャーシ、SRXシリーズシャーシクラスター、または仮想シャーシファブリック(VCF)内のデバイスのアップグレードをサポートしていません。
ソフトウェア イメージの場所を指定する方法
Junos PyEZを使用してJunosデバイスにソフトウェアをインストールする場合、ソフトウェアイメージを構成管理サーバーにダウンロードできます。デフォルトでは、 install()
方法でインストールを実行する前にターゲットデバイスにコピーされます。また、ターゲット デバイスに既に存在するイメージ、またはターゲット デバイスから到達可能な URL に存在するイメージをインストールするように、 install()
メソッドに指示することもできます。
表 1 に、ソフトウェア パッケージの場所に応じて設定する必要がある install()
メソッド パラメーターの概要を示します。install()
メソッドの呼び出しには、常に package
パラメーターまたは pkg_set
パラメーターのいずれかを含める必要があります。
ソフトウェア パッケージの場所 |
|
|
|
---|---|---|---|
構成管理サーバー |
省略または に設定 |
Junos PyEZを実行しているローカルサーバー上のソフトウェアパッケージのファイル名を含むファイルパス。 |
(オプション)パッケージのコピー先となるターゲット デバイス上のディレクトリへのパス。デフォルトは /var/tmp です。 |
ターゲットデバイス |
に設定: |
ソフトウェアパッケージのファイル名。 |
(オプション)パッケージが既に存在している必要があるターゲットデバイス上のディレクトリへのパス。デフォルトは /var/tmp です。 |
URL |
– |
ソフトウェア パッケージのインストール元の Junos デバイスから見た URL。 |
– |
package
引数は、単一のJunosデバイスまたは非混在バーチャルシャーシのメンバーにソフトウェアをインストールするために使用されます。package
引数は、単一のソフトウェア イメージを指定する文字列です。例えば:
package = 'jinstall-13.3R1.8-domestic-signed.tgz'
pkg_set
引数は、混在するバーチャルシャーシのメンバーにソフトウェアをインストールするために使用されます。これには、さまざまなバーチャルシャーシメンバーに必要なソフトウェアイメージを順不同で指定する文字列のリストまたはタプルが含まれています。例えば:
pkg_set=['jinstall-qfx-5-13.2X51-D35.3-domestic-signed.tgz', 'jinstall-ex-4300-13.2X51-D35.3-domestic-signed.tgz']
Junos PyEZを実行しているローカルサーバーに存在するパッケージの場合、no_copy
引数を省略するか、False
に設定すると、サーバーは指定されたソフトウェアパッケージをデバイスにコピーします。package
引数を含めると、サーバーはパッケージをターゲットデバイス(混合されていないバーチャルシャーシの個々のデバイスまたはプライマリルーターまたはスイッチ)にコピーします。pkg_set
引数を含めると、サーバーはリスト内のすべてのパッケージを混合バーチャルシャーシのプライマリルーターまたはスイッチにコピーします。デフォルトでは、ソフトウェアイメージは remote_path
引数で別のディレクトリが指定されていない限り、/var/tmp ディレクトリに配置されます。
no_copy
引数をTrueに設定した場合、インストールを開始する前に、必要なソフトウェア パッケージがターゲット デバイスまたはバーチャル シャーシ プライマリ デバイスにすでに存在している必要があります。パッケージは、remote_path
引数で指定されたディレクトリ、またはremote_path
省略した場合はデフォルトの /var/tmp ディレクトリに存在する必要があります。
Junos PyEZは、URLからのソフトウェアイメージのインストールもサポートしています。この場合、 package
または pkg_set
値は、ターゲットのJunosデバイスから見たURLでなければなりません。指定した URL からパッケージがコピーされてインストールされ、 no-copy
引数と remote_path
引数は無視されます。URL の形式の指定については、 Junos OS CLI コマンドでファイル名と URL を指定するための形式を参照してください。
インストール プロセスの概要
Junosデバイスにソフトウェア イメージをインストールするには、Junos PyEZアプリケーションが個々のデバイスまたはバーチャルシャーシ内のプライマリデバイスに接続し、 SW
ユーティリティのインスタンスを作成し、必須またはオプションの引数を指定して install()
メソッドを呼び出します。例えば:
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()
install()
メソッドパラメータの現在のリストについては、install() を参照してください。
ソフトウェア パッケージが構成管理サーバー上にあり、 no_copy
パラメーターが省略されているか False に設定されている場合、 install()
メソッドはソフトウェアをインストールする前に次の操作を実行します。
-
checksum
引数でチェックサムが指定されていない場合は、checksum_algorithm
引数で指定されたアルゴリズムを使用して、ローカル ソフトウェア パッケージのチェックサムを計算します。許容されるchecksum_algorithm
値は、"md5"
、"sha1"
、および"sha256"
です。デフォルトは"md5"
です。 -
ターゲット デバイスで記憶域のクリーンアップを実行して、ソフトウェア パッケージ用の領域を作成します(
cleanfs
がFalse
に設定されていない場合)。 -
SCP または FTP は、パッケージを
remote_path
ディレクトリにコピーします。remote_path
が指定されていない場合は、/ var/tmp ディレクトリにコピーします(同じ名前とチェックサムを持つファイルがデバイス上のターゲットの場所にまだ存在しない場合)。 -
リモート・ファイルのチェックサムを計算し、ローカル・ファイルの値と比較します。
ソフトウェア パッケージがターゲット デバイスにインストールされると、最初にダウンロードされたか、 install()
メソッドによって構成管理サーバーからコピーされたか、ターゲット デバイスによって URL からコピーされたかに関係なく、 install()
メソッドは次の操作を実行します。
-
validate
パラメーターが True に設定されている場合、新しいパッケージに対して構成を検証します。 -
all_re
に設定されていない限り、すべてのルーティングエンジンに パッケージをインストールします。False
リリース2.1.5以降、Junos PyEZは、デフォルトで、バーチャルシャーシ内の個々のデバイスとメンバー上のすべてのルーティングエンジンをアップグレードします。以前のリリース、または all_re=False
の場合、Junos PyEZは接続先のルーティングエンジンのみをアップグレードします。
Junos PyEZ リリース 2.5.0 以降、 install()
メソッドはインストールのステータスとメッセージ文字列を含むタプルを返します。以前のリリースでは、このメソッドはインストールのステータスのみを返します。状態は、インストールが成功した場合は True
、それ以外の場合は False
です。メッセージ文字列は、インストールの成功または失敗に関する追加情報を提供し、Junos PyEZ またはデバイスによって生成される情報メッセージまたはエラーメッセージを含めることができます。例えば:
Package junos-install-mx-x86-64-17.2R1.13.tgz couldn't be copied
install()
方法では、デバイスは自動的に再起動されません。インストールの完了後にデバイスを再起動またはシャットダウンするには、それぞれ reboot()
メソッドまたは shutdown()
メソッドを呼び出します。
次のビデオは、Junos PyEZを使用してJunos OSをインストールする方法を示す短いPythonセッションを紹介しています。
インストールとチェックサムのタイムアウトを指定する方法
Junos PyEZは、NETCONFセッションを介して操作を実行します。NETCONF RPCがタイムアウトするデフォルトの時間は30秒です。インストール プロセス中、Junos PyEZ は、デバイスにパッケージをコピーしてインストールする場合、RPC タイムアウト間隔を 1800 秒 (30 分)、チェックサムを計算する場合は 300 秒 (5 分) に延長します。場合によっては、インストール プロセスまたはチェックサム計算がこれらの時間間隔を超えることがあります。
インストール プロセスとチェックサム計算のタイムアウト値を増やすには、install()
メソッドの呼び出しにそれぞれ timeout
パラメーターと checksum_timeout
パラメーターを含め、適切な値に設定します。例えば:
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()
インストール プロセスをログに記録する方法
Junos PyEZのインストールプロセスでは、install()
メソッド呼び出しにprogress
引数を含めることで、インストールの進行状況を表示またはログに記録することができます。引数はコールバック関数に設定され、Device
インスタンス引数とレポート文字列引数を含む関数プロトタイプが定義されている必要があります。基本的なレポートに sw.progress()
を使用するように progress=True
を設定することもできます。
次の例では、 myprogress
関数を使用してインストールの進行状況を出力します。
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()
進行状況の出力は、ユーザー定義の形式です。
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' ... ...
VM ホストのアップグレードを実行する方法
VMホストに対応したルーティングエンジンを搭載したデバイスでは、Junos OSはLinuxベースのホスト(VMホスト)上で仮想マシン(VM)として動作します。VMホストのアップグレードには、VMホストインストールパッケージ(junos-vmhost-install-x.tgz)が必要であり、ホストOSと互換性のあるJunos OSがアップグレードされます。アップグレードは、<request-vmhost-package-add>
RPCに対応するrequest vmhost software add
運用モードコマンドを使用して実行されます。
Junos PyEZ リリース 2.1.6 以降、sw.install()
メソッドは、VM ホストのアップグレードを実行するための vmhost=True
引数をサポートしています。vmhost=True
引数が存在する場合、sw.install()
メソッドは、<request-package-add>
RPC ではなく<request-vmhost-package-add>
RPC を使用してインストールを実行します。
次の例では、単一のルーティングエンジンデバイス上でJunos OSとホストOSの両方をアップグレードおよび再起動します。
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)
Junos OS ソフトウェアのみを再起動するには、vmhost
引数を指定せずに sw.reboot()
メソッドを呼び出します。
統合 ISSU または NSSU を実行する方法
Junos PyEZは、統合型インサービスソフトウェアアップグレード(統合型ISSU)またはノンストップソフトウェアアップグレード(NSSU)を、その機能をサポートし、必要な要件を満たすデバイス上で実行するためのサポートを提供します。 表 2 は、統合 ISSU および NSSU 機能が最初にサポートされる Junos PyEZ リリースの概要を示しています。統合型 ISSU および NSSU の詳細については、ご使用の製品のソフトウェア マニュアルを参照してください。
Junos PyEZリリース |
機能のサポート |
---|---|
2.1.0 |
デュアル ルーティング エンジン Junos デバイスでの統合型 ISSU および NSSU のサポート。 |
2.1.6 |
|
統合型ISSU機能により、コントロールプレーンを中断することなく、トラフィックの中断を最小限に抑えながら、2つの異なるJunos OSリリース間でアップグレードできます。この機能をサポートするデバイスで統合インサービス ソフトウェア アップグレードを実行するには、install()
メソッドに issu=True
引数を含めます。
次の例では、 install()
方法で、インストール プロセスの一環として、両方のルーティング エンジンで Junos OS をアップグレードし、新しいプライマリ ルーティング エンジン(以前の古いバックアップ ルーティング エンジン)を再起動します。インストールが成功すると、 reboot()
方法では、新しいバックアップ ルーティング エンジン(以前のプライマリ ルーティング エンジン)である接続されたルーティング エンジンが再起動されます。
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)
必要な要件を満たし、統合型ISSUをサポートするVMホストサポート付きルーティングエンジンで、統合インサービスソフトウェアアップグレードを実行するには、install()
メソッドにvmhost=True
引数とissu=True
引数を含めます。デバイスは、<request-vmhost-package-in-service-upgrade>
RPCを使用して、1つのホストOSおよびJunos OSリリースから要求されたリリースにアップグレードします。
sw.install(package='junos-vmhost-install-qfx-x86-64-18.1R1.9.tgz', vmhost=True, issu=True, progress=True)
NSSU機能を使用すると、ネットワークトラフィックの中断を最小限に抑えながら、スイッチまたはバーチャルシャーシで実行されているJunos OSソフトウェアを冗長ルーティングエンジンでアップグレードできます。この機能をサポートするデバイスでノンストップ ソフトウェア アップグレードを実行するには、install()
メソッドに nssu=True
引数を含めます。例えば:
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)
EXシリーズのバーチャルシャーシメンバーにソフトウェアをインストールする方法
通常、混在していないEXシリーズの仮想シャーシをアップグレードする場合は、 インストールプロセスの概要 で説明されているインストールプロセスに従って、仮想シャーシ全体をアップグレードします。ただし、バーチャル シャーシ内の特定のメンバー スイッチにソフトウェアをインストールしなければならない場合もあります。Junos PyEZリリース2.6.8以降、 member_id
引数を使用して、EXシリーズ仮想シャーシの個々のメンバースイッチにソフトウェアパッケージをインストールできます。 member_id
引数は、ソフトウェアをインストールするメンバー ID を指定する文字列のリストです。
例えば、次のJunos PyEZアプリケーションは、EXシリーズバーチャルシャーシのメンバー0とメンバー1のソフトウェアをアップグレードします。
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 ...
例:Junos PyEZ を使用した Junos デバイスへのソフトウェアのインストール
Junos PyEZライブラリは、Junosデバイスで運用タスクや設定タスクを実行するためのメソッドを提供します。この例では、Junos PyEZ jnpr.junos.utils.sw.SW
ユーティリティを使用して、Junos デバイスにソフトウェア イメージをインストールまたはアップグレードする方法について説明します。
必要条件
この例では、以下のハードウェアとソフトウェアのコンポーネントを使用しています。
Python 3.5 以降および Junos PyEZ リリース 2.5 以降を実行する構成管理サーバー
NETCONFが有効で、適切な権限で設定されたユーザーアカウントを備えたJunosデバイス
Junos PyEZ サーバーと Junos デバイス上の適切なユーザーに対して構成された SSH 公開鍵と秘密鍵のペア
概要
この例では、Junos PyEZ SW
ユーティリティを使用して、指定されたデバイスのJunos OSをアップグレードするPythonアプリケーションを紹介します。この例では、ソフトウェア イメージがローカル サーバに存在することを前提としています。
本製品は、Junos デバイスとの接続を処理する Junos PyEZ Device
クラス、ターゲットデバイスへのソフトウェアインストール操作を実行するために使用される SW
クラス、 jnpr.junos.exception
モジュールからの必須例外(Junos デバイスの管理時に発生する例外を含む例外)をインポートします。アプリケーションは、ソフトウェアパッケージの存在を検証し、基本的なロギング機能を実行するために、 os
、 sys
、および logging
Pythonモジュールもインポートします。
アプリケーションは、インストールの進行状況を報告するために install()
メソッドによって使用される update_progress()
メソッドを定義します。インストール プロセスをログに記録することで、障害が発生したポイントをより簡単に特定できます。この例では、進行メッセージは標準出力に送信され、別のファイルにも記録されます。
デバイスに接続してインストールを続行する前に、アプリケーションはまずソフトウェアパッケージが存在することを確認します。ファイルが見つからない場合、アプリケーションはエラー メッセージを表示して終了します。ファイルが存在する場合、アプリケーションはターゲットデバイスの Device
インスタンスを作成し、 open()
メソッドを呼び出してデバイスとの接続とNETCONFセッションを確立します。
アプリケーションは、 SW
ユーティリティのインスタンスを作成し、 install()
メソッドを使用して、ターゲット デバイスに Junos OS ソフトウェア イメージをインストールします。 package
変数は、新しい Junos OS イメージへのローカル サーバー上のパスを定義します。 no_copy
パラメータのデフォルトは False であるため、インストール プロセスによってソフトウェア イメージがローカル サーバからターゲット デバイスにコピーされます。 remote_path
変数は、ソフトウェア パッケージのコピー先のターゲット デバイス上のパスを定義します。デフォルトは /var/tmp です。必須ではありませんが、この例ではわかりやすくするためにパラメーターを明示的に構成しています。
install()
メソッドが呼び出されると、アプリケーションは次の処理を行います。
-
ソフトウェア イメージのローカル MD5 チェックサムを計算します。
-
ターゲット デバイスで記憶域のクリーンアップを実行します。
-
ソフトウェア イメージをターゲット デバイスにコピーします。
-
リモート MD5 チェックサムを計算し、ローカル値と比較します。
-
新しいイメージに対して構成を検証します。
-
パッケージをインストールします。
インストールが成功すると、アプリケーションは reboot()
メソッドを呼び出してデバイスを再起動します。インストールの実行後、アプリケーションは close()
メソッドを呼び出して、NETCONF セッションと接続を終了します。アプリケーションには、デバイスへの接続時またはインストールの実行時に発生する可能性のある例外を処理するためのコードが含まれています。
構成
Junos PyEZアプリケーションを作成する
手順
Junos PyEZ を使用して Junos デバイスにソフトウェア イメージをインストールする Python アプリケーションを作成するには、次の手順に従います。
必要なモジュール、クラス、およびオブジェクトをインポートします。
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'
-
アプリケーション内および
install()
メソッドで使用されるログ記録方法を定義します。def update_progress(dev, report): # log the progress of the installing process logging.info(report)
main()
関数定義と関数呼び出しを作成し、残りのステートメントを定義内に配置します。def main(): if __name__ == "__main__": 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()
Device
クラスのインスタンスを作成し、ホスト名とその特定の接続に必要なパラメーターを指定します。次に、接続を開き、デバイスとのNETCONFセッションを確立します。
# 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
SW
ユーティリティのインスタンスを作成します。# 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)
NETCONF セッションを終了し、デバイスとの接続を閉じます。
# End the NETCONF session and close the connection dev.close()
業績
構成管理サーバーで、完成したアプリケーションを確認します。アプリケーションに目的のコードが表示されない場合は、この例の手順を繰り返してアプリケーションを修正します。
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()
Junos PyEZ アプリケーションの実行
アプリケーションの実行
-
構成管理サーバーで、アプリケーションを実行します。
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) ...
検証
インストールの確認
目的
ソフトウェアが正常にインストールされたことを確認します。
アクション
インストールの詳細については、標準出力とアプリケーションで定義されているログ・ファイルの両方に送信される進行状況メッセージを確認します。ログ ファイルの出力例を次に示します。簡潔にするために、一部の出力は省略されています。
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]
意味
ログ ファイルの内容は、イメージがターゲット デバイスに正常にコピーされ、インストールされたことを示します。
トラブルシューティング
タイムアウトエラーのトラブルシューティング
問題
アプリケーションは、RpcTimeoutエラー メッセージまたはタイムアウト期限切れエラー メッセージを生成し、インストールは失敗します。
RpcTimeoutError(host: dc1a.example.com, cmd: request-package-validate, timeout: 1800)
特に低速のデバイスでは、長い操作が RPC タイムアウト間隔を超え、操作が完了する前に RPC がタイムアウトする可能性があります。NETCONF RPCがタイムアウトするデフォルトの時間は30秒です。インストールプロセス中、Junos PyEZは、チェックサムを計算するときにRPCタイムアウト間隔を300秒(5分)、デバイスにパッケージをコピーしてインストールするときに1800秒(30分)に増やします。
解決
既定のインストールおよびチェックサムのタイムアウト間隔よりも長い時間がかかる可能性があるインストール操作またはチェックサム操作に対応するには、 install
メソッド timeout
パラメーターと checksum_timeout
パラメーターを適切な値に設定し、アプリケーションを再実行します。例えば:
sw.install(package=package, remote_path=remote_path, progress=update_progress, validate=True, timeout=2400, checksum_timeout=400)
変更履歴テーブル
機能のサポートは、使用しているプラットフォームとリリースによって決まります。 機能エクスプローラー を使用して、機能がプラットフォームでサポートされているかどうかを判断します。
install()
メソッドはインストールのステータスとメッセージ文字列を含むタプルを返します。