简介
本文档介绍首次部署零接触调配(ZTP)的故障排除提示。
ZTP的引入是为了在提供XR设备时减少人与人之间的交互。ZTP使用预引导执行环境(iPXE)的实现。
背景信息
ZTP可以执行:
- 自动配置更新:映像安装后下载并应用XR配置
- 脚本执行:下载并执行用户定义的脚本文件。各种方法/功能可作为脚本执行的一部分实现:
- 多个包更新
- SMU安装
- 验证
- eXR根据文件中第一行的内容确定要执行的操作
- 如果文件以!!IOS XR表示配置文件并执行apply_config。
- 同样,以#开头的文件!/bin/bash或#!/bin/sh或#!/usr/bin/python表示脚本文件,并执行脚本执行。
- eXR 6.2.2引入了对python的支持
- eXR iPXE支持简单文件传输协议(TFTP)、文件传输协议(FTP)和超文本传输协议(HTTP)。
- 不支持超文本传输协议安全(HTTPS),因为它无法预测要验证的签名。
Linux服务器配置
iPXE是PXE上的一项增强功能,需要TFTP/FTP/HTTP才能下载映像/配置,并使用动态主机配置协议(DHCP)获取/提供映像和配置信息。
DHCP 配置
在后面的示例中,将回顾数据包捕获,以确认DHCP操作。
HTTP服务器要求
必须能从管理以太网接口访问HTTP服务器。
故障排除提示
设置Linux服务器后,请执行DHCP/HTTP服务器可达性和功能检查。
在此设置中,单个Linux服务器用作DHCP/HTTP服务器。如果这些功能有单独的服务器,请根据需要在所有服务器上验证这些步骤。
[root@xxxxxxxxxx]# service dhcpd status
Redirecting to /bin/systemctl status dhcpd.service
dhcpd.service - DHCPv4 Server Daemon
Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2017-05-29 10:30:59 PDT; 15h ago
Docs: man:dhcpd(8)
man:dhcpd.conf(5)
Main PID: 26913 (dhcpd)
Status: "Dispatching packets..."
CGroup: /system.slice/dhcpd.service
└─26913 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid
<SNIP>
提示:有些线是椭圆的,使用 — l全显示。
[root@xxxxxxxx]# service httpd status
Redirecting to /bin/systemctl status httpd.service
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2017-05-26 05:50:30 PDT; 3 days ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 28088 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Process: 11036 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)
Main PID: 28095 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─11037 /usr/sbin/httpd -DFOREGROUND
├─11038 /usr/sbin/httpd -DFOREGROUND
├─11039 /usr/sbin/httpd -DFOREGROUND
├─11040 /usr/sbin/httpd -DFOREGROUND
├─11041 /usr/sbin/httpd -DFOREGROUND
├─26998 /usr/sbin/httpd -DFOREGROUND
├─27426 /usr/sbin/httpd -DFOREGROUND
├─27427 /usr/sbin/httpd -DFOREGROUND
├─27428 /usr/sbin/httpd -DFOREGROUND
├─27889 /usr/sbin/httpd -DFOREGROUND
└─28095 /usr/sbin/httpd -DFOREGROUND
May 26 05:50:30 xxxxx systemd[1]: Starting The Apache HTTP Server...
May 26 05:50:30 xxxxx systemd[1]: Started The Apache HTTP Server.
May 27 03:16:01 xxxxx systemd[1]: Reloaded The Apache HTTP Server.
May 28 03:37:01 xxxxx systemd[1]: Reloaded The Apache HTTP Server.
使路由器能通过DHCP获取IP地址
Interface MgmtEth 0/RP0/CPU0/0
Ipv4 address dhcp
Shut/no shut
验证HTTP服务器是否正常工作
如果DHCP或HTTP无法工作,则可能存在防火墙问题或可达性问题。
要检查服务器上的防火墙属性,请执行以下命令或添加特定协议:
使用IP表命令验证防火墙规则:
Iptables –L –n
Chain IN_public_allow (1 references)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67 ctstate NEW
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 ctstate NEW
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 ctstate NEW
使用此firewall命令列出允许的条目:
[root@xxxxxxxxx ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp2s0f0
sources:
services: dhcp dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
使用命令永久允许端口:
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=dhcp
在DHCP服务器上启用数据包捕获:
tcpdump –i <interface id> port (bootpc & bootps & port http) –s 0(buffer size) –w <dest. File name>
ex: tcpdump -i enp2s0f0 port 67 or port 68 or port 80 -s 0 -w iPXEboot.pcap
如何启动ZTP?
手动启动ZTP
使用ZTP initiate exec CLI命令调用ZTP。 默认情况下,用于ZTP的接口为MGMTEth。要在其他接口上启动此进程,请使用以下选项:
ZTP initiate interface <type> <number> <cr>
或者
Ztp initiate <cr>
使用iPXE启动路由器
1.从卡尔瓦多斯启动reload CLI命令:
此命令导致路由器重新加载,从而启动iPXE引导。
注意:由于Wireshark中存在Bug,用户类信息被解释为格式错误的选项。
2.路由器启动DHCP发现,注意用户类已填充iPXE选项:
3.服务器的DHCP提供包括选项67中的启动文件名:
4.路由器启动映像下载:
5.成功下载映像后,便开始在设备上安装映像。
6.路由器成功启动下载的映像后,会启动另一个DHCP请求:
在此发现中,请注意用户类信息包括*.exr-config。因为DHCP配置为返回配置文件或脚本(即etc/dhcp/dhcpd.conf中的else语句)。
7. DHCP服务器返回选项67中所需的文件信息:
8.路由器下载配置:
脚本可以作为来自DHCP服务器的响应包含,并让脚本复制映像/配置。 这也可用作安装后脚本,如以下示例中所示。
安装后自动化
在eXR软件安装后可执行各种自动化。
在本示例中,此脚本安装所有必需的包并应用配置。这是稍微修改的ztp_helper.sh版本。 此脚本从xr-linux-shell调用:
RP/0/RP0/CPU0:NCS-5502-A#more disk0:/ztp/ztp_helper_file.sh
Wed May 31 00:55:54.529 UTC
#!/bin/bash
################################################################################
# Install config and additional packages
################################################################################
source /disk0:/ztp/ztp_helper.sh
export HTTP_SERVER=http://10.10.10.10
export RPM_PATH=images
export CONFIG_PATH=images
#Config
export INITIAL_CONFIG=NCS-5502-A.cfg
export FINAL_CONFIG=NCS-5502-A.cfg
#Packages
K9SEC_RPM=ncs5500-k9sec-2.2.0.0-r612.x86_64.rpm
MCAST_RPM=ncs5500-mcast-2.0.0.0-r612.x86_64.rpm
ISIS_RPM=ncs5500-isis-1.1.0.0-r612.x86_64.rpm
OSPF_RPM=ncs5500-ospf-1.1.0.0-r612.x86_64.rpm
MGBL_RPM=ncs5500-mgbl-3.0.0.0-r612.x86_64.rpm
MPLS_RPM=ncs5500-mpls-2.1.0.0-r612.x86_64.rpm
MPLSTE_RPM=ncs5500-mpls-te-rsvp-2.2.0.0-r612.x86_64.rpm
function download_config(){
ip netns exec tpnns /usr/bin/wget ${HTTP_SERVER}/${CONFIG_PATH}/${FINAL_CONFIG} -O /harddisk:/new-config 2>&1
if [[ "$?" != 0 ]]; then
printf "### Error downloading system configuration ###"
else
printf "### Downloading system configuration complete ###";
fi
}
function apply_config(){
# Applies initial configuration
printf "### Applying initial system configuration ###";
xrapply_with_reason "Initial ZTP configuration" /harddisk:/new-config 2>&1;
printf "### Checking for errors ###";
local config_status=$(xrcmd "show configuration failed");
if [[ $config_status ]]; then
echo $config_status
printf "!!! Error encounter applying configuration file, review the log !!!!";
fi
printf "### Applying system configuration complete ###";
}
function install_pkg(){
#Download packages
printf "Downloading Packages"
ip netns exec tpnns /usr/bin/wget ${HTTP_SERVER}/${RPM_PATH}/${K9SEC_RPM} -O /harddisk:/$K9SEC_RPM 2>&1
if [[ "$?" != 0 ]]; then
printf "### Error downloading $K9SEC_RPM ###"
else
printf "### Downloading $K9SEC_PKG complete ###";
fi
printf "Downloading Packages"
ip netns exec tpnns /usr/bin/wget ${HTTP_SERVER}/${RPM_PATH}/${MCAST_RPM} -O /harddisk:/$MCAST_RPM 2>&1
if [[ "$?" != 0 ]]; then
printf "### Error downloading $MCAST_RPM ###"
else
printf "### Downloading $MCAST_RPM complete ###";
fi
printf "Downloading Packages"
ip netns exec tpnns /usr/bin/wget ${HTTP_SERVER}/${RPM_PATH}/${ISIS_RPM} -O /harddisk:/$ISIS_RPM 2>&1
if [[ "$?" != 0 ]]; then
printf "### Error downloading $ISIS_RPM ###"
else
printf "### Downloading $ISIS_RPM complete ###";
fi
printf "Downloading Packages"
ip netns exec tpnns /usr/bin/wget ${HTTP_SERVER}/${RPM_PATH}/${OSPF_RPM} -O /harddisk:/$OSPF_RPM 2>&1
if [[ "$?" != 0 ]]; then
printf "### Error downloading $OSPF_RPM ###"
else
printf "### Downloading $OSPF_RPM complete ###";
fi
printf "Downloading Packages"
ip netns exec tpnns /usr/bin/wget ${HTTP_SERVER}/${RPM_PATH}/${MGBL_RPM} -O /harddisk:/$MGBL_RPM 2>&1
if [[ "$?" != 0 ]]; then
printf "### Error downloading $MGBL_RPM ###"
else
printf "### Downloading $MGBL_RPM complete ###";
fi
printf "Downloading Packages"
ip netns exec tpnns /usr/bin/wget ${HTTP_SERVER}/${RPM_PATH}/${MPLS_RPM} -O /harddisk:/$MPLS_RPM 2>&1
if [[ "$?" != 0 ]]; then
printf "### Error downloading $MPLS_RPM ###"
else
printf "### Downloading $MPLS_RPM complete ###";
fi
printf "Downloading Packages"
ip netns exec tpnns /usr/bin/wget ${HTTP_SERVER}/${RPM_PATH}/${MPLSTE_RPM} -O /harddisk:/$MPLSTE_RPM 2>&1
if [[ "$?" != 0 ]]; then
printf "### Error downloading $MPLSTE_RPM ###"
else
printf "### Downloading $MPLSTE_RPM complete ###";
fi
xrcmd "install update source /harddisk:/ $K9SEC_RPM $MCAST_RPM $ISIS_RPM $OSPF_RPM $MGBL_RPM $MPLS_RPM $MPLSTE_RPM" 2>&1
local complete=0
while [ "$complete" = 0 ]; do
complete=`xrcmd "show install active" | grep k9sec | head -n1 | wc -l`
printf "Waiting for k9sec package to be activated"
sleep 5
done
rm -f /harddisk:/$K9SEC_RPM /harddisk:/$MCAST_RPM /harddisk:/$MCAST_RPM /harddisk:/$ISIS_RPM /harddisk:/$OSPF_RPM /harddisk:/$MGBL_RPM /harddisk:/$MPLSTE_RPM /harddisk:/$MPLS_RPM
printf "### XR PACKAGE INSTALL COMPLETE ###"
}
printf "Start Auto provision"
install_pkg;
download_config;
apply_config;
相关信息