Cisco hat ZTP ab IOS
Wenn Ihre Hardware (z. B. 9200L) und/oder Software ZTP nicht unterstützt, können Sie die alternative AutoInstall-Implementierung verwenden.
Der erste Schritt besteht darin, zu prüfen, ob eine Startkonfiguration vorhanden ist. Wenn nicht, besteht der zweite Schritt darin, eine DHCP-Anfrage durchzuführen. Der dritte Schritt besteht darin, das in der DHCP-Antwort angegebene Skript herunterzuladen. Der vierte und letzte Schritt besteht darin, das Python-Skript in der Guest-Shell-Umgebung auszuführen. Die Guest Shell bleibt aktiviert, nachdem das Skript ausgeführt wurde.
Standardmäßig hat die Guest Shell über den RP-Management-Port Zugriff auf das Netzwerk. Wenn ein Gerät über die Anschlüsse auf der Vorderseite mit dem Netzwerk verbunden ist, verfügt die Guest Shell über keine Netzwerkverbindung. script.py verwendet CLI-Befehle wie copy
und more
, um auf das Netzwerk zuzugreifen.
script.py verfügt über die folgende integrierte Funktionalität:
script.py benötigt 4 Variablen, die vom Benutzer ausgefüllt werden müssen:
SYSLOG ist eine IP-Adresszeichenfolge des Syslog-Servers. Eine leere Zeichenfolge deaktiviert Syslog
LOGAPI ist eine Zeichenfolge mit der URL zur Protokoll-API. Eine leere Zeichenfolge deaktiviert die Statusmeldung
JSON ist eine Zeichenfolge mit der URL des JSON-codierten DATA-Objekts, wie unten angegeben. Eine leere Zeichenfolge deaktiviert das Herunterladen externer Gerätedaten.
DATA ist eine Liste von Diktaten, die Gerätedaten definieren. Eine leere Liste deaktiviert die internen Daten des Skripts. Um Gerätestandards anzugeben, lassen Sie den Schlüssel mit dem Namen „stack“ in einem Diktat weg. Gültige Schlüssel und Werte sind:
Schlüssel | Wert |
---|---|
Stapel | Diktieren Sie mit der Zielschalternummer als Schlüssel und der Seriennummer als Wert |
Version | Zeichenfolge mit der Zielversion, mit der ermittelt wird, ob ein Upgrade erforderlich ist |
base_url | Zeichenfolge mit Basis-URL zur optionalen Verknüpfung mit der Installations-/Konfigurations-URL |
installieren | Zeichenfolge mit der URL des herunterzuladenden Ziel-IOS |
config | Zeichenfolge mit der URL der herunterzuladenden Konfigurationsvorlage |
subst | dict mit Schlüsseln, die den Platzhaltern in der Vorlage entsprechen |
cli | Zeichenfolge der endgültigen IOS-Befehle oder Python, wenn innerhalb von {{...}} |
speichern | boolescher Wert, um anzugeben, dass die Konfiguration nach Abschluss des Skripts gespeichert werden soll |
Vorlage | String-haltende Konfigurationsvorlage mit $-basierten Platzhaltern |
Standardeinstellungen werden von allen Stacks übernommen, Stack-Einstellungen haben jedoch Vorrang. Beispiel: Wenn die Standardversion 16.6.5 und die Stack-Version 16.9.2 ist, wird letztere verwendet. Wenn die Variable DATA gefüllt ist, können das Skript, IOS XE-Bilder und Konfigurationen von jedem HTTP-Server bereitgestellt werden. Die Konfigurationsvorlage unterstützt keine mehrzeiligen Banner, dies ist eine Einschränkung von ZTP. Python-Ausdrücke können in der endgültigen CLI- Befehlszeichenfolge verwendet werden. Um beispielsweise die Seriennummer in einem Dateinamen zu verwenden:
copy run http://10.0.0.1:8080/file/{{ztp['serial']}}.conf
Oder um die Befehlsausführung für einen Moment anzuhalten:
{{time.sleep(10)}}
Beispielkonfiguration von script.py für Standalone-Nutzung ohne GUI-App:
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 ****'
}
]
Anstatt die Daten direkt in script.py einzugeben, kann die GUI-App verwendet werden, um die Daten einzugeben und die Dateien bereitzustellen. In der GUI-App werden dieselben Schlüsselnamen der Diktatliste angezeigt, die Gerätedaten definiert. Beispielkonfiguration von script.py für die GUI-App-Nutzung:
SYSLOG = '10.0.0.1'
LOGAPI = 'http://10.0.0.1:8080/log'
JSON = 'http://10.0.0.1:8080/data'
DATA = []
Die GUI-App besteht aus zwei Komponenten:
Vereinfacht ausgedrückt ruft der Web-Client die Befehlsdaten vom Server ab und speichert neue, vom Benutzer eingegebene Befehlsdaten auf dem Server. Dann ruft script.py diese Anweisungsdaten ab, führt sie aus und speichert die Ausgabe auf dem Server:
Die von app.py bereitgestellten REST-APIs sind:
Anruf | Beschreibung |
---|---|
GET /file/ | Wird zur Bereitstellung von Dateien und Unterverzeichnissen wie IOS XE-Bildern oder -Konfigurationen verwendet |
/Datei/ LÖSCHEN | Die Anfrage entfernt die angegebene Datei von der Festplatte |
PUT /Datei/ | kann zum Hochladen von Dateien von IOS auf den Server verwendet werden |
POST /Datei | Wird vom AJAX-Client-Formular zum Hochladen einer Datei auf den Server verwendet |
GET /list | Der Server sendet eine JSON-Textliste aller Dateien im Skriptverzeichnis und in den Unterverzeichnissen |
GET /data | Nach Erhalt der Anfrage sendet der Server den Datensatz als JSON-Text an den Client/Switch |
POST /Daten | Der Client sendet den Datensatz mithilfe der HTML-POST-Methode als JSON-Text an den Server |
GET /csv | Nach Erhalt der Anfrage reduziert der Server den Datensatz und exportiert ihn als CSV-Datei |
POST /csv | Der Client sendet die CSV-Datei mit dem vereinfachten Datensatz zum Importieren an den Server |
GET /log | Nach Erhalt der Anfrage sendet der Server die Protokolleinträge als JSON-Text an den Client |
PUT /log | Wird von script.py verwendet, um die ZTP-Workflow-Ausgabe als JSON-Text an den Server zu senden |
app.py validiert das Format der Daten für jeden API-Aufruf. Fehlermeldungen von fehlgeschlagenen API-Aufrufen werden in der GUI angezeigt, indem eine HTTP 500-Antwort mit einer Nachrichtenzeichenfolge zurückgegeben wird. Dateien und Verzeichnisse werden aus dem aktuellen Arbeitsverzeichnis bereitgestellt. Die Verzeichnislisten-API gibt nur Unterverzeichnisse zurück. Hochgeladene Dateien werden standardmäßig im hochgeladenen Verzeichnis abgelegt.
Auf der Registerkarte „Startseite“ listet die GUI alle protokollierten Ausführungen von „script.py“ auf. Die GUI zeigt Textfelder für jeden Schlüsselwert in der DATA-Liste der Diktate auf der Registerkarte „Einstellungen“ an. Die Textfelder „Installation“ und „Konfiguration“ sind Dropdown-Listen mit den Dateien in den Unterverzeichnissen. Das Versionstextfeld wird automatisch ausgefüllt, wenn die IOS XE-Version aus dem Dateinamen extrahiert werden kann. Die GUI unterstützt auch das Hochladen mehrerer ausgewählter Dateien auf der Registerkarte „Dateien“:
Konfigurieren Sie einen DHCP-Server für die Bereitstellung eines Bereichs, wobei Option 67 auf http://xxxx:8080/file/script.py
eingestellt ist, wobei xxxx die IP-Adresse des Computers ist, der app.py hostet. Beispielkonfiguration auf einem Cisco-Gerät:
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
Installieren Sie Bottle und Waitress mit PIP:
pip install bottle waitress
oder auf Ubuntu wie folgt:
sudo apt-get install python-bottle python-waitress
Legen Sie app.py , index.html , main.js , style.css und script.py in einem Verzeichnis ab und starten Sie das Server-Backend unter Linux wie folgt:
nohup python app.py &
Die App kann auch unter Windows ausgeführt werden. Python 2.7+ und 3.4+ werden unterstützt.
Alternativ kann die App auch in einem Docker-Container verwendet werden, indem die folgenden Befehle ausgeführt werden:
docker build -t ztp .
docker run --rm -e ZTP_IP=192.168.0.4 -e ZTP_PORT=8080 -p 8080:8080 --name ztp ztp
Das Skript wurde erfolgreich auf den folgenden Plattformen getestet, auf denen die Software 16.6.x und höher ausgeführt wird:
Das Skript wurde erfolgreich auf den folgenden Plattformen getestet, auf denen die Software 16.8.x und höher ausgeführt wird:
Das Skript sollte die folgenden Plattformen unterstützen, auf denen Software 16.12.x und höher ausgeführt wird:
Auf Plattformen, auf denen die Software 16.12.4 ausgeführt wird, tritt das bekannte Problem CSCvw63161 auf. Als Workaround können Sie die alternative AutoInstall-Implementierung verwenden.
Dieses Skript verwendet ein EEM-Applet für die Softwareinstallation, für das eine DNA Essentials-Lizenz erforderlich ist.