零接触配置 - ZTP
使用 ZTP 在大规模环境中部署网络设备。首次启动时,Cumulus Linux 运行 ZTP,执行配置自动化,从而为设备在网络中预期的角色进行部署。
配置框架允许您执行一次性的、用户提供的脚本。您可以使用各种自动化工具和脚本语言来开发此脚本。您还可以使用它将交换机添加到配置管理 (CM) 平台,例如 Puppet、Chef、CFEngine 或自定义的专有工具。
在开发和测试配置逻辑时,您可以使用 Cumulus Linux 中的 ztp
命令在设备上手动运行您的配置脚本。
ZTP 服务可以按以下顺序自动运行脚本
- 通过本地文件
- 使用插入交换机的 USB 驱动器 (ZTP-USB)
- 通过 DHCP
您也可以手动运行 ZTP。
使用本地文件
当交换机启动时,ZTP 只在本地文件系统中查找一次 ZTP 脚本。ZTP 在 /var/lib/cumulus/ztp
中搜索与 ONIE 风格的瀑布式命名匹配的安装脚本,首先查找最具体的名称,最后查找最通用的名称
'cumulus-ztp-' + architecture + '-' + vendor + '_' + model + '-r' + revision
'cumulus-ztp-' + architecture + '-' + vendor + '_' + model
'cumulus-ztp-' + vendor + '_' + model
'cumulus-ztp-' + architecture
'cumulus-ztp'
使用 USB 驱动器
NVIDIA 仅使用拇指驱动器测试此功能,而不是外部大型 USB 硬盘驱动器。
ztp
进程未发现本地脚本,它会尝试一次查找已插入但未挂载的 USB 驱动器。如果找到,则开始 ZTP 进程。Cumulus Linux 支持使用 FAT32、FAT16 或 VFAT 格式的 USB 驱动器作为 ZTP 脚本的安装源。您必须在之前插入 USB 驱动器再启动交换机。脚本至少必须
- 安装 Cumulus Linux 操作系统。
- 将基本配置复制到交换机。
- 重启交换机或相关服务,以使
switchd
在该配置下启动并运行。
按照以下步骤使用 USB 驱动器执行 ZTP
- 将安装镜像复制到 USB 驱动器。
ztp
进程在新挂载驱动器的根文件系统中搜索与 ONIE 风格的瀑布式命名匹配的文件名(请参阅上面的模式和示例),首先查找最具体的名称,最后查找最通用的名称。- ZTP 解析脚本内容以确保其包含
CUMULUS-AUTOPROVISIONING
标志(请参阅示例脚本)。
USB 驱动器挂载到 /tmp
下的临时目录(例如,/tmp/tmpigGgjf/
)。要引用 USB 驱动器上的文件,请使用环境变量 ZTP_USB_MOUNTPOINT
来引用 USB 根分区。
通过 DHCP 进行 ZTP
如果 ztp
进程未发现本地 ONIE 脚本或适用的 USB 驱动器,它会每十秒检查一次 DHCP,最多五分钟,以查看 /var/run/ztp.dhcp
中是否指定了 ZTP URL。URL 可以是 HTTP、HTTPS、FTP 或 TFTP 中的任何一种。
对于使用 DHCP 的 ZTP,配置最初通过管理网络进行,并通过 DHCP hook 启动。DHCP 选项指定配置脚本。ZTP 进程从 Web 服务器请求此脚本,脚本在本地执行。
通过 DHCP 的 ZTP 进程遵循以下步骤
- 首次启动 Cumulus Linux 时,eth0 会发出 DHCP 请求。默认情况下,Cumulus Linux 发送 DHCP 选项 60(供应商类标识符),值为
cumulus-linux x86_64
,以向 DHCP 服务器标识自身。 - DHCP 服务器向交换机提供租约。
- 如果响应中包含选项 239,则 ZTP 进程启动。
- ZTP 进程从 URL 请求脚本内容,并发送包含有关交换机详细信息的其他 HTTP 标头。
- ZTP 解析脚本内容以确保其包含
CUMULUS-AUTOPROVISIONING
标志(请参阅示例脚本)。 - 如果需要配置,脚本将在交换机本地以 root 权限执行。
- ZTP 检查脚本的返回代码。如果返回代码为 0,ZTP 会在自动配置配置文件中将配置状态标记为完成。
触发通过 DHCP 的 ZTP
如果您尚未配置交换机,则当 eth0 使用 DHCP 并且发生以下事件之一时,您可以触发通过 DHCP 的 ZTP 进程
- 交换机启动。
- 您将网线插入或拔出 eth0 端口。
- 您断开然后重新连接交换机电源线。
您还可以运行 ztp --run <URL>
命令,其中 URL
是 ZTP 脚本的路径。
配置 DHCP 服务器
在通过 eth0 的 DHCP 过程中,Cumulus Linux 请求 DHCP 选项 239。此选项指定自定义配置脚本。
例如,ISC DHCP 服务器的 /etc/dhcp/dhcpd.conf
文件如下所示
option cumulus-provision-url code 239 = text;
subnet 192.0.2.0 netmask 255.255.255.0 {
range 192.0.2.100 192.168.0.200;
option cumulus-provision-url "http://192.0.2.1/demo.sh";
}
前面板端口上的 DHCP
ZTP 在所有前面板交换机端口和任何活动接口上运行 DHCP。ZTP 在每个重试周期评估活动端口列表。当它收到 DHCP 租约并且响应中存在选项 239 时,ZTP 开始执行脚本。
检查 HTTP 标头
在向 Web 服务器发出的请求中,以下 HTTP 标头检索配置脚本
Header Value Example
------ ----- -------
User-Agent CumulusLinux-AutoProvision/0.4
CUMULUS-ARCH CPU architecture x86_64
CUMULUS-BUILD 5.1.0
CUMULUS-MANUFACTURER odm
CUMULUS-PRODUCTNAME switch_model
CUMULUS-SERIAL XYZ123004
CUMULUS-BASE-MAC 44:38:39:FF:40:94
CUMULUS-MGMT-MAC 44:38:39:FF:00:00
CUMULUS-VERSION 5.1.0
CUMULUS-PROV-COUNT 0
CUMULUS-PROV-MAX 32
手动运行 ZTP
Cumulus Linux 提供了命令,以便您可以手动
- 启用 ZTP 并激活配置过程。
- 禁用 ZTP 并停用配置过程。
- 从头开始运行 ZTP。您可以选择为 ZTP 脚本指定自定义 URL 或交换机上的位置。
- 终止当前的 ZTP 进程。
- 显示 ZTP 服务的状态。
以下示例启用 ZTP 并激活配置过程。ZTP 尝试在下次交换机启动时运行。但是,如果 ZTP 已经在之前的启动中运行过,或者您进行了手动配置更改,则 ZTP 将退出,而不会尝试查找脚本。
cumulus@switch:~$ nv action enable system ztp
The operation will perform enable of the ZTP.
Type [y] to perform enable of the ZTP.
Type [N] to cancel an action.
Do you want to continue? [y/N]
如果您添加 force
选项,ZTP 将启用并激活配置过程,而无需提示您进行确认。
cumulus@switch:~$ nv action enable system ztp force
ction executing ...
Enabling ZTP for next reboot
Action executing ...
Action succeeded
以下示例禁用 ZTP 并停用配置过程。如果 ZTP 脚本当前正在运行,则不会禁用 ZTP。
cumulus@switch:~$ nv action disable system ztp
The operation will perform disable of the ZTP.
Type [y] to perform disable of the ZTP.
Type [N] to cancel an action.
Do you want to continue? [y/N]
如果您添加 force
选项,ZTP 将在不提示您确认的情况下运行。
cumulus@switch:~$ nv action disable system ztp force
Action executing ...
Disabling ZTP for next reboot
Action executing ...
Action succeeded
以下示例从头开始手动运行 ZTP。如果您进行了手动配置更改,则 ZTP 会认为交换机已配置并退出。
cumulus@switch:~$ nv action run system ztp
The operation will perform rerun of the ZTP.
Type [y] to perform rerun of the ZTP.
Type [N] to cancel an action.
Do you want to continue? [y/N]
如果您添加 force
选项,ZTP 将在不提示您确认的情况下运行。
cumulus@switch:~$ nv action run system ztp force
Action executing ...
Action succeeded
以下示例手动运行 ZTP 并为 ZTP 脚本指定自定义 URL。如果您进行了手动配置更改,则 ZTP 会认为交换机已配置并退出。
cumulus@switch:~$ nv action run system ztp url https://myserver/mypath/cumulus-ztp.sh
The operation will perform rerun of the ZTP.
Type [y] to perform rerun of the ZTP.
Type [N] to cancel an action.
Do you want to continue? [y/N]
以下示例从交换机上的 /home/cumulus
目录手动运行 ZTP。如果您进行了手动配置更改,则 ZTP 会认为交换机已配置并退出。
cumulus@switch:~$ nv action run system ztp url /home/cumulus/cumulus-ztp.sh
The operation will perform rerun of the ZTP.
Type [y] to perform rerun of the ZTP.
Type [N] to cancel an action.
Do you want to continue? [y/N]
如果您添加 force
选项,ZTP 将在不提示您确认的情况下运行。
cumulus@switch:~$ nv action run system ztp url https://myserver/mypath/cumulus-ztp.sh force
cumulus@switch:~$ nv action run system ztp url /home/cumulus/cumulus-ztp.sh force
以下示例在 ZTP 处于发现过程或当前未运行脚本时终止 ZTP
cumulus@switch:~$ nv action abort system ztp
如果您添加 force
选项,ZTP 将在不提示您确认的情况下终止
cumulus@switch:~$ nv action abort system ztp force
要显示 ZTP 服务的状态,请运行 nv show system ztp
命令。
cumulus@switch:~$ nv show system ztp
operational
------- -----------
service enabled
status enabled
version 1.0
使用上述 ZTP 命令时请务必小心
- 使用自定义 URL 运行 ZTP 时,请确保指定的 URL 可访问并且包含您要运行的脚本。
- 突然终止 ZTP 可能会中断正在进行的配置,并对系统产生意想不到的后果。
- 启用或禁用 ZTP,特别是使用
force
选项,可能会中断现有进程或正在进行的配置。
要启用 ZTP 并激活配置过程,请使用 -e
选项
cumulus@switch:~$ sudo ztp -e
要将 ZTP 重置为其原始状态,请使用 -R
选项。此选项将删除 ztp
目录,并且 ZTP 将在下次交换机重启时运行。
cumulus@switch:~$ sudo ztp -R
要禁用 ZTP 并停用配置过程,请使用 -d
选项
cumulus@switch:~$ sudo ztp -d
要手动运行 ZTP,请使用 -r
选项
cumulus@switch:~$ sudo ztp -r
要运行 ZTP 并为 ZTP 脚本指定自定义 URL
cumulus@switch:~$ sudo ztp -r https://myserver/mypath/cumulus-ztp.sh
要从交换机上的目录运行 ZTP
cumulus@switch:~$ sudo ztp -r /home/cumulus/cumulus-ztp.sh
要查看当前的 ZTP 状态,请使用 -s
选项
cumulus@switch:~$ sudo ztp -s
ZTP INFO:
State disabled
Version 1.0
Result success
Date Mon May 20 21:51:04 2019 UTC
Method Switch manually configured
URL None
编写 ZTP 脚本
您必须在您希望使用自动配置框架运行的任何受支持的脚本中包含以下行。
# CUMULUS-AUTOPROVISIONING
脚本必须包含 CUMULUS-AUTOPROVISIONING
标志。您可以将此标志包含在注释或备注中;您无需将该标志回显或写入 stdout
。
您可以使用 Cumulus Linux 支持的任何语言编写脚本,例如
- Perl
- Python
- Shell
脚本必须在成功时返回退出代码 0,以在自动配置配置文件中将该过程标记为完成。
以下脚本从 USB 驱动器安装 Cumulus Linux 并应用配置
#!/bin/bash
function error() {
echo -e "\e[0;33mERROR: The ZTP script failed while running the command $BASH_COMMAND at line $BASH_LINENO.\e[0m" >&2
exit 1
}
# Log all output from this script
exec >> /var/log/autoprovision 2>&1
date "+%FT%T ztp starting script $0"
trap error ERR
#Load NVUE startup.yaml from usb
nv config patch ${ZTP_USB_MOUNTPOINT}/startup.yaml
nv config apply
# CUMULUS-AUTOPROVISIONING
exit 0
错误处理
当 ZTP 脚本中的命令产生错误时,必须对其进行处理,以防止脚本过早退出。NVIDIA 建议您避免在 ZTP 脚本中使用 &> /dev/null
或其他方法重定向 stderr
。重定向 stderr
可能会中断操作顺序,并导致交互式命令和 NVUE 出现意外结果。
要处理错误并将它们记录到 /var/log/autoprovision
文件中,请使用 function error()
,如下例和上一节中的示例脚本所示
function error() {
echo -e "\e[0;33mERROR: The ZTP script failed while running the command $BASH_COMMAND at line $BASH_LINENO.\e[0m" >&2
exit 1
}
# Log all output from this script
exec >> /var/log/autoprovision 2>&1
date "+%FT%T ztp starting script $0"
trap error ERR
继续配置
通常,ZTP 在本地执行脚本后退出,并且不会继续。要继续进行配置,以便您不必手动干预或将 Ansible 回调嵌入到脚本中,您可以添加 CUMULUS-AUTOPROVISIONING-CASCADE
指令。
最佳实践
ZTP 脚本有不同的形式,并且经常执行相同的任务。由于 BASH 是 ZTP 脚本最常用的语言,请使用以下 BASH 代码片段来执行具有强大错误检查的常见任务。
设置默认 Cumulus 用户密码
默认的 cumulus 用户帐户密码是 cumulus
。首次登录 Cumulus Linux 时,您必须为 cumulus 帐户提供新密码,然后重新登录系统。
将以下 NVUE 命令添加到您的 ZTP 脚本,以将默认 cumulus 用户帐户密码更改为明文密码。该示例将密码 cumulus
更改为 MyP4$$word
。
nv set system aaa user cumulus password 'MyP4$$word'
nv config apply
如果您有不安全的管理网络,请在您的 ZTP 脚本中包含以下命令,以使用加密哈希而不是明文密码设置密码。有关更多信息,请参阅哈希密码。
nv set system aaa user <username> hashed-password <password>
nv config apply
将以下函数添加到您的 ZTP 脚本,以将默认 cumulus 用户帐户密码更改为明文密码。该示例将密码 cumulus
更改为 MyP4$$word
。
function set_password(){
# Unexpire the cumulus account
passwd -x 99999 cumulus
# Set the password
echo 'cumulus:MyP4$$word' | chpasswd
}
set_password
如果您有不安全的管理网络,请使用加密哈希而不是明文密码设置密码。
首先,使用以下 python 命令生成 sha-512 密码哈希。示例命令为密码
MyP4$$word
生成 sha-512 密码哈希。user@host:~$ python3 -c "import crypt; print(crypt.crypt('MyP4$$word',salt=crypt.mksalt()))" $6$hs7OPmnrfvLNKfoZ$iB3hy5N6Vv6koqDmxixpTO6lej6VaoKGvs5E8p5zNo4tPec0KKqyQnrFMII3jGxVEYWntG9e7Z7DORdylG5aR/
然后,将以下函数添加到 ZTP 脚本以更改默认 cumulus 用户帐户密码
function set_password(){ # Unexpire the cumulus account passwd -x 99999 cumulus # Set the password usermod -p '$6$hs7OPmnrfvLNKfoZ$iB3hy5N6Vv6koqDmxixpTO6lej6VaoKGvs5E8p5zNo4tPec0KKqyQnrFMII3jGxVEYWntG9e7Z7DORdylG5aR/' cumulus } set_password
设置系统主机名
要设置系统主机名。
要使用 NVUE 设置系统主机名,请在您的 ZTP 脚本中包含以下命令。此示例将主机名设置为 leaf01
nv set system hostname leaf01
nv config apply
使用
hostnamectl
命令更改主机名;例如cumulus@switch:~$ sudo hostnamectl set-hostname leaf01
在
/etc/hosts
文件中,将 IP 地址 127.0.1.1 的主机替换为新主机名cumulus@switch:~$ sudo nano /etc/hosts ... 127.0.1.1 leaf01
如果您不使用 NVUE 管理交换机,并且想通过 DHCP 主机名选项管理系统主机名,请参阅这篇知识库文章
设置管理 IP 地址
Cumulus Linux 交换机始终至少提供一个专用的以太网管理端口,称为 eth0。此接口专门用于带外管理。默认情况下,管理接口使用 DHCPv4 进行寻址。要为管理接口设置静态 IP 地址和网关,请在您的 ZTP 脚本中包含以下命令
nv set interface eth0 ip address 192.0.2.42/24
nv set interface eth0 ip gateway 192.0.2.1
nv config apply
设置系统时区
要设置系统时区,请在您的 ZTP 脚本中包含以下命令。此示例将时区设置为 US/Eastern
。
nv set system timezone US/Eastern
nv config apply
配置 NTP
默认情况下,NTP 在交换机启动时启动,并且 NTP 配置包括默认服务器。有关更多信息,请参阅NTP。要配置其他 NTP 服务器,请在您的 ZTP 脚本中包含以下命令。此示例在 default
VRF 中添加服务器 4.cumulusnetworks.pool.ntp.org
nv set service ntp default server 4.cumulusnetworks.pool.ntp.org iburst on
nv config apply
测试 DNS 名称解析
DNS 名称经常在 ZTP 脚本中使用。ping_until_reachable
函数测试每个 DNS 名称是否解析为可访问的 IP 地址。在脚本的其他地方使用 DNS 名称之前,请对脚本中使用的每个 DNS 目标调用此函数。
以下示例展示了如何在较大任务的上下文中调用 ping_until_reachable
函数。
function ping_until_reachable(){
last_code=1
max_tries=30
tries=0
while [ "0" != "$last_code" ] && [ "$tries" -lt "$max_tries" ]; do
tries=$((tries+1))
echo "$(date) INFO: ( Attempt $tries of $max_tries ) Pinging $1 Target Until Reachable."
ping $1 -c2 &> /dev/null
last_code=$?
sleep 1
done
if [ "$tries" -eq "$max_tries" ] && [ "$last_code" -ne "0" ]; then
echo "$(date) ERROR: Reached maximum number of attempts to ping the target $1 ."
exit 1
fi
}
检查 Cumulus Linux 版本
以下脚本片段演示了如何检查正在运行的 Cumulus Linux 版本,如果该版本不是目标版本,则升级节点。如果版本是目标版本,则执行正常的 ZTP 任务。此脚本调用 ping_until_reachable
脚本(如上所述)以确保托管镜像服务器和 ZTP 脚本的服务器可访问。
function init_ztp(){
#do normal ZTP tasks
}
CUMULUS_TARGET_RELEASE=5.1.0
CUMULUS_CURRENT_RELEASE=$(cat /etc/lsb-release | grep RELEASE | cut -d "=" -f2)
IMAGE_SERVER_HOSTNAME=webserver.example.com
IMAGE_SERVER= "http:// "$IMAGE_SERVER_HOSTNAME "/ "$CUMULUS_TARGET_RELEASE ".bin "
ZTP_URL= "http:// "$IMAGE_SERVER_HOSTNAME "/ztp.sh "
if [ "$CUMULUS_TARGET_RELEASE" != "$CUMULUS_CURRENT_RELEASE" ]; then
ping_until_reachable $IMAGE_SERVER_HOSTNAME
/usr/cumulus/bin/onie-install -fa -i $IMAGE_SERVER -z $ZTP_URL && reboot
else
init_ztp && reboot
fi
exit 0
执行 Ansible 配置回调
在最初使用 ZTP 配置节点后,使用配置回调来通知 Ansible Tower 或 AWX 节点已准备好进行更详细的配置。以下示例演示了如何使用配置回调
/usr/bin/curl -H "Content-Type:application/json" -k -X POST --data '{"host_config_key":"'somekey'"}' -u username:password http://ansible.example.com/api/v2/job_templates/1111/callback/
测试 ZTP 脚本
使用这些命令来测试和调试您的 ZTP 脚本。
您可以使用详细模式来调试您的脚本,并查看脚本在何处失败。在运行 ZTP 时包含 -v
选项
cumulus@switch:~$ sudo ztp -v -r http://192.0.2.1/demo.sh
Attempting to provision via ZTP Manual from http://192.0.2.1/demo.sh
Broadcast message from root@dell-s6010-01 (ttyS0) (Tue May 10 22:44:17 2016):
ZTP: Attempting to provision via ZTP Manual from http://192.0.2.1/demo.sh
ZTP Manual: URL response code 200
ZTP Manual: Found Marker CUMULUS-AUTOPROVISIONING
ZTP Manual: Executing http://192.0.2.1/demo.sh
error: ZTP Manual: Payload returned code 1
error: Script returned failure
要查看最近一次 ZTP 执行的结果,您可以运行 ztp -s
命令。
cumulus@switch:~$ ztp -s
ZTP INFO:
State enabled
Version 1.0
Result Script Failure
Date Mon 20 May 2019 09:31:27 PM UTC
Method ZTP DHCP
URL http://192.0.2.1/demo.sh
如果 ZTP 在交换机启动时运行而不是手动运行,您可以运行 systemctl -l status ztp.service
,然后运行 journalctl -l -u ztp.service
,以查看是否发生任何故障
cumulus@switch:~$ sudo systemctl -l status ztp.service
● ztp.service - Cumulus Linux ZTP
Loaded: loaded (/lib/systemd/system/ztp.service; enabled)
Active: failed (Result: exit-code) since Wed 2016-05-11 16:38:45 UTC; 1min 47s ago
Docs: man:ztp(8)
Process: 400 ExecStart=/usr/sbin/ztp -b (code=exited, status=1/FAILURE)
Main PID: 400 (code=exited, status=1/FAILURE)
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP USB: Device not found
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: Looking for ZTP Script provided by DHCP
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: Attempting to provision via ZTP DHCP from http://192.0.2.1/demo.sh
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: URL response code 200
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: Found Marker CUMULUS-AUTOPROVISIONING
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: Executing http://192.0.2.1/demo.sh
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: Payload returned code 1
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: Script returned failure
May 11 16:38:45 dell-s6010-01 systemd[1]: ztp.service: main process exited, code=exited, status=1/FAILURE
May 11 16:38:45 dell-s6010-01 systemd[1]: Unit ztp.service entered failed state.
cumulus@switch:~$
cumulus@switch:~$ sudo journalctl -l -u ztp.service --no-pager
-- Logs begin at Wed 2016-05-11 16:37:42 UTC, end at Wed 2016-05-11 16:40:39 UTC. --
May 11 16:37:45 cumulus ztp[400]: ztp [400]: /var/lib/cumulus/ztp: Sate Directory does not exist. Creating it...
May 11 16:37:45 cumulus ztp[400]: ztp [400]: /var/run/ztp.lock: Lock File does not exist. Creating it...
May 11 16:37:45 cumulus ztp[400]: ztp [400]: /var/lib/cumulus/ztp/ztp_state.log: State File does not exist. Creating it...
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP LOCAL: Looking for ZTP local Script
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp-x86_64-dell_s6010_s1220-rUNKNOWN
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp-x86_64-dell_s6010_s1220
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp-x86_64-dell
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp-x86_64
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP USB: Looking for unmounted USB devices
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP USB: Parsing partitions
May 11 16:37:45 cumulus ztp[400]: ztp [400]: ZTP USB: Device not found
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: Looking for ZTP Script provided by DHCP
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: Attempting to provision via ZTP DHCP from http://192.0.2.1/demo.sh
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: URL response code 200
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: Found Marker CUMULUS-AUTOPROVISIONING
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: Executing http://192.0.2.1/demo.sh
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: ZTP DHCP: Payload returned code 1
May 11 16:38:45 dell-s6010-01 ztp[400]: ztp [400]: Script returned failure
May 11 16:38:45 dell-s6010-01 systemd[1]: ztp.service: main process exited, code=exited, status=1/FAILURE
May 11 16:38:45 dell-s6010-01 systemd[1]: Unit ztp.service entered failed state.
除了运行 journalctl
,您还可以通过运行以下命令查看日志历史记录
cumulus@switch:~$ cat /var/log/syslog | grep ztp
2016-05-11T16:37:45.132583+00:00 cumulus ztp [400]: /var/lib/cumulus/ztp: State Directory does not exist. Creating it...
2016-05-11T16:37:45.134081+00:00 cumulus ztp [400]: /var/run/ztp.lock: Lock File does not exist. Creating it...
2016-05-11T16:37:45.135360+00:00 cumulus ztp [400]: /var/lib/cumulus/ztp/ztp_state.log: State File does not exist. Creating it...
2016-05-11T16:37:45.185598+00:00 cumulus ztp [400]: ZTP LOCAL: Looking for ZTP local Script
2016-05-11T16:37:45.485084+00:00 cumulus ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp-x86_64-dell_s6010_s1220-rUNKNOWN
2016-05-11T16:37:45.486394+00:00 cumulus ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp-x86_64-dell_s6010_s1220
2016-05-11T16:37:45.488385+00:00 cumulus ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp-x86_64-dell
2016-05-11T16:37:45.489665+00:00 cumulus ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp-x86_64
2016-05-11T16:37:45.490854+00:00 cumulus ztp [400]: ZTP LOCAL: Waterfall search for /var/lib/cumulus/ztp/cumulus-ztp
2016-05-11T16:37:45.492296+00:00 cumulus ztp [400]: ZTP USB: Looking for unmounted USB devices
2016-05-11T16:37:45.493525+00:00 cumulus ztp [400]: ZTP USB: Parsing partitions
2016-05-11T16:37:45.636422+00:00 cumulus ztp [400]: ZTP USB: Device not found
2016-05-11T16:38:43.372857+00:00 cumulus ztp [1805]: Found ZTP DHCP Request
2016-05-11T16:38:45.696562+00:00 cumulus ztp [400]: ZTP DHCP: Looking for ZTP Script provided by DHCP
2016-05-11T16:38:45.698598+00:00 cumulus ztp [400]: Attempting to provision via ZTP DHCP from http://192.0.2.1/demo.sh
2016-05-11T16:38:45.816275+00:00 cumulus ztp [400]: ZTP DHCP: URL response code 200
2016-05-11T16:38:45.817446+00:00 cumulus ztp [400]: ZTP DHCP: Found Marker CUMULUS-AUTOPROVISIONING
2016-05-11T16:38:45.818402+00:00 cumulus ztp [400]: ZTP DHCP: Executing http://192.0.2.1/demo.sh
2016-05-11T16:38:45.834240+00:00 cumulus ztp [400]: ZTP DHCP: Payload returned code 1
2016-05-11T16:38:45.835488+00:00 cumulus ztp [400]: Script returned failure
2016-05-11T16:38:45.876334+00:00 cumulus systemd[1]: ztp.service: main process exited, code=exited, status=1/FAILURE
2016-05-11T16:38:45.879410+00:00 cumulus systemd[1]: Unit ztp.service entered failed state.
如果您看到问题是脚本故障,您可以修改脚本,然后如上所述使用 ztp -v -r <URL/path to that script>
手动运行 ZTP。
cumulus@switch:~$ sudo ztp -v -r http://192.0.2.1/demo.sh
Attempting to provision via ZTP Manual from http://192.0.2.1/demo.sh
Broadcast message from root@dell-s6010-01 (ttyS0) (Tue May 10 22:44:17 2019):
ZTP: Attempting to provision via ZTP Manual from http://192.0.2.1/demo.sh
ZTP Manual: URL response code 200
ZTP Manual: Found Marker CUMULUS-AUTOPROVISIONING
ZTP Manual: Executing http://192.0.2.1/demo.sh
error: ZTP Manual: Payload returned code 1
error: Script returned failure
cumulus@switch:~$ sudo ztp -s
State enabled
Version 1.0
Result Script Failure
Date Mon 20 May 2019 09:31:27 PM UTC
Method ZTP Manual
URL http://192.0.2.1/demo.sh
使用以下命令检查 syslog
以获取有关 ZTP 的信息
cumulus@switch:~$ sudo grep -i ztp /var/log/syslog
常见的 ZTP 脚本错误
在下载的负载中找不到引用的脚本/解释器
cumulus@leaf01:~$ sudo cat /var/log/syslog | grep ztp
2018-04-24T15:06:08.887041+00:00 leaf01 ztp [13404]: Attempting to provision via ZTP Manual from http://192.168.0.254/ztp_oob_windows.sh
2018-04-24T15:06:09.106633+00:00 leaf01 ztp [13404]: ZTP Manual: URL response code 200
2018-04-24T15:06:09.107327+00:00 leaf01 ztp [13404]: ZTP Manual: Found Marker CUMULUS-AUTOPROVISIONING
2018-04-24T15:06:09.107635+00:00 leaf01 ztp [13404]: ZTP Manual: Executing http://192.168.0.254/ztp_oob_windows.sh
2018-04-24T15:06:09.132651+00:00 leaf01 ztp [13404]: ZTP Manual: Could not find referenced script/interpreter in downloaded payload.
2018-04-24T15:06:14.135521+00:00 leaf01 ztp [13404]: ZTP Manual: Retrying
2018-04-24T15:06:14.138915+00:00 leaf01 ztp [13404]: ZTP Manual: URL response code 200
2018-04-24T15:06:14.139162+00:00 leaf01 ztp [13404]: ZTP Manual: Found Marker CUMULUS-AUTOPROVISIONING
2018-04-24T15:06:14.139448+00:00 leaf01 ztp [13404]: ZTP Manual: Executing http://192.168.0.254/ztp_oob_windows.sh
2018-04-24T15:06:14.143261+00:00 leaf01 ztp [13404]: ZTP Manual: Could not find referenced script/interpreter in downloaded payload.
2018-04-24T15:06:24.147580+00:00 leaf01 ztp [13404]: ZTP Manual: Retrying
2018-04-24T15:06:24.150945+00:00 leaf01 ztp [13404]: ZTP Manual: URL response code 200
2018-04-24T15:06:24.151177+00:00 leaf01 ztp [13404]: ZTP Manual: Found Marker CUMULUS-AUTOPROVISIONING
2018-04-24T15:06:24.151374+00:00 leaf01 ztp [13404]: ZTP Manual: Executing http://192.168.0.254/ztp_oob_windows.sh
2018-04-24T15:06:24.155026+00:00 leaf01 ztp [13404]: ZTP Manual: Could not find referenced script/interpreter in downloaded payload.
2018-04-24T15:06:39.164957+00:00 leaf01 ztp [13404]: ZTP Manual: Retrying
2018-04-24T15:06:39.165425+00:00 leaf01 ztp [13404]: Script returned failure
2018-04-24T15:06:39.175959+00:00 leaf01 ztp [13404]: ZTP script failed. Exiting...
如果在 Windows 机器上创建或编辑脚本,则通常会发生如上所示的 ZTP 的 syslog 中的错误。检查以确保行尾编码中不存在 \r\n
字符。
使用 cat -v ztp.sh
命令查看脚本内容并搜索任何隐藏字符。
root@oob-mgmt-server:/var/www/html# cat -v ./ztp_oob_windows.sh
#!/bin/bash^M
^M
###################^M
# ZTP Script^M
###################^M
^M
/usr/cumulus/bin/cl-license -i http://192.168.0.254/license.txt^M
^M
# Clean method of performing a Reboot^M
nohup bash -c 'sleep 2; shutdown now -r "Rebooting to Complete ZTP"' &^M
^M
exit 0^M
^M
# The line below is required to be a valid ZTP script^M
#CUMULUS-AUTOPROVISIONING^M
root@oob-mgmt-server:/var/www/html#
如上所示,ZTP 脚本输出中的 ^M
字符表示存在您需要删除的 Windows 行尾编码。
在任何 Linux 系统上使用 translate (tr
) 命令从文件中删除 '\r'
字符。
root@oob-mgmt-server:/var/www/html# tr -d '\r' < ztp_oob_windows.sh > ztp_oob_unix.sh
root@oob-mgmt-server:/var/www/html# cat -v ./ztp_oob_unix.sh
#!/bin/bash
###################
# ZTP Script
###################
/usr/cumulus/bin/cl-license -i http://192.168.0.254/license.txt
# Clean method of performing a Reboot
nohup bash -c 'sleep 2; shutdown now -r "Rebooting to Complete ZTP"' &
exit 0
# The line below is required to be a valid ZTP script
#CUMULUS-AUTOPROVISIONING
root@oob-mgmt-server:/var/www/html#
注意事项
- 在编写配置脚本时,您有时需要重启交换机。
- 您可以使用 Cumulus Linux
onie-select -i
命令重新配置交换机,并使用 ONIE 再次安装网络操作系统。