IT-Admin.tech

Netzwerkautomation mit Ansible: Playbooks für Switch‑Config, Backups und Rollbacks

Ansible Control‑Node Diagramm: SSH/NETCONF Verbindungen zu Switches, Backup‑Repository und Rollback‑Pfad
Systemdiagramm: Ansible‑Control‑Node holt Switch‑Configs, speichert Backups und ermöglicht kontrollierte Rollbacks — visualisiert für Betriebsdokumentation.

Netzwerkautomation mit Ansible ist in vielen IT‑Teams der Schlüssel, um wiederkehrende Switch‑Änderungen, regelmäßige Konfigurationsbackups und kontrollierte Rückrollvorgänge reproduzierbar und auditierbar zu machen. Dieses Praxis‑Howto richtet sich an Administratoren, System Engineers und Operatoren und erklärt Schritt für Schritt Voraussetzungen, typische Stolperfallen, konkrete Playbook‑Beispiele und sichere Prüf‑ und Rückfallstrategien.

Warum Netzwerkautomation? Ziele und kurz die Begriffe

Netzwerkautomation reduziert manuelle Fehler, beschleunigt Rollouts und verbessert Nachvollziehbarkeit. In diesem Beitrag verwenden wir Ansible als Orchestrierungswerkzeug. Ansible ist ein agentenloses Automations‑Tool: Der Kontrollknoten (Ansible‑Control‑Node) verbindet sich per SSH oder speziellen Netzwerk‑Verbindungsplugins mit Geräten und führt deklarative Aufgaben (Playbooks) aus.

Wichtige Begriffe in einem Satz: Playbook (YAML‑Datei mit Aufgaben), Inventory (Geräte‑Liste), Connection Plugins (z. B. network_cli für Switches), idempotenz (Wiederholbarkeit ohne Seiteneffekte) und Rollback (Wiederherstellung einer vorherigen Konfiguration).

Kurzüberblick der Betriebsanforderungen

  • Kontrollknoten: Ansible 2.15+ oder moderne 2.x‑Version; Python und notwendige Collections (z. B. ansible.netcommon, community.general, ggf. vendor‑Collections wie cisco.ios).
  • Zugriff: SSH‑Zugang mit ausreichenden Berechtigungen (optional enable/privilege‑Passwort). Netzwerkgeräte müssen vom Control‑Node erreichbar sein.
  • Inventarisierung: Saubere Inventories und group_vars für Zugangsdaten; Secrets über Ansible Vault oder ein Secrets‑Backend (z. B. HashiCorp Vault) verwalten.
  • Testumgebung: Lab oder Staging mit einem oder wenigen Geräten, um Playbooks vor Produktionseinführung zu prüfen.

Netzwerkautomation mit Ansible: Grundlegende Inventory‑Struktur

Ein nachvollziehbares Inventory ist die Basis. Hier ein einfaches INI‑Beispiel, das viele Teams noch nutzen:

Shell
[switches]
sw-core-01 ansible_host=10.0.1.10 ansible_network_os=ios
sw-access-01 ansible_host=10.0.1.20 ansible_network_os=ios

[all:vars]
ansible_user=netadmin
ansible_connection=network_cli
ansible_become=yes
ansible_become_method=enable

Erklärung: ansible_network_os hilft Ansible, das passende Modul/Prompt‑Handling zu wählen; network_cli ist das Connection‑Plugin für CLI‑basierte Switches. Vorrangig sollten sensible Daten (Passwörter, SSH‑Keys) nicht im Inventory stehen, sondern per Vault oder Ansible‑Credential‑Management verwaltet werden.

Playbook: Konfigurations‑Backup sammeln

Backups sind die meist unterschätzte Komponente. Hier ein robustes Playbook, das die laufende Konfiguration abruft und lokal auf dem Control‑Node ablegt. Es verwendet das generische Modul ansible.netcommon.cli_command (funktioniert mit vielen Herstellern) und speichert die Ausgabe über eine lokale Aktion.

Yaml
---
- name: Collect running-config backups from switches
  hosts: switches
  gather_facts: no
  connection: network_cli
  tasks:
    - name: Get running configuration
      ansible.netcommon.cli_command:
        command: show running-config
      register: running_cfg

    - name: Ensure backup directory exists on control node
      local_action:
        module: file
        path: "backups/{{ inventory_hostname }}"
        state: directory
        mode: '0750'

    - name: Save running configuration to control node
      local_action:
        module: copy
        content: "{{ running_cfg.stdout[0] | default('') }}n"
        dest: "backups/{{ inventory_hostname }}/{{ inventory_hostname }}-{{ ansible_date_time.iso8601_basic }}.cfg"
        mode: '0640'

