内容

概要

背景説明

Linuxサーバの設定

DHCP 設定。

HTTPサーバの要件

トラブルシューティングのヒント

ルータがDHCPでIPアドレスを取得できるようにする

HTTPサーバが機能していることを確認する

ZTPの起動方法

ZTPの手動開始

iPXEを使用したルータのブート

インストール後の自動化

関連情報

概要

このドキュメントでは、ゼロタッチプロビジョニング(ZTP)の初回導入に関するトラブルシューティングのヒントについて説明します。

ZTPは、XRデバイスの提供において人と人との対話を減らすために導入されました。ZTPは、Preboot eXecution Environment(iPXE)の実装を使用します。

背景説明

ZTPは以下を実行できます。

- 自動構成の更新：イメージのインストール後にXR設定をダウンロードして適用する

- スクリプトの実行：ユーザ定義のスクリプトファイルをダウンロードして実行します。スクリプト実行の一部として、さまざまなメソッド/関数を実装できます。

- 複数のパッケージの更新

- SMU のインストール

- 検証

- eXRは、ファイルの最初の行の内容に基づいて、実行するアクションを決定します

- ファイルが!!で始まる場合IOS XRはコンフィギュレーションファイルを示し、apply_configを実行します。

- 同様に、#！で始まるファイルです。/bin/bashまたは#!/bin/shまたは#!/usr/bin/pythonはスクリプトファイルを表し、スクリプトの実行を実行します。

- PythonのサポートはeXR 6.2.2から導入されました

- eXR iPXEは、トリビアルファイル転送プロトコル(TFTP)、ファイル転送プロトコル(FTP)、およびハイパーテキスト転送プロトコル(HTTP)をサポートします。

- Hypertext Transfer Protocol Secure(HTTPS)は、検証するシグニチャを予測できないため、サポートされていません。

Linuxサーバの設定

iPXEは、イメージ/設定のダウンロードにTFTP/FTP/HTTPを必要とし、Dynamic Host Configuration Protocol(DHCP)を使用してイメージと設定の情報を取得/提供するPXEの拡張機能です。

DHCP 設定。

後の例では、DHCPの動作を確認するためのパケットキャプチャのレビューがあります。

HTTPサーバの要件

管理イーサネットインターフェイスからHTTPサーバに到達できる必要があります。

トラブルシューティングのヒント

Linuxサーバを設定したら、「Perform DHCP/HTTP server reachability and functionality Check」を選択します。

この設定では、単一の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を呼び出すには、ZTP initiate exec CLIコマンドを使用します。  デフォルトでは、ZTPに使用されるインターフェイスはMGMTEthです。他のインターフェイスでこのプロセスを開始するには、次のオプションを使用します。

ZTP initiate interface <type> <number> <cr>

または

Ztp initiate <cr>

iPXEを使用したルータのブート

1. Calvadosから、reload CLIコマンドを開始します。

このコマンドにより、ルータがリロードされ、iPXEブートが開始されます。

注：ユーザクラス情報は、Wiresharkのバグが原因で不正なオプションとして解釈されます。

2.ルータがDHCP Discoverを開始し、ユーザクラスに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/