Contents

Introduction

Informações de Apoio

Configuração do servidor Linux

Configuração DHCP

Requisitos do servidor HTTP

Dicas para Troubleshooting

Ativar o roteador para obter o endereço IP com DHCP

Verificar se o servidor HTTP está funcionando

Como iniciar o ZTP?

Iniciar ZTP manualmente

Inicialize o roteador com iPXE

Automação pós-instalação

Informações Relacionadas

Introduction

Este documento descreve as dicas de solução de problemas para implantações iniciais do ZTP (Zero Touch Provisioning, provisionamento automatizado).

O ZTP foi introduzido para reduzir a interação humana no fornecimento de dispositivos XR. O ZTP usa uma implementação do Preboot eXecution Environment (iPXE).

Informações de Apoio

O ZTP pode executar:

- Atualização da configuração automática: Baixar e aplicar a configuração XR após a instalação da imagem

- Execução do script: Baixe e execute os arquivos de script definidos pelo usuário. Vários métodos/funções podem ser implementados como parte da execução do script:

- Atualização de vários pacotes

- instalação de SMU

- Verificações

- O eXR decide quais ações executar com base no conteúdo da primeira linha do arquivo

- Se o arquivo começar com !! O IOS XR denota um arquivo de configuração e executa apply_config.

- Da mesma forma, os arquivos que começam com #! /bin/bash ou #! /bin/sh ou #!/usr/bin/python indica um arquivo de script e executa a execução de script.

- O suporte para python é apresentado do eXR 6.2.2

- O eXR iPXE suporta Trivial File Transfer Protocol (TFTP), File Transfer Protocol (FTP) e Hypertext Transfer Protocol (HTTP).

- O protocolo HTTPS (Hypertext Transfer Protocol Secure) não é suportado porque não pode prever qual assinatura verificar.

Configuração do servidor Linux

O iPXE é um aprimoramento sobre o PXE que requer TFTP/FTP/HTTP para download de imagem/configuração e usa o Dynamic Host Configuration Protocol (DHCP) para obter/fornecer informações sobre a imagem e a configuração.

Configuração DHCP

Em um exemplo posterior, há uma revisão de uma captura de pacote para confirmar a operação do DHCP.

Requisitos do servidor HTTP

O servidor HTTP deve estar acessível na interface Ethernet Mgmt.

Dicas para Troubleshooting

Quando o servidor Linux estiver configurado, Execute a verificação de acessibilidade e funcionalidade do servidor DHCP/HTTP.

Nesta configuração, um único servidor Linux é usado como servidor DHCP/HTTP. Se houver servidores separados para essas funções, verifique essas etapas em todos os servidores, se necessário.

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

Dica: Algumas linhas foram redimensionadas, use -l para mostrar na íntegra.

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

Ativar o roteador para obter o endereço IP com DHCP

Interface MgmtEth 0/RP0/CPU0/0

Ipv4 address dhcp

Shut/no shut

Verificar se o servidor HTTP está funcionando

- Teste se http://<ip-servername> está funcionando.

- Abra um navegador para o endereço IP/nome do servidor.

Se o DHCP ou HTTP falhar, pode haver problemas de firewall ou de alcance.

Para verificar as propriedades do firewall no servidor, execute estes comandos ou adicione os protocolos específicos:

Usar o comando de tabelas IP para verificar as regras 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

Use este comando de firewall para listar as 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:

Use os comandos para permitir portas permanentemente:

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

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

Ativar a captura de pacotes no 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

Como iniciar o ZTP?

Iniciar ZTP manualmente

Use o comando ZTP start exec CLI para chamar ZTP.  Por padrão, a interface usada para ZTP é MGMTEth. Para iniciar esse processo em outras interfaces, use esta opção:

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

OU

Ztp initiate <cr>

Inicialize o roteador com iPXE

1. A partir de Calvados, inicie o comando reload CLI:

Esse comando faz com que um roteador seja recarregado, iniciando a inicialização do iPXE.

Note: As informações de classe de usuário são interpretadas como uma opção mal formada devido a um bug no Wireshark.

2. O roteador inicia o DHCP Discover, observe que a classe de usuário é preenchida com a opção iPXE:

3. A oferta DHCP do servidor inclui o nome do arquivo de inicialização na Opção 67:

4. O roteador inicia o download da imagem:

5. Depois que a imagem for baixada com êxito, a instalação das imagens no dispositivo começará.

6. Quando o roteador inicializa com êxito com a imagem baixada, ele inicia outra solicitação DHCP:

Nesta descoberta, observe que as informações de classe de usuário incluem *.exr-config. Como o DHCP está configurado para retornar o arquivo de configuração ou o script (por exemplo, Outra declaração em etc/dhcp/dhcpd.conf).

7. O servidor DHCP retorna as informações de arquivo necessárias na opção 67:

8. O roteador faz o download da configuração:

O script pode ser incluído como uma resposta do servidor DHCP e fazer com que ele copie a imagem/configuração.  Isso também pode ser usado como um script pós-instalação, como no exemplo abaixo.

Automação pós-instalação

Várias automações podem ser realizadas após a instalação no software eXR.

Neste exemplo, este script instala todos os pacotes necessários e aplica a configuração. Esta é uma versão ligeiramente modificada de ztp_helper.sh.  Este script é chamado de 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;

Informações Relacionadas

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