Warum so? Das Playbook trennt Gerätedaten (holt per SSH) und Backup‑Speicherung (Control‑Node lokal). Das vereinfacht Prüfung, Versionskontrolle und sichere Archivierung. Achten Sie auf Zeitstempelformat (ISO8601) und sichere Dateimodi.

Prüfen, bevor Sie starten

  • Testzugang prüfen: Führen Sie einen einfachen ad‑hoc‑Befehl aus:
Shell
ansible switches -m ansible.netcommon.cli_command -a "command='show version'" -i inventory.ini

Wenn das scheitert, prüfen Sie: Ansible‑Version, Connection‑Plugin, Netzwerkzugang, Zugangsdaten und Prompt‑Erkennung (timeout, enable‑passwort).

Playbook: Konfigurationsänderung (Push) mit Diff und Check‑Mode

Für Änderungs‑Playbooks sollten Sie möglichst idempotente, modulbezogene Vorgehensweisen verwenden. Viele Hersteller‑Collections (z. B. cisco.ios.ios_config) implementieren idempotente Logiken. Falls das nicht möglich ist, nutzen Sie cli_config mit –check bzw. diff‑Optionen.

Yaml
---
- name: Deploy interface description to access switches
  hosts: switches
  gather_facts: no
  connection: network_cli
  tasks:
    - name: Apply interface configuration lines
      ansible.netcommon.cli_config:
        lines:
          - interface GigabitEthernet1/0/48
          - description "PRD: uplink to router"
          - switchport mode access
          - switchport access vlan 100
      register: cfg_result

    - name: Show diff when changed
      debug:
        var: cfg_result.diff

Operationen erst in einer einzelnen Test‑Device‑Gruppe ausführen, dann in Batches. Verwenden Sie beim Testen ansible-playbook --check --diff um Risiken zu minimieren; beachten Sie, dass nicht alle Netzwerkmodule Check‑Mode vollständig unterstützen.

Rollback‑Strategien: Arten und Umsetzung

Rollback ist kein One‑Click für alle Geräte. Es gibt drei pragmatische Ansätze:

  1. Vendor‑native Wiederherstellung (empfohlen): Nutzen Sie geräteeigene Funktionen wie configure replace (unterstützt von vielen Cisco IOS‑XEs) oder Junos rollbacks. Diese sind oft atomar und minimieren inkonsistente Übergänge.
  2. Push des letzten bekannten guten Backups: Laden Sie die Backup‑Datei und schreiben Sie Zeile für Zeile per cli_config. Das ist breiter einsetzbar, kann aber inkonsistente Zwischenzustände erzeugen.
  3. Konfigurations‑Vergleich und selektiver Revert: Ermitteln Sie nur die geänderten Zeilen und wenden Sie selektive Korrekturen an. Aufwändiger, aber risikoärmer in heterogenen Umgebungen.

Beispiel: Einfacher Rollback (Push gespeicherter Datei)

Yaml
---
- name: Rollback config by pushing saved file content
  hosts: switches
  gather_facts: no
  connection: network_cli
  vars:
    rollback_file: "backups/{{ inventory_hostname }}/{{ inventory_hostname }}-20260728T120000Z.cfg"
  tasks:
    - name: Read rollback file on control node
      local_action:
        module: slurp
        src: "{{ rollback_file }}"
      register: rollback_raw

    - name: Decode rollback content
      set_fact:
        rollback_text: "{{ rollback_raw.content | b64decode }}"

    - name: Apply rollback configuration via CLI
      ansible.netcommon.cli_config:
        lines: "{{ rollback_text.split('n') }}"
      register: rb_result

    - name: Debug apply result
      debug:
        var: rb_result

Achtung: Diese Methode schreibt praktisch alle Zeilen. Testen Sie das in einer Laborumgebung. Probleme entstehen, wenn das gespeicherte Backup proprietäre Konsolenbefehle, temporäre Schnittstellen‑States oder nicht persistente Einträge enthält.

Sichere Betriebsregeln und Checkliste vor Änderungen

Vor jeder Änderung sollten die folgenden Prüfungen automatisiert bzw. dokumentiert werden:

  • Backup vorhanden und getestet (siehe Playbook).
  • Change‑Window definiert und Stakeholder informiert.
  • Testlauf in Check‑Mode oder auf Staging‑Device gemacht.
  • Serialität: Änderungen in kleinen Batches (serial: 1–5 in Ansible) ausrollen, um Massenstörfälle zu vermeiden.
  • Validierung: Nach Änderung automatisierte Prüfungen (Ping, BGP‑Neighbors, VLAN‑Membership) laufen lassen.
  • Rollback‑Playbook griffbereit und getestete Restore‑Prozedur vorhanden.

Typische Stolperfallen und wie Sie sie lösen

1) Authentifizierungs‑ und Prompt‑Probleme

