このページの内容
gNOIオペレーティングシステム(OS)サービス
gNOIオペレーティングシステム(OS)サービスを使用して、ターゲットネットワークデバイス上のソフトウェアをアップグレードします。
gNOI OS サービスを使用して、ターゲットデバイス上のソフトウェアをアップグレードできます。プロト定義ファイルは https://github.com/openconfig/gnoi/blob/master/os/os.proto にあります。
ソフトウェアインストールには、 OS サービスRPCに対応する3つの主要な手順があります。
- インストール
- アクティブにする
- 検証
OSサービスRPCを使用して、ソフトウェアインストールパッケージをデバイスに転送し、指定したソフトウェアバージョンに対して設定を検証し、ソフトウェアをインストールできます。インストールされているソフトウェアバージョンを次のブートバージョンとして設定し、ソフトウェアバージョンを確認することもできます。
RPCSetPackage()gNOIsystemサービスを使用して、デバイスにソフトウェアをインストールすることもできます。詳細については、gNOIシステムサービスを参照してください。
サポートされているRPC
| RPC | 説明 | リリースで導入 |
|---|---|---|
Activate() |
次回の再起動時に使用するソフトウェアバージョンを設定します。
注:
Junosデバイスは、
注:
Junos OS Evolved リリース 25.2R1 より前は、 |
Junos OS Evolved 22.2R1 |
Install() |
ソフトウェアインストールパッケージをターゲットに転送し、ソフトウェアに対する設定を検証し、ソフトウェアをインストール(ステージング)します。 指定したソフトウェアイメージがデバイスに既にインストールされている場合は、現在の設定をソフトウェアイメージと照らし合わせて検証し、検証済みの設定をそのソフトウェアバージョンに関連付けられた実行中の設定として保存します。
注:
Junosデバイスは、
注:
Junos OS Evolvedリリース25.2R1より前は、 |
Junos OS Evolved 22.2R1 |
Verify() |
実行中のソフトウェアのバージョンを確認してください。このRPCは、ターゲットが成功するまで起動中に複数回呼び出されることがあります。
注:
Junosデバイスは、VerifyResponseの |
Junos OS Evolved 22.2R1 |
OSサービス概要
gNOI OS サービスRPCにより、Junos OS Evolvedを実行しているデバイス上でソフトウェアを管理できます。Junos OS Evolvedは、ストレージメディアに複数のバージョンのソフトウェアを保存します。ソフトウェアバージョンごとに、ソフトウェアバージョンが最後に実行された時点で実行されていた設定もJunos OS保存します。
表2は 、さまざまなJunos OS EvolvedリリースでのRPC操作の概要を示しています。Junos OS Evolvedリリース25.2R1以降、すぐにアクティブ化せずにソフトウェアをインストールし、インストールされているソフトウェアバージョンに対して現在の設定を検証し、インストールされているソフトウェアバージョンをアクティブ化できます。
| RPC |
Junos OS Evolvedリリース24.4R1およびそれ以前 |
Junos OS Evolvedリリース25.2R1およびそれ以降 |
|---|---|---|
|
|
ソフトウェアインストールパッケージをデバイスに転送します。 |
ソフトウェアインストールパッケージをデバイスに転送します。 |
| – | 指定されたソフトウェアバージョン(新規または以前にインストール済み)に対して現在の設定を検証します。 |
|
| – | 指定したソフトウェアバージョンがまだインストールされていない場合は、ソフトウェアをインストールします。 |
|
| – | 検証済みの現在のコンフィギュレーションを、指定されたソフトウェアバージョンに関連付けられた実行中のコンフィギュレーションとして保存します。 |
|
|
|
指定されたソフトウェアバージョンに対して現在の設定を検証します。 |
– |
| ソフトウェアをインストールします。 |
– | |
| 指定されたソフトウェアバージョンを次のブートバージョンとして設定します。 |
指定されたソフトウェアバージョンを次のブートバージョンとして設定します。 |
|
| (オプション)デバイスを再起動します。 |
(オプション)デバイスを再起動します。 |
|
|
|
実行中のソフトウェアのバージョンを確認してください。 |
実行中のソフトウェアのバージョンを確認してください。 |
Junos OS Evolvedリリース25.2R1以降では、 Install() RPCは、指定されたソフトウェアインストールパッケージをターゲットデバイスの /var/tmp/ ディレクトリに転送し、ソフトウェアに対する設定を検証して、ソフトウェアバージョンがデバイスにまだインストールされていない場合はソフトウェアをインストールします。宛先ファイル名は、 TransferRequest メッセージの version フィールドで定義された値です。 Activate() RPCは、指定されたソフトウェアバージョンを次のブートバージョンとして設定し、オプションでデバイスを再起動してソフトウェアをアクティブ化します。インストールされている任意のバージョンのソフトウェアをアクティブ化できます。
Install()を実行して既存のソフトウェアバージョンを指定した場合、Install()は現在の設定をソフトウェアと照合して検証し、検証済みの設定をそのソフトウェアバージョンに関連付けられた実行中の設定として保存します。ソフトウェアバージョンが次のブートバージョンに設定されている場合、Install()はその過程でそれを非アクティブ化します。したがって、特定のソフトウェアバージョンが最近の設定変更で動作することを確認できます。
ネットワークデバイスの設定
始める前に:
- gRPCサービスを設定するの説明に従って、ネットワークデバイス上でgRPCサービスを設定します。
- gNOIサービスを設定するで説明されているように、gNOI操作をサポートするようにネットワーク管理システムを構成します。
OSサービスRPCを使用するために追加の設定は必要ありません。
例:インストールとアクティブ化
この例では、クライアントは gnoi_os_install_activate.py Pythonアプリケーションを実行し、以下の操作を実行します。
-
ローカルネットワーク管理システムからネットワークデバイスにソフトウェアパッケージをコピーします。
-
ソフトウェアイメージに対して設定を検証します。
-
ネットワークデバイスにパッケージをインストールします。
-
ネットワークデバイスを再起動して、新しいソフトウェアイメージをアクティブにします。
アプリケーションは、InstallRequest() メッセージを使用して Install() RPC を呼び出して、ファイルを転送します。アプリケーションは、転送完了間隔が 10% ごとに進行状況メッセージを発行することで、ファイル転送の進行状況を追跡します。ファイル転送が成功すると、システムはソフトウェアイメージに対して設定を検証し、ストレージクリーンアップを実行して、イメージをインストールします。次に、アプリケーションは Activate() RPC を呼び出して、新しいイメージを次のブート イメージとして設定し、ターゲットを再起動します。
アプリケーションは、チャネルを確立するための grpc_channel モジュールをインポートします。 grpc_channel モジュールについては、 gNOIサービスの設定で説明しています。アプリケーションの引数は args_os_install_activate.txt ファイルに格納されます。アプリケーションファイルと引数ファイルは次のとおりです。
gnoi_os_install_activate.py
"""gRPC gNOI OS Install, Activate utility."""
from __future__ import print_function
import argparse
import logging
import os
from functools import partial
from getpass import getpass
import os_pb2
import os_pb2_grpc
from grpc_channel import grpc_authenticate_channel_mutual
MAX_BYTES = 65536
def get_args(parser):
parser.add_argument('--server',
dest='server',
type=str,
default='localhost',
help='Server IP or name. Default is localhost')
parser.add_argument('--port',
dest='port',
nargs='?',
type=int,
default=32767,
help='The server port. Default is 32767')
parser.add_argument('--client_key',
dest='client_key',
type=str,
default='',
help='Full path of the client private key. Default ""')
parser.add_argument('--client_cert',
dest='client_cert',
type=str,
default='',
help='Full path of the client certificate. Default ""')
parser.add_argument('--root_ca_cert',
dest='root_ca_cert',
required=True,
type=str,
help='Full path of the Root CA certificate.')
parser.add_argument('--user_id',
dest='user_id',
required=True,
type=str,
help='User ID for RPC call credentials.')
parser.add_argument('--no_reboot',
dest='no_reboot',
type=int,
default=0,
help='Reboot immediately or not. Default 0 (Reboot immediately)')
parser.add_argument('--source_package',
dest='source_package',
type=str,
default='',
help='Full path of the install file. Default ""')
parser.add_argument('--timeout',
dest='timeout',
type=int,
default=600,
help='Timeout in seconds. Default 600')
parser.add_argument('--version',
dest='version',
type=str,
default='',
help='Software version. Default is ""')
args = parser.parse_args()
return args
def send_rpc(channel, metadata, args):
print("Executing GNOI::OS::Install")
stub = os_pb2_grpc.OSStub(channel)
it = []
# Create file transfer request
req = os_pb2.InstallRequest()
req.transfer_request.version = args.version
it.append(req)
# Read source package and add to request
source_package_bytes = os.path.getsize(args.source_package)
with open(args.source_package, "rb") as file:
# Read data in 64 KB chunks and calculate checksum and data messages
for data in iter(partial(file.read, MAX_BYTES), b''):
req = os_pb2.InstallRequest()
req.transfer_content = data
it.append(req)
req = os_pb2.InstallRequest()
req.transfer_end.SetInParent()
it.append(req)
next_pct = 0
transfer_percent = 0
validated = False
activated = False
try:
responses = stub.Install(
iter(it), metadata=metadata, timeout=args.timeout)
print("OS Install start\n")
for response in responses:
rsp_type = response.WhichOneof('response')
if rsp_type == 'install_error':
print("%s: %s -- %s\n" % (rsp_type,
response.install_error.type, response.install_error.detail))
raise Exception("Install Error")
elif rsp_type == 'transfer_ready':
print("%s: %s\n" % (rsp_type, response.transfer_ready))
elif rsp_type == 'transfer_progress':
transfer_percent = int(float(
response.transfer_progress.bytes_received) / float(source_package_bytes) * 100)
if 0 == (transfer_percent % 10) and transfer_percent != next_pct:
next_pct = transfer_percent
print("Transfer percent complete: %s%%" % transfer_percent)
logging.info('Transferring file %s%%', transfer_percent)
elif rsp_type == 'validated':
print("%s: %s -- %s\n" % (rsp_type,
response.validated.version, response.validated.description))
logging.info('Validated: %s', response.validated.version)
validated = True
if transfer_percent > 0 and validated:
print("Executing GNOI::OS::Activate")
req = os_pb2.ActivateRequest()
req.version = args.version
req.no_reboot = args.no_reboot
activate_response = stub.Activate(
req, metadata=metadata, timeout=args.timeout)
rsp_type = activate_response.WhichOneof('response')
if rsp_type == 'activate_ok':
activated = True
except Exception as e:
logging.error('Error installing package: %s', e)
print(e)
else:
if activated:
logging.info('Installation complete: %s', args.version)
print('Installation complete for %s' % args.version)
def main():
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
args = get_args(parser)
grpc_server_password = getpass("gRPC server password for executing RPCs: ")
metadata = [('username', args.user_id),
('password', grpc_server_password)]
try:
# Establish grpc channel to network device
channel = grpc_authenticate_channel_mutual(
args.server, args.port, args.root_ca_cert, args.client_key, args.client_cert)
response = send_rpc(channel, metadata, args)
except Exception as e:
logging.error('Received error: %s', e)
print(e)
if __name__ == '__main__':
logging.basicConfig(filename='gnoi-install.log',
format='%(asctime)s %(levelname)-8s %(message)s',
level=logging.INFO,
datefmt='%Y-%m-%d %H:%M:%S')
main()
args_os_install_activate.txt
--root_ca_cert=/etc/pki/certs/serverRootCA.crt --client_key=/home/lab/certs/client.key --client_cert=/home/lab/certs/client.crt --server=10.53.52.169 --port=32767 --user_id=gnoi-user --source_package=/home/lab/images/junos-evo-install-ptx-x86-64-25.2R1.9-EVO.iso --timeout=1800 --version=25.2R1.9-EVO
Junos OS Evolvedリリース23.4R1以降、Activate()、Install()、およびVerify()RPCのversionフィールドは、パッケージ名ではなくソフトウェアバージョン文字列(/system/state/software-versionで表示)を使用するようになりました。
アプリケーションの実行
クライアントがアプリケーションを実行すると、アプリケーションはローカルデバイスからネットワークデバイスの /var/tmp ディレクトリにパッケージをコピーし、パッケージをインストールしてから、デバイスを再起動してインストールを完了します。
lab@gnoi-client:~/src/gnoi/proto$ python3 gnoi_os_install_activate.py @args_os_install_activate.txt gRPC server password for executing RPCs: Creating channel Executing GNOI::OS::Install OS Install start transfer_ready: Transfer percent complete: 10% Transfer percent complete: 20% Transfer percent complete: 30% Transfer percent complete: 40% Transfer percent complete: 50% Transfer percent complete: 60% Transfer percent complete: 70% Transfer percent complete: 80% Transfer percent complete: 90% Transfer percent complete: 100% validated: 25.2R1.9-EVO -- Use Activate to set the next boot Image Executing GNOI::OS::Activate Installation complete for 25.2R1.9-EVO
変更履歴テーブル
サポートされる機能は、使用しているプラットフォームとリリースによって決まります。 機能エクスプローラー を使用して、機能がお使いのプラットフォームでサポートされているかどうかを確認します。
Install() RPCはソフトウェアインストールパッケージをデバイスにコピーし、指定されたソフトウェアバージョンに対して設定を検証してソフトウェアをインストールし、
Activate() RPCは指定されたソフトウェアバージョンを次のブートバージョンとして設定します。以前のリリースでは、
Install() がソフトウェア インストール パッケージをデバイスにコピーし、
Activate() がソフトウェアに対して設定を検証し、ソフトウェアをインストールして、ソフトウェア バージョンを次のブート バージョンとして設定していました。
Install() RPCを実行して、現在の設定をソフトウェアイメージに対して検証し、検証済みの設定をそのソフトウェアバージョンに関連付けられた実行中の設定として保存することができます。
Activate()、
Install()、および
Verify() RPC の
version フィールドには、パッケージ名ではなくソフトウェアバージョン文字列(
/system/state/software-version で表示)が使用されるようになりました。