Contenu

Introduction

Informations générales

Configuration du serveur Linux

Configuration DHCP

Configuration requise pour le serveur HTTP

Conseils de dépannage

Permettre Au Routeur D'Obtenir Une Adresse IP Avec DHCP

Vérification du fonctionnement du serveur HTTP

Comment démarrer ZTP ?

Initialiser manuellement ZTP

Démarrage du routeur avec iPXE

Automatisation post-installation

Informations connexes

Introduction

Ce document décrit les conseils de dépannage pour les premiers déploiements de ZTP (Zero Touch Provisioning).

ZTP a été introduit pour réduire l'interaction humaine dans la fourniture de périphériques XR. ZTP utilise une implémentation de l'environnement d'exécution de prédémarrage (iPXE).

Informations générales

ZTP peut effectuer :

- Mise à jour de la configuration automatique : Télécharger et appliquer la configuration XR après l'installation de l'image

- Exécution du script : Téléchargez et exécutez les fichiers de script définis par l'utilisateur. Diverses méthodes/fonctions peuvent être implémentées dans le cadre de l'exécution du script :

- Mise à jour de plusieurs packages

- Installation SMU

- Vérifications

- eXR décide quelles actions exécuter en fonction du contenu de la première ligne du fichier

- Si le fichier commence par ! ! IOS XR indique un fichier de configuration et exécute Apply_config.

- De même, les fichiers qui commencent par # ! /bin/bash ou # ! /bin/sh ou #!/usr/bin/python indique un fichier de script et exécute le script.

- La prise en charge de python est introduite à partir de eXR 6.2.2

- eXR iPXE prend en charge TFTP (Trivial File Transfer Protocol), FTP (File Transfer Protocol) et HTTP (Hypertext Transfer Protocol).

- Le protocole HTTPS (Hypertext Transfer Protocol Secure) n'est pas pris en charge car il ne peut pas prédire quelle signature vérifier.

Configuration du serveur Linux

iPXE est une amélioration par rapport à PXE qui nécessite TFTP/FTP/HTTP pour le téléchargement d'image/configuration et utilise DHCP (Dynamic Host Configuration Protocol) pour obtenir/fournir des informations sur l'image et la configuration.

Configuration DHCP

Dans un exemple ultérieur, il y a une révision d'une capture de paquets pour confirmer le fonctionnement de DHCP.

Configuration requise pour le serveur HTTP

Le serveur HTTP doit être accessible depuis l'interface Ethernet de gestion.

Conseils de dépannage

Lorsque le serveur Linux est configuré, effectuez une vérification de l'accessibilité et de la fonctionnalité du serveur DHCP/HTTP.

Dans cette configuration, un seul serveur Linux est utilisé comme serveur DHCP/HTTP. S'il existe des serveurs distincts pour ces fonctions, vérifiez ces étapes sur tous les serveurs, si nécessaire.

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

Conseil : Certaines lignes ont été ellipsées, utilisez -l pour afficher en entier.

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

Permettre Au Routeur D'Obtenir Une Adresse IP Avec DHCP

Interface MgmtEth 0/RP0/CPU0/0

Ipv4 address dhcp

Shut/no shut

Vérification du fonctionnement du serveur HTTP

- Testez que http://<ip-servername> fonctionne.

- Ouvrez un navigateur sur l'adresse IP/le nom du serveur.

Si DHCP ou HTTP ne fonctionne pas, il peut y avoir des problèmes de pare-feu ou d'accessibilité.

Pour vérifier les propriétés du pare-feu sur le serveur, exécutez ces commandes ou ajoutez les protocoles spécifiques :

Utilisez la commande tables IP pour vérifier les règles de pare-feu :

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

Utilisez cette commande de pare-feu pour répertorier les entrées autorisées :

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

Utilisez les commandes pour autoriser les ports de manière permanente :

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

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

Activer la capture de paquets sur le serveur 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

Comment démarrer ZTP ?

Initialiser manuellement ZTP

Utilisez la commande CLI ZTP exec pour appeler ZTP.  Par défaut, l'interface utilisée pour ZTP est MGMTEth. Pour lancer ce processus sur d'autres interfaces, utilisez cette option :

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

OU

Ztp initiate <cr>

Démarrage du routeur avec iPXE

1. À partir de Calvados, lancez la commande reload CLI :

Cette commande entraîne le rechargement d'un routeur, qui initialise le démarrage de l'iPXE.

Note: Les informations de classe utilisateur sont interprétées comme une option mal formée en raison d'un bogue dans Wireshark.

2. Le routeur lance DHCP Discover, notez que la classe utilisateur est remplie avec l'option iPXE :

3. L'offre DHCP du serveur inclut le nom du fichier de démarrage dans l'option 67 :

4. Le routeur lance le téléchargement de l’image :

5. Une fois l'image téléchargée, l'installation des images sur le périphérique commence.

6. Une fois que le routeur a démarré avec succès avec l'image téléchargée, il lance une autre requête DHCP :

Dans cette découverte, notez que les informations de classe utilisateur incluent *.exr-config. Puisque le DHCP est configuré pour renvoyer le fichier Config ou Script (i.e. Autre instruction dans etc/dhcp/dhcpd.conf).

7. Le serveur DHCP renvoie les informations de fichier requises dans l'option 67 :

8. Le routeur télécharge la configuration :

Le script peut être inclus comme réponse du serveur DHCP et leur demander de copier l'image/configuration.  Ceci peut également être utilisé comme script post-installation comme dans l'exemple ci-dessous.

Automatisation post-installation

Diverses tâches d'automatisation peuvent être effectuées après l'installation sur le logiciel eXR.

Dans cet exemple, ce script installe tous les packages requis et applique la configuration. Il s'agit d'une version légèrement modifiée de ztp_helper.sh.  Ce script est appelé à partir du shell xr-linux :

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;

Informations connexes

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