Cisco ha introducido ZTP en IOS XE 16.5.1 en adelante para brindarle a un dispositivo la capacidad de descargar y ejecutar un script de Python en un Guest Shell de Linux para realizar tareas de configuración y actualización de software en el dispositivo.
Si su hardware (por ejemplo, 9200L) y/o software no es compatible con ZTP, puede utilizar la implementación alternativa de AutoInstall.
El primer paso es verificar si hay una configuración de inicio presente; de lo contrario, el segundo paso es realizar una solicitud DHCP. El tercer paso es descargar el script especificado en la respuesta DHCP. El cuarto y último paso es ejecutar el script Python en el entorno Guest Shell. El Guest Shell permanece habilitado después de que se haya ejecutado el script.
De forma predeterminada, Guest Shell tiene acceso a la red a través del puerto de administración de RP. Cuando un dispositivo está conectado a la red a través de los puertos del panel frontal, Guest Shell no tiene conexión de red. script.py utiliza comandos CLI como copy
y more
para acceder a la red.
script.py tiene la siguiente funcionalidad incorporada:
script.py necesita que el usuario complete 4 variables:
SYSLOG es una cadena de dirección IP del servidor syslog, una cadena vacía deshabilita syslog
LOGAPI es una cadena con URL para registrar la API, una cadena vacía deshabilita los mensajes de estado
JSON es una cadena con la URL del objeto DATOS codificado en JSON como se especifica a continuación. La cadena vacía deshabilita la descarga de datos de dispositivos externos.
DATOS es una lista de dictados que define los datos del dispositivo. La lista vacía deshabilita los datos internos del script. Para especificar los valores predeterminados del dispositivo, omita la clave denominada pila de un dict. Las claves y valores válidos son:
Llave | Valor |
---|---|
pila | dict con el número de interruptor de destino como clave y el número de serie como valor |
versión | cadena con la versión de destino utilizada para determinar si es necesaria una actualización |
URL_base | cadena con URL base para unirse opcionalmente con la URL de instalación/configuración |
instalar | cadena con la URL del IOS de destino para descargar |
configuración | cadena con URL de la plantilla de configuración para descargar |
sust. | dict con claves que coinciden con los marcadores de posición en la plantilla |
cli | cadena de comandos finales de IOS, o Python si está dentro de {{...}} |
ahorrar | booleano para indicar que se debe guardar la configuración al finalizar el script |
plantilla | plantilla de configuración de retención de cadenas con marcadores de posición basados en $ |
Todas las pilas heredan la configuración predeterminada, pero la configuración de la pila tiene preferencia. Por ejemplo: si la versión predeterminada es 16.6.5 y la versión de pila es 16.9.2, entonces se usa esta última. Cuando se completa la variable DATOS, cualquier servidor HTTP puede servir el script, las imágenes y configuraciones de IOS XE. La plantilla de configuración no admite banners de varias líneas, esto es una limitación de ZTP. Las expresiones de Python se pueden utilizar en la cadena de comando cli final. Por ejemplo, para utilizar el número de serie en un nombre de archivo:
copy run http://10.0.0.1:8080/file/{{ztp['serial']}}.conf
O para pausar la ejecución del comando por un momento:
{{time.sleep(10)}}
Ejemplo de configuración de script.py para uso independiente sin aplicación 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 ****'
}
]
En lugar de ingresar los datos directamente en script.py , se puede usar la aplicación GUI para ingresar los datos y entregar los archivos. Los mismos nombres clave de la lista de dictados que definen los datos del dispositivo se muestran en la aplicación GUI. Ejemplo de configuración de script.py para el uso de la aplicación GUI:
SYSLOG = '10.0.0.1'
LOGAPI = 'http://10.0.0.1:8080/log'
JSON = 'http://10.0.0.1:8080/data'
DATA = []
La aplicación GUI consta de dos componentes:
En pocas palabras, el cliente web recupera datos de instrucciones del servidor y almacena nuevos datos de instrucciones en el servidor ingresados por el usuario. Luego script.py recupera los datos de esa instrucción, los ejecuta y almacena el resultado en el servidor:
Las API REST proporcionadas por app.py son:
Llamar | Descripción |
---|---|
OBTENER /archivo/ | Se utiliza para servir archivos y subdirectorios, como imágenes o configuraciones de IOS XE. |
BORRAR /archivo/ | la solicitud elimina el archivo especificado del disco |
PONER /archivo/ | Se puede utilizar para cargar archivos desde IOS al servidor. |
ENVIAR /archivo | utilizado por el formulario del cliente AJAX para cargar un archivo al servidor |
OBTENER /lista | el servidor envía una lista de texto JSON de todos los archivos en el directorio y subdirectorios del script |
OBTENER /datos | al recibir la solicitud, el servidor envía el conjunto de datos como texto JSON al cliente/conmutador |
ENVIAR/datos | el cliente envía el conjunto de datos como texto JSON al servidor utilizando el método HTML POST |
OBTENER /csv | al recibir la solicitud, el servidor aplana el conjunto de datos y lo exporta como un archivo CSV |
ENVIAR /csv | el cliente envía el archivo CSV con el conjunto de datos aplanado al servidor para importarlo |
OBTENER /registro | al recibir la solicitud, el servidor envía las entradas del registro como texto JSON al cliente |
PUESTA /registro | utilizado por script.py para enviar la salida del flujo de trabajo ZTP como texto JSON al servidor |
app.py valida el formato de los datos para cada llamada a la API. Los mensajes de error de llamadas API fallidas se presentan en la GUI devolviendo una respuesta HTTP 500 con una cadena de mensaje. Los archivos y directorios se sirven desde el directorio de trabajo actual. La API de listado de directorios devuelve solo subdirectorios. Los archivos cargados se colocan en el directorio cargado de forma predeterminada.
En la pestaña Inicio, la GUI enumera todas las ejecuciones registradas de script.py . La GUI muestra cuadros de texto para cada valor clave en la lista de dictados DATOS en la pestaña Configuración. Los cuadros de texto de instalación y configuración son listas desplegables con los archivos en los subdirectorios. El cuadro de texto de la versión se completa automáticamente si la versión de IOS XE se puede extraer del nombre del archivo. La GUI también admite la carga de varios archivos seleccionados en la pestaña Archivos:
Configure un servidor DHCP para servir un rango con la opción 67 configurada en: http://xxxx:8080/file/script.py
, donde xxxx es la dirección IP de la máquina que aloja app.py. Configuración de muestra en un 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 Bottle and Waitress usando PIP:
pip install bottle waitress
o en Ubuntu de la siguiente manera:
sudo apt-get install python-bottle python-waitress
Coloque app.py , index.html , main.js , style.css y script.py en un directorio e inicie el servidor backend en Linux de la siguiente manera:
nohup python app.py &
La aplicación también se puede ejecutar en Windows. Se admiten Python 2.7+ y 3.4+.
Como alternativa, la aplicación también se puede utilizar en un contenedor Docker ejecutando los siguientes 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
El script se ha probado con éxito en las siguientes plataformas que ejecutan software 16.6.x y superior:
El script se ha probado con éxito en las siguientes plataformas que ejecutan software 16.8.x y superior:
El script debe ser compatible con las siguientes plataformas que ejecutan software 16.12.x y superior:
Las plataformas que ejecutan el software 16.12.4 tienen un problema conocido CSCvw63161 y puede utilizar la implementación alternativa de AutoInstall como solución alternativa.
Este script utiliza un subprograma EEM para la instalación del software, que requiere una licencia de DNA Essentials.