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