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 mitsudo-Rechten aus (nötig, um/etc/network/interfaceszu 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),sourceundsource-directory. - Alles andere (wie
auto ens18oderiface...) zählt als „Altlast“.
- Sucht nach Zeilen, die nicht mit
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 Kette3|0|1wieder 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.
- Wenn Netplan-Datei da (
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“
- Verbinden zu allen Servern in
dimportVM. - Zählen von Dateien und Zeilen.
- Bewerten der Situation (OK, !!, WAIT).
- Sammeln aller Bewertungen auf deinem Rechner.
- Drucken der hübschen Tabelle.
