シスコは、IOS XE 16.5.1 以降で ZTP を導入し、Linux ゲスト シェルで Python スクリプトをダウンロードして実行し、デバイス上でソフトウェア アップグレードおよび設定タスクを実行できる機能をデバイスに提供しました。
ハードウェア (9200L など) やソフトウェアが ZTP をサポートしていない場合は、代替の AutoInstall 実装を使用できます。
最初のステップでは、起動設定が存在するかどうかを確認し、存在しない場合は、2 番目のステップで DHCP 要求を実行します。 3 番目のステップは、DHCP 応答で指定されたスクリプトをダウンロードすることです。 4 番目で最後のステップは、ゲスト シェル環境で Python スクリプトを実行することです。ゲスト シェルは、スクリプトの実行後も有効なままになります。
デフォルトでは、ゲスト シェルは RP 管理ポート経由でネットワークにアクセスできます。デバイスが前面パネルのポートを介してネットワークに接続されている場合、ゲスト シェルにはネットワーク接続がありません。 script.py は、 copy
more
の CLI コマンドを使用してネットワークにアクセスします。
script.py には次の機能が組み込まれています。
script.py には、ユーザーが次の 4 つの変数を入力する必要があります。
SYSLOG は syslog サーバーの IP アドレス文字列です。空の文字列は syslog を無効にします
LOGAPI はログ API への URL を含む文字列です。空の文字列はステータス メッセージングを無効にします。
JSON は、以下に指定されているように、JSON でエンコードされた DATA オブジェクトの URL を含む文字列です。空の文字列を指定すると、外部デバイス データのダウンロードが無効になります。
DATA はデバイスデータを定義する辞書のリストです。空のリストはスクリプトの内部データを無効にします。デバイスのデフォルトを指定するには、1 つの辞書からstackという名前のキーを省略します。有効なキーと値は次のとおりです。
鍵 | 価値 |
---|---|
スタック | キーとしてターゲット スイッチ番号、値としてシリアル番号を含む dict |
バージョン | アップグレードが必要かどうかを判断するために使用されるターゲット バージョンを含む文字列 |
ベースURL | オプションでインストール/構成 URL と結合するベース URL を含む文字列 |
インストール | ダウンロードするターゲット IOS の URL を含む文字列 |
構成 | ダウンロードする構成テンプレートの URL を含む文字列 |
サブサブ | テンプレート内のプレースホルダーと一致するキーを含む辞書 |
クリ | 最終的な IOS コマンドの文字列、または {{...}} 内の場合は Python |
保存 | スクリプトの完了時に構成を保存することを示すブール値 |
テンプレート | $ベースのプレースホルダーを含む構成テンプレートを保持する文字列 |
デフォルト設定はすべてのスタックに継承されますが、スタック設定には優先順位があります。たとえば、デフォルトのバージョンが 16.6.5 でスタック バージョンが 16.9.2 の場合、後者が使用されます。変数 DATA が設定されると、スクリプト、IOS XE イメージ、および設定を任意の HTTP サーバーから提供できるようになります。構成テンプレートは複数行のバナーをサポートしていません。これは ZTP の制限です。 Python 式は、最終的なcliコマンド文字列で使用できます。たとえば、ファイル名にシリアル番号を使用するには、次のようにします。
copy run http://10.0.0.1:8080/file/{{ztp['serial']}}.conf
または、コマンドの実行を一時停止するには、次のようにします。
{{time.sleep(10)}}
GUI アプリを使用せずにスタンドアロンで使用するためのscript.pyの構成例:
SYSLOG = '10.0.0.1'
LOGAPI = ''
JSON = ''
DATA = [{
'version' : '16.6.5' ,
'install' : 'http://10.0.0.1/cat9k_iosxe.16.06.05.SPA.bin' ,
'save' : True ,
'template' : '''hostname $name
ip domain name lab
ip name-server 8.8.8.8
interface range $uplink1 , $uplink2
description uplink'''
}, {
'stack' : { 1 : 'FCW0000D0LR' , 2 : 'FCW0000G0L7' , 3 : 'FOC0000X0DW' },
'subst' : { 'name' : 'switch1' , 'uplink1' : 'Gi1/0/1' , 'uplink2' : 'Gi2/0/1' }
}, {
'stack' : { 1 : 'FCW0000D0LT' },
'subst' : { 'name' : 'switch2' , 'uplink1' : 'Gi1/0/1' , 'uplink2' : 'Gi1/0/2' },
'version' : '16.9.2' ,
'install' : 'http://10.0.0.1/cat9k_iosxe.16.09.02.SPA.bin' ,
'cli' : 'license smart register idtoken ****'
}
]
script.pyにデータを直接入力する代わりに、GUI アプリを使用してデータを入力し、ファイルを提供できます。デバイス データを定義する辞書のリストと同じキー名が GUI アプリに表示されます。 GUI アプリを使用するためのscript.pyの設定例:
SYSLOG = '10.0.0.1'
LOGAPI = 'http://10.0.0.1:8080/log'
JSON = 'http://10.0.0.1:8080/data'
DATA = []
GUI アプリは 2 つのコンポーネントで構成されます。
簡単に言うと、Web クライアントはサーバーから指示データを取得し、ユーザーが入力した新しい指示データをサーバーに保存します。次に、 script.py がその命令データを取得して実行し、出力をサーバーに保存します。
app.pyによって提供される REST API は次のとおりです。
電話 | 説明 |
---|---|
/ファイル/を取得 | IOS XE イメージや設定などのファイルとサブディレクトリを提供するために使用されます |
/ファイル/を削除 | リクエストは指定されたファイルをディスクから削除します |
PUT /ファイル/ | IOS からサーバーにファイルをアップロードするために使用できます |
POST /ファイル | ファイルをサーバーにアップロードするために AJAX クライアント フォームによって使用されます |
GET /リスト | サーバーは、スクリプト ディレクトリとサブディレクトリ内のすべてのファイルの JSON テキスト リストを送信します。 |
GET /データ | リクエストを受信すると、サーバーはデータセットを JSON テキストとしてクライアント/スイッチに送信します。 |
POST /データ | クライアントは、HTML POST メソッドを使用して、データセットを JSON テキストとしてサーバーに送信します。 |
/csvを取得 | リクエストを受信すると、サーバーはデータセットをフラット化し、CSV ファイルとしてエクスポートします。 |
POST /csv | クライアントは、インポートのために平坦化されたデータセットを含む CSV ファイルをサーバーに送信します。 |
GET /ログ | リクエストを受信すると、サーバーはログ エントリを JSON テキストとしてクライアントに送信します。 |
PUT /ログ | ZTP ワークフロー出力を JSON テキストとしてサーバーに送信するためにscript.pyによって使用されます。 |
app.py は、 API 呼び出しごとにデータの形式を検証します。失敗した API 呼び出しからのエラー メッセージは、メッセージ文字列を含む HTTP 500 応答を返すことによって GUI に表示されます。ファイルとディレクトリは、現在の作業ディレクトリから提供されます。ディレクトリ リスト API はサブディレクトリのみを返します。アップロードされたファイルは、デフォルトでアップロードされたディレクトリに置かれます。
[ホーム] タブの GUI には、ログに記録されたscript.pyのすべての実行が一覧表示されます。 GUI には、[設定] タブの辞書の DATA リスト内のすべてのキー値のテキスト ボックスが表示されます。 installおよびconfigテキスト ボックスは、サブディレクトリ内のファイルを含むドロップダウン リストです。ファイル名から IOS XE バージョンを抽出できる場合、バージョンテキスト ボックスは自動的に入力されます。 GUI は、[ファイル] タブで選択した複数のファイルのアップロードもサポートしています。
オプション 67 をhttp://xxxx:8080/file/script.py
に設定して範囲を提供するように DHCP サーバーを構成します。ここで、xxxx はapp.pyをホストしているマシンの IP アドレスです。 Cisco デバイスの設定例:
ip dhcp excluded-address 10.0.0.1
ip dhcp pool ztp_pool
network 10.0.0.0 255.255.255.0
default-router 10.0.0.1
option 67 ascii http://10.0.0.1:8080/file/script.py
PIP を使用してボトルとウェイトレスをインストールします。
pip install bottle waitress
または、Ubuntu では次のようにします。
sudo apt-get install python-bottle python-waitress
app.py 、 Index.html 、 main.js 、 style.css 、 script.pyをディレクトリに配置し、次のように Linux 上でサーバー バックエンドを起動します。
nohup python app.py &
アプリは Windows 上でも実行できます。 Python 2.7 以降および 3.4 以降がサポートされています。
代わりに、次のコマンドを実行して、アプリを Docker コンテナーで使用することもできます。
docker build -t ztp .
docker run --rm -e ZTP_IP=192.168.0.4 -e ZTP_PORT=8080 -p 8080:8080 --name ztp ztp
このスクリプトは、16.6.x 以降のソフトウェアを実行する次のプラットフォームで正常にテストされました。
このスクリプトは、16.8.x 以降のソフトウェアを実行する次のプラットフォームで正常にテストされました。
このスクリプトは、16.12.x 以降のソフトウェアを実行する次のプラットフォームをサポートする必要があります。
16.12.4 ソフトウェアを実行しているプラットフォームには既知の問題 CSCvw63161 があり、回避策として代替の AutoInstall 実装を使用できます。
このスクリプトはソフトウェアのインストールに EEM アプレットを使用します。これには DNA Essentials ライセンスが必要です。