Cisco a introduit ZTP sur IOS XE 16.5.1 pour donner à un appareil la possibilité de télécharger et d'exécuter un script Python dans un shell invité Linux pour effectuer des tâches de mise à niveau logicielle et de configuration sur l'appareil.
Si votre matériel (par exemple 9200L) et/ou logiciel ne prend pas en charge ZTP, vous pouvez utiliser l'implémentation alternative d'AutoInstall.
La première étape consiste à vérifier si une configuration de démarrage est présente, sinon, la deuxième étape consiste à effectuer une requête DHCP. La troisième étape consiste à télécharger le script spécifié dans la réponse DHCP. La quatrième et dernière étape consiste à exécuter le script Python dans l'environnement Guest Shell. Le Guest Shell reste activé une fois le script exécuté.
Par défaut, le Guest Shell a accès au réseau via le port de gestion RP. Lorsqu'un appareil est connecté au réseau via les ports du panneau avant, le Guest Shell n'a pas de connexion réseau. script.py utilise des commandes CLI telles que copy
et more
pour accéder au réseau.
script.py intègre les fonctionnalités suivantes :
script.py a besoin de 4 variables à renseigner par l'utilisateur :
SYSLOG est une chaîne d'adresse IP du serveur syslog, une chaîne vide désactive syslog
LOGAPI est une chaîne avec une URL pour enregistrer l'API, une chaîne vide désactive la messagerie d'état
JSON est une chaîne avec l'URL de l'objet DATA codé JSON comme spécifié ci-dessous. La chaîne vide désactive le téléchargement des données du périphérique externe.
DATA est une liste de dictionnaires qui définit les données de l'appareil. La liste vide désactive les données internes du script. Pour spécifier les valeurs par défaut du périphérique, omettez la clé nommée stack d'un dict. Les clés et valeurs valides sont :
Clé | Valeur |
---|---|
empiler | dict avec le numéro de commutateur cible comme clé et le numéro de série comme valeur |
version | chaîne avec la version cible utilisée pour déterminer si une mise à niveau est nécessaire |
base_url | chaîne avec l'URL de base à joindre éventuellement à l'URL d'installation/configuration |
installer | chaîne avec l'URL de l'IOS cible à télécharger |
configuration | chaîne avec l'URL du modèle de configuration à télécharger |
subst | dicter avec des clés qui correspondent aux espaces réservés dans le modèle |
cli | chaîne de commandes IOS finales, ou Python si dans {{...}} |
sauvegarder | booléen pour indiquer qu'il faut enregistrer la configuration à la fin du script |
modèle | chaîne contenant un modèle de configuration avec des espaces réservés basés sur $ |
Les paramètres par défaut sont hérités par toutes les piles, mais les paramètres de pile ont la préférence. Par exemple : si la version par défaut est 16.6.5 et la version de la pile est 16.9.2, alors cette dernière est utilisée. Lorsque la variable DATA est renseignée, le script, les images IOS XE et les configurations peuvent être servis par n'importe quel serveur HTTP. Le modèle de configuration ne prend pas en charge les bannières multilignes, c'est une limitation de ZTP. Les expressions Python peuvent être utilisées dans la chaîne de commande cli finale. Par exemple pour utiliser le numéro de série dans un nom de fichier :
copy run http://10.0.0.1:8080/file/{{ztp['serial']}}.conf
Ou pour suspendre un instant l'exécution de la commande :
{{time.sleep(10)}}
Exemple de configuration de script.py pour une utilisation autonome sans application 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 ****'
}
]
Au lieu de saisir les données directement dans script.py , l'application GUI peut être utilisée pour saisir les données et servir les fichiers. Les mêmes noms de clé de la liste des dictionnaires qui définissent les données de l'appareil sont affichés dans l'application GUI. Exemple de configuration de script.py pour l'utilisation de l'application GUI :
SYSLOG = '10.0.0.1'
LOGAPI = 'http://10.0.0.1:8080/log'
JSON = 'http://10.0.0.1:8080/data'
DATA = []
L'application GUI se compose de deux composants :
En termes simples, le client Web récupère les données d'instruction du serveur et stocke les nouvelles données d'instruction sur le serveur saisies par l'utilisateur. Ensuite, script.py récupère ces données d'instruction, les exécute et stocke la sortie sur le serveur :
Les API REST fournies par app.py sont :
Appel | Description |
---|---|
OBTENIR /fichier/ | utilisé pour servir des fichiers et des sous-répertoires, tels que des images ou des configurations IOS XE |
SUPPRIMER /fichier/ | la requête supprime le fichier spécifié du disque |
METTRE /fichier/ | peut être utilisé pour télécharger des fichiers depuis IOS vers le serveur |
POST /fichier | utilisé par le formulaire client AJAX pour télécharger un fichier sur le serveur |
OBTENIR /liste | le serveur envoie une liste de texte JSON de tous les fichiers du répertoire et des sous-répertoires du script |
OBTENIR /données | dès réception de la demande, le serveur envoie l'ensemble de données sous forme de texte JSON au client/commutateur |
POST /données | le client envoie l'ensemble de données sous forme de texte JSON au serveur à l'aide de la méthode HTML POST |
OBTENIR /csv | dès réception de la demande, le serveur aplatit l'ensemble de données et l'exporte sous forme de fichier CSV |
POST /csv | le client envoie le fichier CSV avec l'ensemble de données aplati au serveur pour l'importation |
OBTENIR /log | dès réception de la demande, le serveur envoie les entrées du journal sous forme de texte JSON au client |
METTRE /journal | utilisé par script.py pour envoyer la sortie du flux de travail ZTP sous forme de texte JSON au serveur |
app.py valide le format des données pour chaque appel d'API. Les messages d'erreur provenant des appels d'API ayant échoué sont présentés dans l'interface graphique en renvoyant une réponse HTTP 500 avec une chaîne de message. Les fichiers et répertoires sont servis à partir du répertoire de travail actuel. L'API de liste d'annuaire renvoie uniquement les sous-répertoires. Les fichiers téléchargés sont placés par défaut dans le répertoire téléchargé .
Dans l'onglet Accueil, l'interface graphique répertorie toutes les exécutions enregistrées de script.py . L'interface graphique affiche des zones de texte pour chaque valeur de clé dans la liste de dictionnaires DATA de l'onglet Paramètres. Les zones de texte d'installation et de configuration sont des listes déroulantes avec les fichiers dans les sous-répertoires. La zone de texte de version est remplie automatiquement si la version IOS XE peut être extraite du nom de fichier. L'interface graphique prend également en charge le téléchargement de plusieurs fichiers sélectionnés dans l'onglet Fichiers :
Configurez un serveur DHCP pour desservir une plage avec l'option 67 définie sur : http://xxxx:8080/file/script.py
, où xxxx est l'adresse IP de la machine hébergeant app.py . Exemple de configuration sur un périphérique 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
Installez Bottle et Waitress à l'aide de PIP :
pip install bottle waitress
ou sur Ubuntu comme suit :
sudo apt-get install python-bottle python-waitress
Mettez app.py , index.html , main.js , style.css et script.py dans un répertoire et démarrez le backend du serveur sous Linux comme suit :
nohup python app.py &
L'application peut également être exécutée sous Windows. Python 2.7+ et 3.4+ sont pris en charge.
Comme alternative, l'application peut également être utilisée dans un conteneur Docker en exécutant les commandes suivantes :
docker build -t ztp .
docker run --rm -e ZTP_IP=192.168.0.4 -e ZTP_PORT=8080 -p 8080:8080 --name ztp ztp
Le script a été testé avec succès sur les plates-formes suivantes exécutant les logiciels 16.6.x et supérieurs :
Le script a été testé avec succès sur les plates-formes suivantes exécutant les logiciels 16.8.x et supérieurs :
Le script doit prendre en charge les plates-formes suivantes exécutant les logiciels 16.12.x et supérieurs :
Les plates-formes exécutant le logiciel 16.12.4 présentent un problème connu CSCvw63161 et vous pouvez utiliser l'implémentation alternative de l'installation automatique comme solution de contournement.
Ce script utilise une applet EEM pour l'installation du logiciel, qui nécessite une licence DNA Essentials.