Fehlerbilder: Timeouts, unerwartete Prompts, fehlende Enable‑Rechte. Ursachen: falsches ansible_connection, fehlende privilege escalation, unterschiedliche Prompt‑Strings. Lösung: group_vars für ansible_become, ansible_become_password oder Einsatz von SSH‑Keys und prüfender ad‑hoc‑Test mit show version. Konfigurieren Sie, falls nötig, timeout‑Parameter und prüfen Sie interaktive Prompt‑Strings in ansible.cfg.

2) fehlende Idempotenz

Wenn Sie rohe CLI‑Befehle nutzen, sind Aktionen oft nicht idempotent (bei jedem Run Änderung). Besser: vendor‑spezifische Konfigurationsmodule (z. B. cisco.ios.ios_config), die Status‑Abgleich durchführen. Wenn das nicht geht, erzeugen Sie eigene Vergleichslogiken (diff vor/nach, Hashes).

3) Parallelität führt zu Netzstörungen

Massive gleichzeitige Changes können Abhängigkeiten verletzen (z. B. STP, LACP). Nutzen Sie in Ansible serial in Ihren Plays oder rollenweise Ausführungen über Tags. Beispiel:

Yaml
- hosts: switches
  serial: 3
  tasks:
    - name: Apply change
      ...

4) Unvollständige Backups

Manche Geräte liefern nur Teile der Konfiguration oder benötigen spezielle Befehle für Persistenz. Verifizieren Sie Backups regelmäßig durch automatisierte Restore‑Tests in einem Lab.

Validierung und Monitoring nach Änderung

Automatisierte Prüfungen sind Pflicht. Beispielhafte Prüfungen, die unmittelbar nach einer Änderung laufen sollten:

  • ICMP‑Reachability für kritische Pfade.
  • Neighbor‑Status (BGP/OSPF) für angrenzende Router.
  • VLAN‑Prüfung und Port‑Status für betroffene Access‑Ports.
  • SNMP/Telemetry‑Metriken (Latenz, Error‑Rates) beobachten – Anomalien signalisieren potenzielle Probleme.

Ein kleines Beispiel, wie Sie eine Post‑Change‑Prüfung als Playbook realisieren:

Yaml
---
- name: Post-change validation
  hosts: switches
  gather_facts: no
  connection: network_cli
  tasks:
    - name: Check interface up status
      ansible.netcommon.cli_command:
        command: show interfaces status
      register: intf_status

    - name: Fail if critical port is down
      fail:
        msg: "Critical interface down on {{ inventory_hostname }}"
      when: "'Gi1/0/48' in intf_status.stdout[0] and 'notconnect' in intf_status.stdout[0]"

Audit, Archivierung und Retention

Backups sollten versioniert, geprüft und archiviert werden. Empfehlenswert ist ein Ansatz mit Git‑Repository für Text‑Backups (nur für Konfigurationstexte) kombiniert mit Objekt‑Storage für Langzeitarchiv (z. B. S3). Prüfen Sie folgende Punkte:

  • Integrität: regelmäßige Hash‑Checks.
  • Retention‑Policy: gesetzliche/fraktionelle Aufbewahrungsfristen definieren.
  • Zugriffskontrolle: wer darf Restore auslösen? (Role‑Based Controls)

Praxisbeispiel: Minimaler Workflow für einen Change

  1. Playbook in Repo aktualisieren, Merge Request mit Review durchführen.
  2. Auf Staging‑Switch dry‑run (–check) ausführen.
  3. Automatisches Backup vor Change erstellen.
  4. Change in kleinen Batches mit Live‑Monitoring ausrollen.
  5. Post‑Checks automatisch laufen lassen; bei Fehlern automatisches Rollback triggern.

Troubleshooting: Wichtige Prüfsequenz

  1. Verbindungstest: ad‑hoc Aufgabe wie oben (show version).
  2. Logs prüfen: Ansible verbose Mode -vvv zeigt SSH‑Dialog und Prompt‑Erkennung.
  3. Prompt/Expect‑Probleme: Prüfen, ob Modulprompt (ansible_network_os) korrekt gesetzt ist.
  4. Timeouts: erhöhen Sie ansible_connection_timeout in group_vars falls nötig.
  5. Rollback vorher testen: Spielen Sie Restore in einer isolierten Umgebung durch.

Netzwerkautomation mit Ansible: CI/CD, Secrets und Telemetrie integrieren

Integration in CI/CD‑Pipelines macht Changes nachvollziehbar und auditierbar. Ein typischer Ablauf ist: Merge Request → automatischer Lint/Unit‑Test der Playbooks → Dry‑Run in einem Lab → Genehmigungsstufe → sequenzielles Rollout. Nutzen Sie für Secrets Ansible Vault oder ein dediziertes Secret‑System (z. B. HashiCorp Vault). Vault erlaubt dynamische Credentials und reduziert das Risiko von long‑lived Passworten.

