目录

简介

背景信息

Linux服务器配置

DHCP 配置

HTTP服务器要求

故障排除提示

使路由器能通过DHCP获取IP地址

验证HTTP服务器是否正常工作

如何启动ZTP?

手动启动ZTP

使用iPXE启动路由器

安装后自动化

相关信息

简介

本文档介绍首次部署零接触调配(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服务器是否正常工作

- 测试http://<ip-servername>是否有效。

- 打开指向IP地址/服务器名称的浏览器。

如果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;

相关信息

- https://xrdocs.github.io/software-management/tutorials/2016-08-26-working-with-ztp/

- https://xrdocs.github.io/software-management/tutorials/2016-07-27-ipxe-deep-dive/

- https://xrdocs.github.io/software-management/blogs/2016-10-14-ios-xr-packages-and-security/