Ansible Playbook – Prüfen ob Netplan Aktiv ist

Dieses Ansible-Playbook dient als Diagnose-Werkzeug, um den Fortschritt deiner Netzwerk-Migration von der alten Methode (ifupdown) hin zu Netplan zu überwachen. Es verändert nichts am System, sondern führt eine Bestandsaufnahme durch.

---
- name: Report on Netplan Migration Status
  hosts: [all]  # <--- Replace with your group name or "all"
  become: true
  gather_facts: false
  tasks:
    - name: Check network configurations on servers
      shell: |
        LEGACY=$(grep -P '^(?!#|lo|source|source-directory).*' /etc/network/interfaces 2>/dev/null | wc -l)
        IF_D=$(ls -A /etc/network/interfaces.d/ 2>/dev/null | wc -l)
        NP=$(ls /etc/netplan/*.yaml 2>/dev/null | wc -l)
        echo "$LEGACY|$IF_D|$NP"
      register: check_results
      changed_when: false
      ignore_unreachable: true

    - name: Determine status logic
      set_fact:
        status_info: >-
          {% if check_results.stdout is not defined %}
          [OFFLINE] Host unreachable
          {% elif check_results.stdout.split('|')[2]|int > 0 and check_results.stdout.split('|')[0]|int == 0 and check_results.stdout.split('|')[1]|int == 0 %}
          [OK] Netplan active & clean
          {% elif check_results.stdout.split('|')[2]|int > 0 %}
          [!!] Netplan exists, but legacy config found
          {% else %}
          [WAIT] NO Netplan found (Legacy active)
          {% endif %}
      when: check_results is defined

- name: Display Result List
  hosts: localhost
  gather_facts: false
  tasks:
    - name: "Show Summary"
      pause:
        seconds: 2
        prompt: |
          
          ================================================================================
          NETPLAN MIGRATION STATUS REPORT (Generated: {{ now(fmt='%H:%M:%S') }})
          ================================================================================
          {% for host in groups['all'] | sort %}
          {% if hostvars[host].status_info is defined or hostvars[host].check_results is defined %}
          {{ host.ljust(40) }} : {{ hostvars[host].status_info | default('[OFFLINE] Connection failed') }}
          {% endif %}
          {% endfor %}
          ================================================================================
          NOTE: For [!!], please clean up /etc/network/interfaces!

Funktionsweise

1. Der Kopf des Playbooks (Zieldefinition)

- name: Report on Netplan Migration Status
  hosts: [all]
  become: true
  gather_facts: false
  • hosts: dimportVM: Legt fest, welche Gruppe aus deinem Inventory (/etc/ansible/hosts) angesprochen wird.
  • become: true: Ansible führt die Befehle mit sudo-Rechten aus (nötig, um /etc/network/interfaces zu lesen).
  • gather_facts: false: Schaltet das automatische Sammeln von Systeminfos (CPU, RAM etc.) ab. Das macht das Playbook deutlich schneller.

2. Die Analyse (Das Shell-Skript)

In diesem Abschnitt wird die „Detektivarbeit“ auf den Servern geleistet.

    - name: Check network configurations on servers
      shell: |
        LEGACY=$(grep -P '^(?!#|lo|source|source-directory).*' /etc/network/interfaces 2>/dev/null | wc -l)
        IF_D=$(ls -A /etc/network/interfaces.d/ 2>/dev/null | wc -l)
        NP=$(ls /etc/netplan/*.yaml 2>/dev/null | wc -l)
        echo "$LEGACY|$IF_D|$NP"
      register: check_results
  • grep -P '^(?!#|lo|source|source-directory).*':
    • Sucht nach Zeilen, die nicht mit # (Kommentar) beginnen.
    • Ignoriert lo (Loopback), source und source-directory.
    • Alles andere (wie auto ens18 oder iface...) zählt als „Altlast“.
  • ls -A ... | wc -l: Zählt, wie viele Dateien in den Ordnern liegen.
  • echo "$LEGACY|$IF_D|$NP": Gibt die drei Zahlen durch ein | getrennt aus (z.B. 3|0|1).
  • register: check_results: Speichert diese Ausgabe in einer Variable für den nächsten Schritt.
  • ignore_unreachable: true: Verhindert den Abbruch des gesamten Playbooks, wenn eine VM offline ist.

3. Die Logik (Status-Vergabe)

Hier entscheidet Ansible basierend auf den Zahlen, welcher „Stempel“ auf den Host kommt.

    - name: Determine status logic
      set_fact:
        status_info: >-
          {% if check_results.stdout is not defined %} [OFFLINE] ...
          {% elif check_results.stdout.split('|')[2]|int > 0 and check_results.stdout.split('|')[0]|int == 0 ... %} [OK] ...
          {% elif check_results.stdout.split('|')[2]|int > 0 %} [!!] ...
          {% else %} [WAIT] ...
          {% endif %}
  • set_fact: Erstellt eine neue Variable (status_info) direkt für diesen Host.
  • split('|'): Zerlegt die Kette 3|0|1 wieder in einzelne Zahlen.
  • Logik-Check:
    • Wenn Netplan-Datei da (> 0) UND Legacy-Zeilen weg (== 0) $\rightarrow$ OK.
    • Wenn Netplan-Datei da, aber Legacy-Zeilen auch noch da $\rightarrow$ [!!] Altlasten.

4. Der Bericht (Die Ausgabe)

Dieser Teil läuft nicht auf den Servern, sondern auf deinem eigenen Rechner (localhost).

- name: Display Result List
  hosts: localhost
  tasks:
    - name: "Show Summary"
      pause:
        seconds: 2
        prompt: |
          ...
          {% for host in groups['all'] | sort %}
          {% if hostvars[host].status_info is defined ... %}
          {{ host.ljust(40) }} : {{ hostvars[host].status_info }}
          {% endif %}
          {% endfor %}
  • hosts: localhost: Schaltet auf deinen lokalen Rechner um, um die Ergebnisse aller Server zu sammeln.
  • pause: Eigentlich zum Warten gedacht, nutzen wir es hier, um einen sauberen, unformatierten Textblock (ohne JSON-Klammern) auszugeben.
  • for host in groups['all'] | sort: Geht alle Hosts alphabetisch durch.
  • hostvars[host].status_info: Greift auf die Status-Variable zu, die wir im vorherigen Schritt auf dem jeweiligen Server gespeichert haben.
  • ljust(40): „Left Justify“ – füllt den Hostnamen mit Leerzeichen auf 40 Zeichen auf, damit die Doppelpunkte schön untereinander stehen.

Zusammenfassung: Der „Flow“

  1. Verbinden zu allen Servern in dimportVM.
  2. Zählen von Dateien und Zeilen.
  3. Bewerten der Situation (OK, !!, WAIT).
  4. Sammeln aller Bewertungen auf deinem Rechner.
  5. Drucken der hübschen Tabelle.
Nach oben scrollen