Telemetry (z. B. gNMI, streaming telemetry, SNMP Traps) ergänzt Automatisierung mit Echtzeit‑Metriken. Nach einem Change sollten Telemetry‑Alerts automatisch mit dem Change‑Context verbunden werden (Change‑ID, Run‑ID) — so erkennen Sie, ob ein Alarm durch die Änderung verursacht wurde.

Beispiel: CI‑Step, der ein Playbook im Check‑Mode ausführt

Shell
#!/bin/bash
# CI step: run playbook in check mode and fail on changes
ansible-playbook -i inventory.ini change_playbook.yml --check --diff
if [ $? -ne 0 ]; then
  echo "Check mode failed or would change devices" >&2
  exit 1
fi

Atomicere Rollbacks: Vendor‑native Replace

Wenn Ihre Plattform configure replace oder ein äquivalentes atomisches Replace‑Verfahren unterstützt, nutzen Sie es. Das reduziert die Gefahr von Zwischenzuständen. Beispiel für Cisco IOS‑XEs mit einem vendor‑Modul (conceptual example):

Yaml
---
- name: Atomic replace from candidate file (vendor-specific)
  hosts: switches
  gather_facts: no
  connection: network_cli
  tasks:
    - name: Replace running-config atomically
      cisco.ios.ios_config:
        src: "backups/{{ inventory_hostname }}/candidate.cfg"
        replace: yes
        save_when: modified

Hinweis: Parameter heißen je nach Collection unterschiedlich. Prüfen Sie die Dokumentation Ihrer vendor‑Collection und testen Sie das Verfahren intensiv in der Lab‑Umgebung.

Monitoraggio: Checklisten, Betriebswissen und Best Practices

Für nachhaltigen Betrieb sind Monitoring‑ und Prüfmechanismen entscheidend. Empfehlungen:

  • Automatisierte Restore‑Tests mindestens quartalsweise in einer isolierten Umgebung.
  • Differenz‑Checks nach jedem Backup: Erzeugen Sie einen Hash (z. B. SHA256) und speichern Sie ihn als Metadaten.
  • Change‑Context an Monitoring anhängen: Run‑ID, Commit‑Hash, Operator, Ticketnummer.
  • Alert‑Playbooks: Bei kritischen Alarmen automatisches Rollback oder Escalation‑Trigger je nach Policy.

Beispiel: Hash‑Erzeugung und Metadaten‑Speicherung nach Backup:

Shell
sha256sum backups/sw-core-01/sw-core-01-20260728T120000Z.cfg > backups/sw-core-01/metadata.txt
echo "commit: $GIT_COMMIT" >> backups/sw-core-01/metadata.txt
echo "run_id: $CI_RUN_ID" >> backups/sw-core-01/metadata.txt

Notfall‑Runbook: Manuelle Wiederherstellung und OOB‑Zugriff

Wenn automatisches Rollback versagt, ist ein klares Runbook nötig. Kurzfassung:

  1. OOB‑Konsole prüfen (Console‑Server, IPMI/Redfish) — sichert Zugriff, wenn Netz nicht erreichbar ist.
  2. Letztes intaktes Backup identifizieren (Metadaten prüfen: Timestamp, SW‑Version).
  3. Rollback lokal auf Konsole laden oder per TFTP/USB applizieren.
  4. Basischecks: Interfaces up, Routing/Neighbors, Critical ACLs.
  5. Detaillierte Post‑Checks und Ticket‑Closure nach bestätigtem Erfolg.

Fazit: Praktischer Rat für den Betrieb

Netzwerkautomation mit Ansible schafft Transparenz und Geschwindigkeit — vorausgesetzt, Sie investieren in Inventar‑Hygiene, Backup‑Disziplin, getestete Rollback‑Prozeduren und eine schrittweise Einführungsstrategie. Verwenden Sie vendor‑spezifische Module, wo sinnvoll, automatisieren Sie Validierungsskripte und behalten Sie strikte Zugriffs‑ und Retention‑Regeln bei. Bei heterogenen Geräten sind pragmatische Backup‑ und selektive Rollback‑Strategien die sicherste Wahl.

Konkreter Startpunkt: legen Sie ein Backup‑Playbook wie oben an, testen Sie es gegen ein Staging‑Switch, und erweitern Sie dann Schritt für Schritt Ihre Change‑Playbooks mit Check‑Mode, Diff‑Ausgaben und serialisierten Rollouts. Ergänzen Sie dies mit CI/CD, Telemetry‑Integration und regelmäßigen Restore‑Tests, um die betrieblichen Risiken nachhaltig zu verringern.

Für dieses Thema sind auch Ansible Playbooks und Switch-Konfiguration wichtig. Der Beitrag ordnet diese Aspekte verständlich ein und zeigt, worauf es im Alltag ankommt.

Weiterfuehrend

Passende weitere Inhalte