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