思科在 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 许可证。