Sommario

Introduzione

Premesse

Configurazione server Linux

Configurazione DHCP

Requisiti del server HTTP

Suggerimenti per la risoluzione dei problemi

Abilita il router per ottenere l'indirizzo IP con DHCP

Verifica funzionalità server HTTP

Come avviare ZTP?

Avvio manuale ZTP

Avvio del router con iPXE

Automazione post-installazione

Informazioni correlate

Introduzione

Questo documento descrive i suggerimenti per la risoluzione dei problemi per le prime implementazioni di Zero Touch Provisioning (ZTP).

Lo ZTP è stato introdotto per ridurre l'interazione umana nella fornitura di dispositivi XR. ZTP utilizza un'implementazione di Preboot eXecution Environment (iPXE).

Premesse

Lo ZTP può eseguire:

- Aggiornamento configurazione automatica: Scaricare e applicare la configurazione XR dopo l'installazione dell'immagine

- Esecuzione script: Scaricare ed eseguire i file script definiti dall'utente. Nell'esecuzione degli script è possibile implementare vari metodi/funzioni:

- Aggiornamento di più pacchetti

- Installazione SMU

- Verifiche

- eXR decide quali azioni eseguire in base al contenuto della prima riga del file

- Se il file inizia con !! IOS XR denota un file di configurazione ed esegue apply_config.

- Analogamente, i file che iniziano con #! /bin/bash o #! /bin/sh o #!/usr/bin/python indica un file di script ed esegue lo script.

- Il supporto per python è introdotto da eXR 6.2.2

- eXR iPXE supporta il protocollo TFTP (Trivial File Transfer Protocol), FTP (File Transfer Protocol) e HTTP (Hypertext Transfer Protocol).

- Il protocollo HTTPS (Hypertext Transfer Protocol Secure) non è supportato perché non è possibile prevedere quale firma verificare.

Configurazione server Linux

iPXE è un miglioramento rispetto a PXE che richiede TFTP/FTP/HTTP per il download di immagini/configurazioni e utilizza il protocollo DHCP (Dynamic Host Configuration Protocol) per ottenere/fornire informazioni per l'immagine e la configurazione.

Configurazione DHCP

In un esempio successivo, viene esaminata l'acquisizione di un pacchetto per confermare l'operazione DHCP.

Requisiti del server HTTP

Il server HTTP deve essere raggiungibile dall'interfaccia Ethernet di gestione.

Suggerimenti per la risoluzione dei problemi

Una volta configurato il server Linux, eseguire il controllo della raggiungibilità e della funzionalità del server DHCP/HTTP.

In questa configurazione, un singolo server Linux viene utilizzato come server DHCP/HTTP. Se sono presenti server separati per queste funzioni, verificare la procedura su tutti i server, se necessario.

[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>

Suggerimento: Alcune righe sono state ridimensionate all'ellisse. Utilizzare -l per visualizzarle tutte.

[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.

Abilita il router per ottenere l'indirizzo IP con DHCP

Interface MgmtEth 0/RP0/CPU0/0

Ipv4 address dhcp

Shut/no shut

Verifica funzionalità server HTTP

- Verificare che http://<ip-servername> funzioni.

- Aprire un browser per visualizzare l'indirizzo IP o il nome del server.

Se il protocollo DHCP o HTTP non funziona, potrebbero verificarsi problemi con il firewall o problemi di raggiungibilità.

Per controllare le proprietà del firewall nel server, eseguire i comandi seguenti o aggiungere i protocolli specifici:

Utilizzare il comando IP tables per verificare le regole del firewall:

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

Utilizzare questo comando del firewall per elencare le voci consentite:

[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:

Utilizzare i comandi per consentire in modo permanente le porte:

firewall-cmd --permanent --add-service=http

firewall-cmd --permanent --add-service=dhcp

Abilita acquisizione pacchetti sul server 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

Come avviare ZTP?

Avvio manuale ZTP

Utilizzare il comando ZTP initiate exec CLI per richiamare ZTP.  Per impostazione predefinita, l'interfaccia utilizzata per ZTP è MGMTEth. Per avviare questo processo su altre interfacce, utilizzare questa opzione:

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

O

Ztp initiate <cr>

Avvio del router con iPXE

1. Da Calvados, avviare il comando reload CLI:

Questo comando determina il ricaricamento di un router, che avvia l'avvio iPXE.

Nota: Le informazioni sulla classe dell'utente vengono interpretate come un'opzione in formato non valido a causa di un bug in Wireshark.

2. Il router avvia il rilevamento DHCP. Notare che la classe utente è popolata con l'opzione iPXE:

3. L'offerta DHCP del server include il nome del file di avvio nell'opzione 67:

4. Il router avvia il download dell'immagine:

5. Una volta completato il download dell'immagine, inizia l'installazione delle immagini sul dispositivo.

6. Una volta avviato correttamente il router con l'immagine scaricata, avvia un'altra richiesta DHCP:

In questa ricerca, le informazioni sulla classe utente includono *.exr-config. Poiché DHCP è configurato in modo da restituire il file Config o lo script (ad esempio Else in etc/dhcp/dhcpd.conf).

7. Il server DHCP restituisce le informazioni richieste sul file nell'opzione 67:

8. Il router scarica la configurazione:

Lo script può essere incluso come risposta dal server DHCP e fare in modo che copiino l'immagine o la configurazione.  Può essere utilizzato anche come script post-installazione, come nell'esempio seguente.

Automazione post-installazione

È possibile eseguire diverse operazioni di automazione dopo l'installazione del software eXR.

In questo esempio, questo script installa tutti i pacchetti richiesti e applica la configurazione. Si tratta di una versione leggermente modificata di ztp_helper.sh.  Questo script viene richiamato da 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;

Informazioni correlate

- 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/