diff --git a/roles/common/tasks/fix-ifupdown-resolved-hook.yml b/roles/common/tasks/fix-ifupdown-resolved-hook.yml new file mode 100644 index 0000000..5791771 --- /dev/null +++ b/roles/common/tasks/fix-ifupdown-resolved-hook.yml @@ -0,0 +1,75 @@ +--- +# Workaround für einen ifupdown-Paketbug: /etc/network/if-up.d/resolved verwendet +# "return" auf oberster Ebene, was unter dash/bash fehlschlägt, wenn das Skript +# von run-parts direkt ausgeführt (nicht gesourced) wird. Das lässt "ifup"/ +# "systemctl restart networking" abbrechen, bevor Interfaces konfiguriert werden. +# +# Betroffen nur, wenn: +# - das Paket ifupdown installiert ist, UND +# - die Datei /etc/network/if-up.d/resolved existiert (d.h. systemd-resolved- +# Integration von ifupdown vorhanden) + +- name: ifupdown resolved-Hook prüfen und ggf. patchen (return-Bug) + tags: + - fix-ifupdown-resolved-hook + block: + - name: Paketfakten einlesen (für ifupdown-Check) + ansible.builtin.package_facts: + manager: apt + + - name: Vorhandensein von /etc/network/if-up.d/resolved prüfen + ansible.builtin.stat: + path: /etc/network/if-up.d/resolved + register: _ifupdown_resolved_hook + + # Benötigt das Ansible-Modul community.general.dpkg_divert aus der + # Collection "community.general" (nicht Teil von ansible-core). Da es bei + # euch keine requirements.yml gibt, muss die Collection einmalig manuell + # auf der Ansible-Control-Node installiert werden: + # + # ansible-galaxy collection install community.general + # + # Kontrolle, ob/welche Version bereits vorhanden ist: + # + # ansible-galaxy collection list community.general + # + # Empfehlung: Sobald eine requirements.yml existiert, dort ergänzen: + # + # collections: + # - name: community.general + # + # und künftig per "ansible-galaxy collection install -r requirements.yml" + # installieren/aktualisieren, statt manuell. + - name: ifupdown resolved-Hook divertieren und patchen + when: + - "'ifupdown' in ansible_facts.packages" + - _ifupdown_resolved_hook.stat.exists + block: + - name: Originaldatei divertieren (dpkg-divert --rename --add) + community.general.dpkg_divert: + path: /etc/network/if-up.d/resolved + state: present + rename: true + register: _resolved_hook_divert + + - name: Divertierte Version an Originalpfad kopieren (nur beim ersten Lauf) + ansible.builtin.copy: + src: /etc/network/if-up.d/resolved.distrib + dest: /etc/network/if-up.d/resolved + remote_src: true + force: false + owner: root + group: root + mode: "0755" + + - name: "Bugfix: return -> exit 0 (Fall 'interface leer')" + ansible.builtin.replace: + path: /etc/network/if-up.d/resolved + regexp: '(if \[ ! "\$interface" \]; then\n\s*)return(\n\s*fi)' + replace: '\1exit 0\2' + + - name: "Bugfix: return -> exit 0 (Fall 'interface = lo')" + ansible.builtin.replace: + path: /etc/network/if-up.d/resolved + regexp: '(if \[ "\$interface" = "lo" \]; then\n\s*)return(\n\s*fi)' + replace: '\1exit 0\2' diff --git a/roles/common/tasks/main.yml b/roles/common/tasks/main.yml index 0041d55..2ed579c 100644 --- a/roles/common/tasks/main.yml +++ b/roles/common/tasks/main.yml @@ -35,6 +35,21 @@ - ansible_facts['distribution'] == "Debian" tags: apt +# Workaround für einen ifupdown-Paketbug: /etc/network/if-up.d/resolved verwendet +# "return" auf oberster Ebene, was unter dash/bash fehlschlägt, wenn das Skript +# von run-parts direkt ausgeführt (nicht gesourced) wird. Das lässt "ifup"/ +# "systemctl restart networking" abbrechen, bevor Interfaces konfiguriert werden. +# +# Betroffen nur, wenn: +# - das Paket ifupdown installiert ist, UND +# - die Datei /etc/network/if-up.d/resolved existiert (d.h. systemd-resolved- +# Integration von ifupdown vorhanden) + +- name: Fix ifupdown resolved-Hook (return-Bug) + ansible.builtin.include_tasks: fix-ifupdown-resolved-hook.yml + tags: + - fix-ifupdown-resolved-hook + # tags supported inside extrepo.yml # # extrepo