A Cisco introduziu o ZTP no IOS XE 16.5.1 em diante para fornecer a um dispositivo a capacidade de baixar e executar um script Python em um Linux Guest Shell para executar tarefas de atualização e configuração de software no dispositivo.
Se o seu hardware (por exemplo, 9200L) e/ou software não suportar ZTP, você poderá usar a implementação alternativa do AutoInstall.
O primeiro passo é verificar se há uma configuração de inicialização presente, caso contrário, o segundo passo é realizar uma solicitação DHCP. A terceira etapa é baixar o script especificado na resposta do DHCP. A quarta e última etapa é executar o script Python no ambiente Guest Shell. O Guest Shell permanece habilitado após a execução do script.
Por padrão, o Guest Shell tem acesso à rede por meio da porta de gerenciamento RP. Quando um dispositivo está conectado à rede através das portas do painel frontal, o Guest Shell não tem conexão de rede. script.py usa comandos CLI como copy
e more
para acessar a rede.
script.py possui a seguinte funcionalidade integrada:
script.py precisa de 4 variáveis a serem preenchidas pelo usuário:
SYSLOG é uma string de endereço IP do servidor syslog, uma string vazia desativa o syslog
LOGAPI é uma string com URL para registrar a API, uma string vazia desativa mensagens de status
JSON é uma string com URL do objeto DATA codificado em JSON conforme especificado abaixo. String vazia desativa o download de dados de dispositivos externos.
DATA é uma lista de dictos que define os dados do dispositivo. Lista vazia desativa os dados internos do script. Para especificar os padrões do dispositivo, omita a chave chamada stack de um dict. As chaves e os valores válidos são:
Chave | Valor |
---|---|
pilha | ditar com o número do switch alvo como chave e o número de série como valor |
versão | string com a versão de destino usada para determinar se a atualização é necessária |
URL_base | string com URL base para opcionalmente juntar-se ao URL de instalação/configuração |
instalar | string com URL do IOS alvo para download |
configuração | string com URL do modelo de configuração para download |
substituto | dict com chaves que correspondem aos espaços reservados no modelo |
cli | string de comandos finais do IOS ou Python se estiver dentro de {{...}} |
salvar | booleano para indicar salvar a configuração na conclusão do script |
modelo | modelo de configuração de retenção de string com espaços reservados baseados em $ |
As configurações padrão são herdadas por todas as pilhas, mas as configurações da pilha têm preferência. Por exemplo: se a versão padrão for 16.6.5 e a versão da pilha for 16.9.2, então a última será usada. Quando a variável DATA é preenchida, o script, as imagens e configurações do IOS XE podem ser servidos por qualquer servidor HTTP. O modelo de configuração não suporta banners multilinhas, esta é uma limitação do ZTP. Expressões Python podem ser usadas na string de comando cli final. Por exemplo, para usar o número de série em um nome de arquivo:
copy run http://10.0.0.1:8080/file/{{ztp['serial']}}.conf
Ou para pausar a execução do comando por um momento:
{{time.sleep(10)}}
Exemplo de configuração de script.py para uso independente sem aplicativo GUI:
SYSLOG = '10.0.0.1'
LOGAPI = ''
JSON = ''
DATA = [{
'version' : '16.6.5' ,
'install' : 'http://10.0.0.1/cat9k_iosxe.16.06.05.SPA.bin' ,
'save' : True ,
'template' : '''hostname $name
ip domain name lab
ip name-server 8.8.8.8
interface range $uplink1 , $uplink2
description uplink'''
}, {
'stack' : { 1 : 'FCW0000D0LR' , 2 : 'FCW0000G0L7' , 3 : 'FOC0000X0DW' },
'subst' : { 'name' : 'switch1' , 'uplink1' : 'Gi1/0/1' , 'uplink2' : 'Gi2/0/1' }
}, {
'stack' : { 1 : 'FCW0000D0LT' },
'subst' : { 'name' : 'switch2' , 'uplink1' : 'Gi1/0/1' , 'uplink2' : 'Gi1/0/2' },
'version' : '16.9.2' ,
'install' : 'http://10.0.0.1/cat9k_iosxe.16.09.02.SPA.bin' ,
'cli' : 'license smart register idtoken ****'
}
]
Em vez de inserir os dados diretamente em script.py , o aplicativo GUI pode ser usado para inserir os dados e servir os arquivos. Os mesmos nomes de chave da lista de dictos que definem os dados do dispositivo são exibidos no aplicativo GUI. Exemplo de configuração de script.py para uso de aplicativo GUI:
SYSLOG = '10.0.0.1'
LOGAPI = 'http://10.0.0.1:8080/log'
JSON = 'http://10.0.0.1:8080/data'
DATA = []
O aplicativo GUI consiste em dois componentes:
Simplificando, o cliente web recupera dados de instrução do servidor e armazena novos dados de instrução no servidor inserido pelo usuário. Então script.py recupera os dados da instrução, executa-os e armazena a saída no servidor:
As APIs REST fornecidas por app.py são:
Chamar | Descrição |
---|---|
OBTER /arquivo/ | usado para servir arquivos e subdiretórios, como imagens ou configurações do IOS XE |
EXCLUIR /arquivo/ | a solicitação remove o arquivo especificado do disco |
COLOCAR /arquivo/ | pode ser usado para fazer upload de arquivos do IOS para o servidor |
POSTAR/arquivo | usado pelo formulário do cliente AJAX para fazer upload de um arquivo para o servidor |
OBTER /lista | o servidor envia uma lista de texto JSON de todos os arquivos no diretório e subdiretórios do script |
OBTER /dados | ao receber a solicitação, o servidor envia o conjunto de dados como texto JSON para o cliente/switch |
POSTAR/dados | o cliente envia o conjunto de dados como texto JSON para o servidor usando o método HTML POST |
OBTER /csv | ao receber a solicitação, o servidor nivela o conjunto de dados e o exporta como um arquivo CSV |
POSTAR/csv | o cliente envia o arquivo CSV com o conjunto de dados nivelado para o servidor para importação |
OBTER /registro | ao receber a solicitação, o servidor envia as entradas de log como texto JSON para o cliente |
COLOCAR /registro | usado por script.py para enviar a saída do fluxo de trabalho ZTP como texto JSON para o servidor |
app.py valida o formato dos dados para cada chamada de API. Mensagens de erro de chamadas de API com falha são apresentadas na GUI retornando uma resposta HTTP 500 com uma string de mensagem. Arquivos e diretórios são servidos a partir do diretório de trabalho atual. A API de listagem de diretórios retorna apenas subdiretórios. Os arquivos carregados são colocados no diretório carregado por padrão.
Na guia Home, a GUI lista todas as execuções registradas de script.py . A GUI exibe caixas de texto para cada valor-chave na lista DATA de dictos na guia Configurações. As caixas de texto de instalação e configuração são listas suspensas com os arquivos nos subdiretórios. A caixa de texto da versão será preenchida automaticamente se a versão do IOS XE puder ser extraída do nome do arquivo. A GUI também suporta o upload de vários arquivos selecionados na guia Arquivos:
Configure um servidor DHCP para atender um intervalo com a opção 67 definida como: http://xxxx:8080/file/script.py
, onde xxxx é o endereço IP da máquina que hospeda app.py . Exemplo de configuração em um dispositivo Cisco:
ip dhcp excluded-address 10.0.0.1
ip dhcp pool ztp_pool
network 10.0.0.0 255.255.255.0
default-router 10.0.0.1
option 67 ascii http://10.0.0.1:8080/file/script.py
Instale Garrafa e Garçonete usando PIP:
pip install bottle waitress
ou no Ubuntu da seguinte forma:
sudo apt-get install python-bottle python-waitress
Coloque app.py , index.html , main.js , style.css e script.py em um diretório e inicie o backend do servidor no Linux da seguinte forma:
nohup python app.py &
O aplicativo também pode ser executado no Windows. Python 2.7+ e 3.4+ são suportados.
Como alternativa, o aplicativo também pode ser usado em um contêiner Docker executando os seguintes comandos:
docker build -t ztp .
docker run --rm -e ZTP_IP=192.168.0.4 -e ZTP_PORT=8080 -p 8080:8080 --name ztp ztp
O script foi testado com sucesso nas seguintes plataformas executando software 16.6.x e superior:
O script foi testado com sucesso nas seguintes plataformas executando software 16.8.x e superior:
O script deve suportar as seguintes plataformas executando software 16.12.x e superior:
As plataformas que executam o software 16.12.4 têm um problema conhecido CSCvw63161 e você pode usar a implementação alternativa do AutoInstall como solução alternativa.
Este script usa um miniaplicativo EEM para instalação de software, que requer uma licença DNA Essentials.