思科在 IOS XE 16.5.1 及更高版本上引入了 ZTP,使設備能夠在 Linux Guest Shell 中下載並執行 Python 腳本,以在裝置上執行軟體升級和設定任務。
如果您的硬體(例如 9200L)和/或軟體不支援 ZTP,您可以使用替代的 AutoInstall 實作。
第一步是檢查是否存在啟動配置,如果沒有,則第二步是執行 DHCP 請求。第三步是下載 DHCP 回覆中指定的腳本。第四步也是最後一步是在 Guest Shell 環境中執行 Python 腳本。執行腳本後,Guest Shell 仍保持啟用狀態。
預設情況下,Guest Shell 可以透過 RP 管理連接埠存取網路。當設備透過前面板連接埠連接到網路時,Guest Shell 沒有網路連線。 script.py使用copy
more
CLI 指令來存取網路。
script.py內建以下功能:
script.py需要使用者填寫 4 個變數:
SYSLOG 是 syslog 伺服器的 IP 位址字串,空字串停用 syslog
LOGAPI 是一個帶有用於記錄 API 的 URL 的字串,空字串會停用狀態訊息傳遞
JSON 是一個字串,其中包含 JSON 編碼的資料物件的 URL,如下所示。空字串將禁用外部設備資料的下載。
DATA 是定義裝置資料的字典清單。空列表會停用腳本的內部資料。若要指定裝置預設值,請從一個字典中省略名為stack的鍵。有效的鍵和值是:
鑰匙 | 價值 |
---|---|
堆疊 | 以目標開關編號為鍵、序號為值的字典 |
版本 | 帶有目標版本的字串,用於確定是否需要升級 |
基本網址 | 帶有基本 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 ****'
}
]
可以使用 GUI 應用程式輸入資料並提供文件,而不是將資料直接輸入到script.py中。定義裝置資料的字典清單的相同鍵名稱顯示在 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 應用程式由兩個元件組成:
簡單來說,Web客戶端從伺服器檢索指令數據,並將使用者輸入的新指令資料儲存在伺服器上。然後script.py檢索該指令數據,執行它並將輸出儲存在伺服器上:
app.py提供的 REST API 包括:
稱呼 | 描述 |
---|---|
取得/文件/ | 用於提供檔案和子目錄,例如 IOS XE 映像或配置 |
刪除/檔案/ | 該請求從磁碟中刪除指定的文件 |
放置/文件/ | 可用於從IOS上傳檔案到伺服器 |
發布/文件 | AJAX 用戶端表單用於將檔案上傳到伺服器 |
取得/列表 | 伺服器發送腳本目錄和子目錄中所有檔案的 JSON 文字列表 |
取得/數據 | 收到請求後,伺服器將資料集作為 JSON 文字傳送到客戶端/交換機 |
發布/數據 | 用戶端使用 HTML POST 方法將資料集作為 JSON 文字傳送到伺服器 |
取得/csv | 收到請求後,伺服器會展平資料集並將其匯出為 CSV 文件 |
發布/csv | 客戶端將包含扁平化資料集的 CSV 檔案傳送到伺服器進行匯入 |
取得/日誌 | 收到請求後,伺服器將日誌條目以 JSON 文字形式傳送給客戶端 |
放置/日誌 | 由script.py用於將 ZTP 工作流程輸出作為 JSON 文字傳送到伺服器 |
app.py驗證每個 API 呼叫的資料格式。透過傳回帶有訊息字串的 HTTP 500 回應,在 GUI 中顯示來自失敗的 API 呼叫的錯誤訊息。檔案和目錄由目前工作目錄提供。目錄列表 API 僅傳回子目錄。上傳的檔案預設放入上傳目錄。
在「主頁」標籤上,GUI 列出了所有記錄的script.py運行。 GUI 在「設定」標籤上的字典資料清單中顯示每個鍵值的文字方塊。安裝和設定文字方塊是下拉列表,其中包含子目錄中的檔案。如果可以從檔案名稱中提取 IOS XE 版本,則版本文字方塊會自動填入。 GUI 也支援在「檔案」標籤上傳多個選定檔案:
設定 DHCP 伺服器以提供選項 67 設定為的範圍: http://xxxx:8080/file/script.py
,其中 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 安裝 Bottle 和 Waitress:
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 許可證。