構成ファイルの作成
ビジネスニーズに基づいて、構成ファイルやスクリプトファイルを使用して ZTP プロセスを開始できます。
(注) |
ZTP のソースとして USB フラッシュドライブを使用する場合、スクリプトファイルはプロビジョニングに使用できません。スクリプトファイルは、USB フェッチャではサポートされていません。フェッチャでは、 |
構成ファイルの内容は !! IOS XR で始まり、スクリプトファイルの内容は #! /bin/bash、#! /bin/sh または #!/usr/bin/python で始まります。
コンフィギュレーション ファイルを作成したら、ztp_helper 関数 xrapply を使用してデバイスに適用します。
次に、構成ファイルの例を示します。
!! IOS XR
username root
group root-lr
password 0 lablab
!
hostname ios
alias exec al show alarms brief system active
interface HundredGigE 0/0/0/24
ipv4 address 10.10.10.55 255.255.255.0
no shutdown
!
ユーザースクリプトの作成
IOS XR bash シェルで実行されるユーザースクリプトやバイナリは、IOS XR CLI と対話して、設定、設定状態の確認を行い、オペレータが選択したワークフローに基づいて exec コマンドを実行するために使用できます。
シェルか Python を使用して ZTP スクリプトを作成します。ZTP には、ユーザースクリプト内で使用できる一連の CLI コマンドおよびシェルユーティリティが含まれています。
(注) |
すでにプロビジョニングされているルータでは API を実行しないことを推奨します。ZTP ユーティリティ API は、ルータの初回起動時に ZTP スクリプトから実行されるように設計されています。API によって追加の操作が実行され、ブートプロセス中に要求されたアクションが実行され、アクションを実行する前に既存の設定に変更が加えられます。 ZTP ユーティリティ API には、ZTP ユーティリティ API を実行する前に ZTP ワークフローで実行される前提条件があります。それらの前提条件は、ブートプロセス中に特定のアクションを実行し、必要な設定の変更を行うのに役立ちます。 ZTP スクリプトの範囲外で ZTP ユーティリティを使用しないことを推奨します。このスクリプトの API では、すべてのアクションで |
ZTP シェルユーティリティ
ZTP には、ユーザー スクリプト内から送信可能な一連のシェル ユーティリティが含まれています。ztp_helper.sh
は、ユーザー スクリプトによって送信可能なシェル スクリプトです。ztp_helper.sh
は、一部の XR 機能にアクセスするための単純なユーティリティを提供します。次の bash 関数を呼び出すことができます。
-
xrcmd:単一の XR exec コマンド
xrcmd “show running”
を実行するために使用されます。 -
xrapply:ファイルに指定された構成ブロックを適用します。
cat >/tmp/config <<%% !! XR config example hostname node1-mgmt-via-xrapply %% xrapply /tmp/config
-
xrapply_with_reason:XR 構成のブロックをロギング目的の理由とともに適用するために使用されます。
cat >/tmp/config <<%% !! XR config example hostname node1-mgmt-via-xrapply %% xrapply_with_reason "this is a system upgrade" /tmp/config
-
xrapply_string:XR 構成のブロックを 1 行で適用するために使用されます。
xrapply_string "hostname foo\interface HundredGigE0/0/0/24\nipv4 address 1.2.3.44 255.255.255.0\n"
-
xrapply_string_with_reason:ロギング目的の理由とともに XR 構成のブロックを 1 行で適用するために使用されます。
xrapply_string_with_reason ”system renamed again" "hostname venus\n interface HundredGigE0/0/0/24\n ipv4 address 172.30.0.144/24\n”
-
xrreplace:XR 構成の置換をファイルを介して XR 名前空間に適用するために使用されます。
cat rtr.cfg <<%% !! XR config example hostname node1-mgmt-via-xrreplace %% xrreplace rtr.cfg
-
xrapply_with_extra_auth:認証を必要とする XR 構成をファイルを介して XR 名前空間に適用するために使用されます。xrapply_with_extra_auth API が、エイリアス、フレックス グループなどの追加の認証を必要とする構成が適用されるときに使用されます。この API は、追加の権限を取得するために、内部で認証と承認を実行します。
cat >/tmp/config <<%% !! XR config example alias exec alarms show alarms brief system active alias exec version run cat /etc/show_version.txt %% xrapply_with_extra_auth >/tmp/config
-
xrreplace_with_extra_auth:XR 構成の置換をファイルを介して XR 名前空間に適用するために使用されます。xrreplace_with_extra_auth API は、エイリアス、Flex グループなど、追加の認証を必要とする構成が適用されるときに使用されます。この API は、追加の権限を取得するために、内部で認証と承認を実行します。
cat >/tmp/config <<%% !! XR config example alias exec alarms show alarms brief system active alias exec version run cat /etc/show_version.txt %% xrreplace_with_extra_auth >/tmp/config
API 実装の動作
(注) |
xrcmd 、xrapply 、および xrreplace API またはユーティリティでは、特定のアクションを実行するための一連の内部操作が実行されます。順番に実行される内部操作には、次の操作が含まれます。
これらの内部操作に加えて、xrapply_with_extra_auth および xrreplace_with_extra_auth API では、設定を適用する前に認証プロセスが実行されます。 |
ZTP ヘルパー Python ライブラリ
ZTP Python ライブラリでは、ZtpHelpers と呼ばれる単一の Python クラスを定義します。ヘルパースクリプトは /pkg/bin/ztp_helper.sh にあります。
ZtpHelpers クラスのメソッド
次に、ZtpHelpers クラスのユーティリティメソッドを示します。
-
init(self, syslog_server=None, syslog_port=None, syslog_file=None):
__init__ constructor :param syslog_server: IP address of reachable Syslog Server :param syslog_port: Port for the reachable syslog server :param syslog_file: Alternative or addon file for syslog :type syslog_server: str :type syslog_port: int :type syslog_file:str All parameters are optional. When nothing is specified during object creation, then all logs are sent to a log rotated file /tmp/ztp_python.log (max size of 1MB).
-
setns(cls, fd, nstype):
Class Method for setting the network namespace :param cls: Reference to the class ZtpHelpers :param fd: incoming file descriptor :param nstype: namespace type for the sentns call :type nstype: int 0 Allow any type of namespace to be joined. CLONE_NEWNET = 0x40000000 (since Linux 3.0) fd must refer to a network namespace
-
get_netns_path(cls, nspath=None, nsname=None, nspid=None):
Class Method to fetch the network namespace filepath associated with a PID or name :param cls: Reference to the class ZtpHelpers :param nspath: optional network namespace associated name :param nspid: optional network namespace associate PID :type nspath: str :type nspid: int :return: Return the complete file path :rtype: str
-
toggle_debug(self, enable):
Enable/disable debug logging :param enable: Enable/Disable flag :type enable: int
-
set_vrf(self, vrfname=None):
Set the VRF (network namespace) :param vrfname: Network namespace name corresponding to XR VRF
-
download_file(self, file_url, destination_folder):
Download a file from the specified URL :param file_url: Complete URL to download file :param destination_folder: Folder to store the downloaded file :type file_url: str :type destination_folder: str :return: Dictionary specifying download success/failure Failure => { 'status' : 'error' } Success => { 'status' : 'success', 'filename' : 'Name of downloaded file', 'folder' : 'Directory location of downloaded file'} :rtype: dict
-
setup_syslog(self):
正しい VRF(ネットワーク名前空間)で sysloghandler を正しく設定し、リモート syslog サーバー、ローカルファイル、またはデフォルトの log-rotated ログファイルを指すメソッド。
-
xrcmd(self, cmd=None):
Issue an IOS-XR exec command and obtain the output :param cmd: Dictionary representing the XR exec cmd and response to potential prompts { 'exec_cmd': '', 'prompt_response': '' } :type cmd: dict :return: Return a dictionary with status and output { 'status': 'error/success', 'output': '' } :rtype: dict
-
xrapply(self, filename=None, reason=None):
Apply Configuration to XR using a file :param file: Filepath for a config file with the following structure: ! XR config command ! end :param reason: Reason for the config commit. Will show up in the output of: "show configuration commit list detail" :type filename: str :type reason: str :return: Dictionary specifying the effect of the config change { 'status' : 'error/success', 'output': 'exec command based on status'} In case of Error: 'output' = 'show configuration failed' In case of Success: 'output' = 'show configuration commit changes last 1' :rtype: dict
-
xrapply_string(self, cmd=None, reason=None):
Apply Configuration to XR using a single line string :param cmd: Single line string representing an XR config command :param reason: Reason for the config commit. Will show up in the output of: "show configuration commit list detail" :type cmd: str :type reason: str :return: Dictionary specifying the effect of the config change { 'status' : 'error/success', 'output': 'exec command based on status'} In case of Error: 'output' = 'show configuration failed' In case of Success: 'output' = 'show configuration commit changes last 1' :rtype: dict
-
xrreplace(self, filename=None):
Replace XR Configuration using a file :param file: Filepath for a config file with the following structure: ! XR config commands ! end :type filename: str :return: Dictionary specifying the effect of the config change { 'status' : 'error/success', 'output': 'exec command based on status'} In case of Error: 'output' = 'show configuration failed' In case of Success: 'output' = 'show configuration commit changes last 1' :rtype: dict
API 実装の動作
(注) |
xrcmd 、xrapply 、および xrreplace API またはユーティリティでは、特定のアクションを実行するための一連の内部操作が実行されます。順番に実行される内部操作には、次の操作が含まれます。
|
例
次に、Python のサンプルスクリプトを示します。
[apple2:~]$ python sample_ztp_script.py
###### Debugs enabled ######
###### Change context to user specified VRF ######
###### Using Child class method, setting the root user ######
2016-12-17 04:23:24,091 - DebugZTPLogger - DEBUG - Config File content to be applied !
username netops
group root-lr
group cisco-support
secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1
!
end
2016-12-17 04:23:28,546 - DebugZTPLogger - DEBUG - Received exec command request: "show configuration commit changes last 1"
2016-12-17 04:23:28,546 - DebugZTPLogger - DEBUG - Response to any expected prompt ""
Building configuration...
2016-12-17 04:23:29,329 - DebugZTPLogger - DEBUG - Exec command output is ['!! IOS XR Configuration version = 6.2.1.21I', 'username netops', 'group root-lr', 'group cisco-support', 'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1', '!', 'end']
2016-12-17 04:23:29,330 - DebugZTPLogger - DEBUG - Config apply through file successful, last change = ['!! IOS XR Configuration version = 6.2.1.21I', 'username netops', 'group root-lr', 'group cisco-support', 'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1', '!', 'end']
###### Debugs Disabled ######
###### Executing a show command ######
Building configuration...
{'output': ['!! IOS XR Configuration version = 6.2.1.21I',
'!! Last configuration change at Sat Dec 17 04:23:25 2016 by UNKNOWN',
'!',
'hostname customer2',
'username root',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'username noc',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'username netops',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'username netops2',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'username netops3',
'group root-lr',
'group cisco-support',
'secret 5 $1$7kTu$zjrgqbgW08vEXsYzUycXw1',
'!',
'cdp',
'service cli interactive disable',
'interface MgmtEth0/RP0/CPU0/0',
'ipv4 address 11.11.11.59 255.255.255.0',
'!',
'interface TenGigE0/0/0/0/24',
'shutdown',
'!',
'interface TenGigE0/0/0/0/25',
'shutdown',
'!',
'router static',
'address-family ipv4 unicast',
'0.0.0.0/0 11.11.11.2',
'!',
'!',
'end'],
'status': 'success'}
###### Apply valid configuration using a file ######
Building configuration...
{'status': 'success', 'output': ['!! IOS XR Configuration version = 6.2.1.21I', 'hostname customer', 'cdp', 'end']}
###### Apply valid configuration using a string ######
Building configuration...
{'output': ['!! IOS XR Configuration version = 6.2.1.21I',
'hostname customer2',
'end'],
'status': 'success'}
###### Apply invalid configuration using a string ######
{'output': ['!! SYNTAX/AUTHORIZATION ERRORS: This configuration failed due to',
'!! one or more of the following reasons:',
'!! - the entered commands do not exist,',
'!! - the entered commands have errors in their syntax,',
'!! - the software packages containing the commands are not active,',
ヘルパー API の詳細については、https://github.com/ios-xr/iosxr-ztp-python#iosxr-ztp-python を参照してください。