Contenido

Introducción

Antecedentes

Configuración del servidor Linux

Configuración DHCP

Requisitos del servidor HTTP

Consejos de Troubleshooting

Activar router para obtener una dirección IP con DHCP

Verifique que el servidor HTTP sea funcional

¿Cómo Iniciar ZTP?

Inicio manual de ZTP

Iniciar el router con iPXE

Automatización posterior a la instalación

Información Relacionada

Introducción

Este documento describe los consejos para la resolución de problemas de las implementaciones iniciales de aprovisionamiento sin intervención (ZTP).

ZTP se introdujo para reducir la interacción humana en el suministro de dispositivos XR. ZTP utiliza una implementación del entorno de ejecución previa al arranque (iPXE).

Antecedentes

ZTP puede realizar lo siguiente:

- Actualización de configuración automática: Descargue y aplique la configuración XR después de la instalación de la imagen

- Ejecución de script: Descargue y ejecute los archivos de script definidos por el usuario. Se pueden implementar varios métodos/funciones como parte de la ejecución de secuencias de comandos:

- Actualización de varios paquetes

- instalación de SMU

- Verificaciones

- eXR decide cuál de las acciones realizar en función del contenido de la primera línea del archivo

- Si el archivo comienza con !! IOS XR denota un archivo de configuración y realiza apply_config.

- De manera similar, los archivos que comienzan con #! /bin/bash o #! /bin/sh o #!/usr/bin/python denota un archivo de secuencia de comandos y realiza la ejecución de la secuencia de comandos.

- La compatibilidad con python se introduce en eXR 6.2.2

- eXR iPXE admite el protocolo de transferencia de archivos trivial (TFTP), el protocolo de transferencia de archivos (FTP) y el protocolo de transferencia de hipertexto (HTTP).

- No se admite el protocolo de transferencia de hipertexto seguro (HTTPS), ya que no puede predecir qué firma verificar.

Configuración del servidor Linux

iPXE es una mejora sobre PXE que requiere TFTP/FTP/HTTP para la descarga de imágenes/configuración y utiliza el protocolo de configuración dinámica de host (DHCP) para obtener/proporcionar información para la imagen y la configuración.

Configuración DHCP

En un ejemplo posterior, hay una revisión de una captura de paquetes para confirmar la operación DHCP.

Requisitos del servidor HTTP

El servidor HTTP debe ser accesible desde la interfaz Ethernet de administración.

Consejos de Troubleshooting

Cuando se configura el servidor Linux, realice la verificación de disponibilidad y funcionalidad del servidor DHCP/HTTP.

En esta configuración, un único servidor Linux se utiliza como servidor DHCP/HTTP. Si hay servidores independientes para estas funciones, verifique estos pasos en todos los servidores, si es necesario.

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

Sugerencia: Algunas líneas fueron eliminadas, utilice -l para mostrarlas en su totalidad.

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

Activar router para obtener una dirección IP con DHCP

Interface MgmtEth 0/RP0/CPU0/0

Ipv4 address dhcp

Shut/no shut

Verifique que el servidor HTTP sea funcional

- Pruebe que http://<ip-servername> funcione.

- Abra un explorador en la dirección IP/nombre del servidor.

Si DHCP o HTTP no funcionan, puede haber problemas de firewall o de alcance.

Para comprobar las propiedades del firewall en el servidor, ejecute estos comandos o agregue los protocolos específicos:

Utilice el comando de tablas IP para verificar las reglas de 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

Utilice este comando de firewall para enumerar las entradas permitidas:

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

Utilice los comandos para permitir permanentemente los puertos:

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

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

Habilitar captura de paquetes en servidor 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

¿Cómo Iniciar ZTP?

Inicio manual de ZTP

Utilice el comando ZTP start exec CLI para invocar ZTP.  De forma predeterminada, la interfaz utilizada para ZTP es MGMTEth. Para iniciar este proceso en otras interfaces utilice esta opción:

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

O

Ztp initiate <cr>

Iniciar el router con iPXE

1. En Calvados, inicie el comando reload CLI:

Este comando hace que un router se recargue, lo que inicia el arranque iPXE.

Nota: La información de clase de usuario se interpreta como una opción mal formada debido a un error en Wireshark.

2. El router inicia DHCP Discover, observe que la clase de usuario se completa con la opción iPXE:

3. La oferta DHCP del servidor incluye el nombre del archivo de arranque en la opción 67:

4. El router inicia la descarga de la imagen:

5. Una vez descargada la imagen correctamente, comienza la instalación de las imágenes en el dispositivo.

6. Una vez que el router se inicia correctamente con la imagen descargada, inicia otra solicitud DHCP:

En este Descubrimiento, observe que la información de clase de usuario incluye *.exr-config. Dado que el DHCP está configurado para devolver el archivo de configuración o script (ie. Más en etc/dhcp/dhcpd.conf).

7. El servidor DHCP devuelve la información de archivo requerida en la opción 67:

8. El router descarga la configuración:

El script se puede incluir como respuesta del servidor DHCP y hacer que copien la imagen/configuración.  Esto también se puede utilizar como un script posterior a la instalación, como en el ejemplo siguiente.

Automatización posterior a la instalación

Se puede realizar una automatización posterior a la instalación en el software eXR.

En este ejemplo, esta secuencia de comandos instala todos los paquetes necesarios y aplica la configuración. Esta es una versión ligeramente modificada de ztp_helper.sh.  Este script se invoca desde 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;

Información Relacionada

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