目錄

簡介

背景資訊

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 tables命令驗證防火牆規則：

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

使用此防火牆命令列出允許的條目：

[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.從Calvados啟動reload CLI命令：

此命令會導致路由器重新載入，從而啟動iPXE引導。

附註：由於Wireshark中存在錯誤，使用者類資訊被解釋為Malformed選項。

2.路由器啟動DHCP發現，請注意iPXE選項填充了使用者類：

3.來自伺服器的DHCP提供包括選項67中的引導檔名：

4.路由器啟動映像下載：

5.映像成功下載後，開始在裝置上安裝映像。

6.路由器使用下載的映像成功啟動後，會啟動另一個DHCP請求：

在此發現中，請注意user-class info includes *.exr-config。因為DHCP配置為返回Config file或Script(即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/