概要
このドキュメントでは、ゼロタッチプロビジョニング(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;
関連情報