Fehlerbehandlung ist einer der wichtigsten Unterschiede zwischen einem schnellen Lab-Skript und einem produktionsnahen Netzwerkskript. Ein Python-Programm, das im Test erfolgreich einen show-Befehl auf einem einzelnen Switch ausführt, ist noch lange nicht für den realen Betrieb geeignet. In produktionsnahen Umgebungen treten ständig Ausnahmen auf: Geräte sind nicht erreichbar, Zugangsdaten stimmen nicht, Prompts verhalten sich anders als erwartet, Kommandos liefern unvollständige Ausgaben oder Änderungen treffen auf einen unerwarteten Gerätezustand. Genau deshalb ist Fehlerbehandlung kein Zusatz, sondern ein zentraler Bestandteil robuster Netzwerkautomatisierung. Für Network Engineers bedeutet das: Ein gutes Skript muss nicht nur den Erfolgsfall beherrschen, sondern vor allem kontrolliert, nachvollziehbar und sicher mit Fehlern umgehen können.
Warum Fehlerbehandlung in Netzwerkskripten so entscheidend ist
Produktionsumgebungen sind nie vollständig sauber
Im Labor oder in einer Demo ist die Ausgangslage oft ideal. Geräte sind erreichbar, Zugangsdaten stimmen, die Plattform ist bekannt und die Befehle liefern exakt die erwartete Ausgabe. Im produktiven Netzwerk sieht das anders aus. Dort treffen Skripte auf echte Betriebsrealität.
- Einzelne Geräte sind temporär nicht erreichbar.
- AAA- oder Passwortprobleme treten auf.
- Geräte haben andere Softwarestände oder Prompts.
- CLI-Ausgaben unterscheiden sich je Plattform oder Version.
- Ein Change wurde manuell vorweggenommen oder nur teilweise ausgerollt.
Wenn ein Skript auf solche Situationen nicht vorbereitet ist, endet die Automatisierung oft mit einem Abbruch oder, schlimmer noch, mit einem unklaren Zwischenzustand.
Fehlerfreiheit ist kein realistisches Betriebsmodell
Ein produktionsnahes Skript darf nie darauf basieren, dass immer alles funktioniert. Gute Automatisierung geht davon aus, dass Fehler unvermeidlich sind, und gestaltet den Ablauf so, dass diese Fehler erkannt, eingeordnet und kontrolliert behandelt werden.
- Welche Fehler sind erwartbar?
- Welche Fehler sind tolerierbar?
- Bei welchen Fehlern soll der Ablauf abbrechen?
- Welche Informationen müssen im Fehlerfall sichtbar sein?
Genau diese Fragen machen aus einfachem Code ein belastbares Werkzeug für den realen Netzwerkbetrieb.
Was Fehlerbehandlung in Netzwerkskripten konkret bedeutet
Fehler erkennen, nicht nur abstürzen
Die einfachste Form schlechter Fehlerbehandlung ist der unkontrollierte Skriptabbruch. Ein Gerät antwortet nicht, ein Login schlägt fehl, und das gesamte Skript stoppt mit einer unspezifischen Python-Fehlermeldung. Im produktiven Betrieb ist das kaum hilfreich. Gute Fehlerbehandlung sorgt dafür, dass ein Fehler nicht nur technisch auftritt, sondern fachlich sinnvoll erkannt und gemeldet wird.
- Ist der Host nicht erreichbar?
- Ist die Authentifizierung fehlgeschlagen?
- Wurde ein ungültiger Befehl verwendet?
- Ist die Antwort leer oder unerwartet?
Ein Netzwerkskript sollte also nicht nur Fehler „fangen“, sondern sie auch für den Operator verständlich einordnen.
Fehler angemessen behandeln
Nicht jeder Fehler verlangt dieselbe Reaktion. Manche Probleme betreffen nur ein einzelnes Gerät und sollten protokolliert werden, während das Skript mit den übrigen Systemen fortfährt. Andere Fehler sind so grundlegend, dass ein Abbruch sinnvoller ist, etwa wenn eine zentrale Eingabedatei fehlt oder der Soll-Datensatz ungültig ist.
- Gerätefehler: meist lokal behandeln und weitermachen
- Globale Konfigurationsfehler: oft kontrolliert abbrechen
- Validierungsfehler: abhängig vom Risiko bewerten
- Write-Fehler: besonders sorgfältig dokumentieren und absichern
Damit wird klar: Fehlerbehandlung ist immer auch betriebliche Entscheidungslogik.
Typische Fehlerquellen in produktionsnahen Netzwerkskripten
Verbindungs- und Erreichbarkeitsprobleme
Die häufigsten Fehler entstehen bereits beim Verbindungsaufbau. Gerade in größeren Netzen wird immer ein Teil der Zielgeräte temporär oder dauerhaft nicht verfügbar sein.
- Falsche Management-IP
- Routing- oder ACL-Probleme
- SSH- oder API-Port nicht erreichbar
- Timeouts durch Überlast oder Paketverlust
Typische manuelle Prüfungen wären:
ping 192.0.2.10
ssh admin@192.0.2.10
Ein Skript muss diese Probleme erkennen, ohne den gesamten Ablauf unbrauchbar zu machen.
Authentifizierungs- und Berechtigungsprobleme
Auch wenn ein Gerät erreichbar ist, kann die Anmeldung scheitern. Ebenso kann ein Login technisch erfolgreich sein, aber nicht über die nötigen Rechte für bestimmte Befehle oder Konfigurationsänderungen verfügen.
- Falscher Benutzername oder falsches Passwort
- AAA-Probleme mit TACACS+ oder RADIUS
- Read-Only-Konto statt Write-Berechtigung
- Enable-Mode oder Privilege-Level nicht ausreichend
Gerade bei produktiven Write-Skripten muss klar erkennbar sein, ob ein Fehler an der Authentifizierung oder an unzureichenden Rechten liegt.
Plattform- und Prompt-Probleme
Nicht jedes Gerät verhält sich gleich. Unterschiedliche Plattformen, OS-Versionen oder sogar Banner können dazu führen, dass eine Bibliothek den Prompt falsch interpretiert oder ein Befehl anders reagiert als erwartet.
- Falscher
device_typein Netmiko - Abweichende CLI-Syntax
- Sondermeldungen oder interaktive Rückfragen
- Unterschiedliche Output-Formate
In heterogenen Umgebungen ist das eine der häufigsten Ursachen für schwer erkennbare Skriptfehler.
Daten- und Eingabefehler
Viele Probleme entstehen nicht auf dem Gerät, sondern in den Eingabedaten. Fehlerhafte YAML-Dateien, falsche Variablennamen oder unvollständige Geräteinformationen können einen gesamten Automatisierungsprozess beschädigen.
- Fehlende Felder in Inventardaten
- Ungültige IP-Adressen oder Hostnamen
- Fehlerhafte Templates
- Unvollständige Konfigurationsparameter
Diese Fehler müssen möglichst früh erkannt werden, idealerweise bevor überhaupt eine Verbindung zum Netzwerkgerät aufgebaut wird.
Grundprinzipien robuster Fehlerbehandlung
Erwartbare Fehler explizit behandeln
Ein produktionsnahes Skript sollte die wahrscheinlichsten Fehler nicht dem Zufall überlassen. Wer mit Netmiko arbeitet, sollte etwa Timeout- und Authentifizierungsfehler explizit behandeln. Wer APIs nutzt, sollte HTTP-Fehler und ungültige Antworten sauber prüfen.
Ein Beispiel mit Netmiko:
from netmiko import ConnectHandler
from netmiko.exceptions import NetMikoTimeoutException, NetMikoAuthenticationException
try:
with ConnectHandler(**device) as conn:
output = conn.send_command("show version")
print(output)
except NetMikoAuthenticationException:
print("Authentifizierung fehlgeschlagen.")
except NetMikoTimeoutException:
print("Verbindung fehlgeschlagen oder Timeout.")
except Exception as e:
print(f"Unerwarteter Fehler: {e}")
Diese Struktur ist deutlich belastbarer als ein Skript ohne gezielte Ausnahmebehandlung.
Zwischen erwarteten und unerwarteten Fehlern unterscheiden
Es ist sinnvoll, bekannte und häufige Fehler separat von wirklich unerwarteten Problemen zu behandeln. So werden Standardprobleme sauber eingeordnet, ohne unbekannte Zustände zu verschleiern.
- Erwartete Fehler: Timeouts, Login-Fehler, leere Antworten
- Unerwartete Fehler: Programmierfehler, unbekannte Bibliotheksreaktionen, korrupte Daten
Ein allgemeines except Exception sollte deshalb immer die letzte, nicht die einzige Verteidigungslinie sein.
Fehlerbehandlung beim Verbindungsaufbau
Der Verbindungsaufbau ist die erste kritische Stelle
Viele Netzwerkskripte scheitern bereits beim Session-Aufbau. Deshalb sollte dieser Abschnitt besonders robust gestaltet sein. Vor allem bei Massenoperationen ist wichtig, dass ein Gerätefehler nicht automatisch alle anderen Ziele blockiert.
Ein einfaches Muster:
for device in devices:
try:
with ConnectHandler(**device) as conn:
print(f"Verbunden mit {device['name']}")
except NetMikoAuthenticationException:
print(f"Authentifizierung fehlgeschlagen: {device['name']}")
except NetMikoTimeoutException:
print(f"Keine Verbindung oder Timeout: {device['name']}")
So bleibt der Fehler auf Geräteebene isoliert, während die restliche Zielgruppe weiter verarbeitet werden kann.
Vorabprüfungen als Fehlervermeidung
Fehlerbehandlung beginnt nicht erst bei try und except. Viele Probleme lassen sich schon durch Vorprüfungen vermeiden. Dazu gehören Konsistenzchecks der Eingabedaten, das Testen der Zielgruppe oder das Prüfen auf notwendige Parameter.
- Existiert die Inventardatei?
- Sind alle Gerätefelder vorhanden?
- Ist die Plattform korrekt gesetzt?
- Sind Pflichtparameter für die Aufgabe vorhanden?
Solche Validierungen reduzieren spätere Fehler erheblich.
Fehlerbehandlung bei Read-Only-Skripten
Leere oder unerwartete Ausgaben erkennen
Ein Read-Only-Skript kann technisch erfolgreich laufen und trotzdem unbrauchbare Ergebnisse liefern. Das passiert etwa, wenn ein Befehl keine Daten zurückgibt, ein Prompt falsch interpretiert wurde oder eine Plattform einen anderen Output erzeugt.
- Keine Ausgabe trotz erfolgreicher Session
- Fehlermeldung statt erwarteter Daten
- Parsing schlägt fehl
- Format der Ausgabe hat sich geändert
Ein robustes Skript prüft deshalb nicht nur, ob eine Verbindung existiert, sondern auch, ob die Rückgabe plausibel ist.
Beispiel:
output = conn.send_command("show ip interface brief")
if not output.strip():
raise ValueError("Leere Ausgabe bei 'show ip interface brief'")
Damit wird aus einer stillen Fehlannahme ein erkennbarer Validierungsfehler.
Parsing-Fehler gezielt behandeln
Wenn CLI-Text geparst wird, ist Fehlerbehandlung besonders wichtig. Parser können scheitern, wenn das Geräteformat unerwartet ist oder sich CLI-Ausgaben geändert haben. Solche Fehler sollten nicht unbemerkt durchlaufen.
- Fehlende Felder im Output
- Regulärer Ausdruck findet keinen Treffer
- TextFSM-Template passt nicht
- Datenstruktur ist unvollständig
Read-Only-Skripte wirken oft harmlos, aber gerade bei Compliance, Reporting und Inventarisierung sind fehlerhafte Daten gefährlich, weil sie falsche Entscheidungen vorbereiten können.
Fehlerbehandlung bei schreibenden Skripten
Write-Operationen brauchen strengere Kontrolle
Schreibende Skripte sind wesentlich kritischer als reine Ausleseprozesse. Deshalb muss die Fehlerbehandlung hier deutlich strenger sein. Es reicht nicht, nur zu erkennen, dass ein Gerät nicht erreichbar ist. Es muss auch klar werden, ob eine Konfiguration vollständig, teilweise oder gar nicht angewendet wurde.
- Wurde der gesamte Konfigurationssatz gesendet?
- Gab es Fehlermeldungen im CLI?
- Wurde die Konfiguration gespeichert oder nicht?
- Ist der Zielzustand nach dem Change wirklich erreicht?
Gerade Teilfehler sind besonders kritisch: Ein Gerät könnte die ersten Zeilen akzeptieren, aber an einer späteren Stelle scheitern. Ohne Post-Check bleibt das oft unbemerkt.
Post-Checks als Teil der Fehlerbehandlung
Ein produktionsnahes Write-Skript sollte nach der Änderung aktiv prüfen, ob der gewünschte Zustand tatsächlich eingetreten ist. Das ist keine Kür, sondern Teil robuster Fehlerbehandlung.
Typische Validierungen:
show running-config | include ntp
show running-config | include logging
show ip ssh
Wenn der Zielzustand nicht erreicht wurde, muss das Skript dies explizit als Fehler oder zumindest als fehlgeschlagenen Status kennzeichnen.
Logging und Nachvollziehbarkeit im Fehlerfall
Fehler nicht nur anzeigen, sondern protokollieren
Eine Konsolenausgabe allein reicht in produktionsnahen Umgebungen selten aus. Fehler, Erfolgsmeldungen und Zwischenschritte sollten protokolliert werden, damit sie später nachvollzogen und ausgewertet werden können.
- Welches Gerät war betroffen?
- Wann trat der Fehler auf?
- Welche Aktion wurde versucht?
- Welche Ausnahme oder Rückgabe wurde erkannt?
Ein strukturiertes Python-Logging ist dafür besser geeignet als verstreute print()-Ausgaben. Selbst wenn man am Anfang mit einfachen Konsolenmeldungen startet, sollte der Weg zu sauberem Logging früh vorgesehen werden.
Fehlerberichte für Massenläufe zusammenfassen
Wenn ein Skript gegen viele Geräte läuft, ist ein zusammenfassender Ergebnisbericht besonders wichtig. Sonst bleiben Fehler an Einzelgeräten im Gesamtoutput leicht verborgen.
- Erfolgreiche Geräte zählen
- Fehlgeschlagene Geräte auflisten
- Fehlerarten unterscheiden
- Manuelle Nacharbeit gezielt ermöglichen
Damit wird das Skript auch operativ besser nutzbar.
Sichere Abbruchlogik definieren
Wann ein Skript weitermachen darf
Nicht jeder Fehler muss zum kompletten Abbruch führen. Wenn bei einem Backup-Lauf ein einzelner Switch nicht erreichbar ist, sollte das Skript meist mit den anderen Geräten fortfahren. Diese lokale Fehlerisolation ist besonders bei großen Zielgruppen wichtig.
- Gerätespezifische Fehler lokal behandeln
- Restliche Geräte weiter verarbeiten
- Fehlerliste für Nacharbeit erstellen
Wann ein Skript abbrechen sollte
Es gibt jedoch Fehler, bei denen ein kontrollierter Gesamt-Abbruch sinnvoll oder notwendig ist. Das gilt vor allem, wenn die Grundlage des gesamten Laufs nicht mehr vertrauenswürdig ist.
- Inventardatei fehlt oder ist defekt
- Pflichtvariablen sind ungültig
- Templates sind fehlerhaft
- Der Zielzustand ist fachlich nicht berechenbar
- Bei Write-Prozessen schlägt eine globale Vorprüfung fehl
Ein gutes Skript unterscheidet also sauber zwischen lokalen und globalen Fehlern.
Fehlerbehandlung und Idempotenz zusammen denken
Unerwartete Zustände vor dem Change erkennen
Fehlerbehandlung hat viel mit Idempotenz zu tun. Wenn ein Gerät bereits in einem unerwarteten Zustand ist, sollte ein Skript das erkennen, bevor es blind Änderungen sendet. Sonst wird aus einer Automation schnell ein riskanter Überschreibungsprozess.
- Ist der erwartete Ausgangszustand vorhanden?
- Fehlt bereits eine Basisparametergruppe?
- Gibt es manuelle Sonderkonfigurationen?
- Ist eine Pilotvalidierung erfolgreich gewesen?
Gerade bei produktiven Rollouts ist dies essenziell.
Keine stillen Teil-Erfolge akzeptieren
Ein Skript darf nicht so tun, als sei alles erfolgreich gewesen, wenn nur ein Teil der gewünschten Änderung oder Auswertung funktioniert hat. Teil-Erfolge müssen sichtbar sein, sonst sinkt das Vertrauen in die Automatisierung.
Typische Anti-Patterns in produktionsnahen Netzwerkskripten
Alles in einem großen try/except-Block verstecken
Ein häufiger Fehler besteht darin, das komplette Skript in einen einzigen allgemeinen Fehlerblock zu packen. Dadurch geht die Differenzierung verloren, und die eigentliche Ursache bleibt unklar.
Nur print() statt strukturierter Statuswerte
Reine Konsolenmeldungen sind für erste Tests hilfreich, aber für produktionsnahe Skripte zu wenig. Ein Skript sollte idealerweise intern zwischen Erfolg, Warnung und Fehler unterscheiden und diese Ergebnisse gezielt weitergeben oder protokollieren.
Passwörter, Hosts und Logik ungeordnet mischen
Wenn Geräteparameter, Secrets, Parsing und Change-Logik ungeordnet im Skript stehen, wird Fehlerbehandlung unnötig schwierig. Strukturierter Code vereinfacht auch strukturierte Fehlerbehandlung.
Fehler verschlucken
Ein besonders gefährlicher Anti-Pattern ist das stillschweigende Ignorieren von Fehlern. Ein Skript, das Ausnahmen fängt, aber weder protokolliert noch fachlich bewertet, ist im Betrieb kaum vertrauenswürdig.
Best Practices für Fehlerbehandlung in produktionsnahen Netzwerkskripten
- Erwartbare Fehlerarten wie Timeouts, Authentifizierungsprobleme und leere Antworten explizit behandeln.
- Zwischen lokalen Gerätefehlern und globalen Skriptfehlern klar unterscheiden.
- Vor Write-Operationen Eingabedaten und Ausgangszustände aktiv validieren.
- Fehler nicht nur technisch abfangen, sondern fachlich verständlich melden.
- Read-Only- und Write-Skripte unterschiedlich streng behandeln.
- Post-Checks als festen Teil schreibender Automatisierung einbauen.
- Fehler und Ergebnisse strukturiert loggen statt nur auf der Konsole auszugeben.
- Teil-Erfolge und Teilfehler sichtbar machen, besonders bei Massenläufen.
- Keine Passwörter oder kritischen Daten ungeordnet im Fehleroutput preisgeben.
- Fehlerbehandlung schon für kleine Skripte mitdenken, statt sie erst spät nachzurüsten.
Damit wird Fehlerbehandlung zu einem zentralen Qualitätsmerkmal produktionsnaher Netzwerkskripte. Sie entscheidet darüber, ob Automatisierung im Ernstfall belastbar bleibt, ob Ergebnisse nachvollziehbar sind und ob ein Team einem Skript auch dann vertrauen kann, wenn eben nicht alles nach Plan läuft. Genau diese Robustheit trennt einen schnellen Testcode von einem Werkzeug, das im realen Netzwerkbetrieb dauerhaft einsetzbar ist.
Konfiguriere Cisco Router & Switches und liefere ein Packet-Tracer-Lab/GNS3
Ich biete professionelle Unterstützung im Bereich Netzwerkkonfiguration und Network Automation für private Anforderungen, Studienprojekte, Lernlabore, kleine Unternehmen sowie technische Projekte. Ich unterstütze Sie bei der Konfiguration von Routern und Switches, der Erstellung praxisnaher Topologien in Cisco Packet Tracer, dem Aufbau und Troubleshooting von GNS3- und EVE-NG-Labs sowie bei der Automatisierung von Netzwerkaufgaben mit Netmiko, Paramiko, NAPALM und Ansible. Kontaktieren Sie mich jetzt – klicken Sie hier.
Meine Leistungen umfassen:
-
Professionelle Konfiguration von Routern und Switches
-
Einrichtung von VLANs, Trunks, Routing, DHCP, NAT, ACLs und weiteren Netzwerkfunktionen
-
Erstellung von Topologien und Simulationen in Cisco Packet Tracer
-
Aufbau, Analyse und Fehlerbehebung von Netzwerk-Labs in GNS3 und EVE-NG
-
Automatisierung von Netzwerkkonfigurationen mit Python, Netmiko, Paramiko, NAPALM und Ansible
-
Erstellung von Skripten für wiederkehrende Netzwerkaufgaben
-
Dokumentation der Konfigurationen und Bereitstellung nachvollziehbarer Lösungswege
-
Konfigurations-Backups, Optimierung bestehender Setups und technisches Troubleshooting
Benötigen Sie Unterstützung bei Ihrem Netzwerkprojekt, Ihrer Simulation oder Ihrer Network-Automation-Lösung? Kontaktieren Sie mich jetzt – klicken Sie hier.












