Ansible role for GRE backbone tunnels (alternative to lib/gre.sh) - #5
Draft
oliverlorenz wants to merge 1 commit into
Draft
Ansible role for GRE backbone tunnels (alternative to lib/gre.sh)#5oliverlorenz wants to merge 1 commit into
oliverlorenz wants to merge 1 commit into
Conversation
Models the setup and monitoring behavior of lib/gre.sh (ip link/ip addr commands plus the ping-based watchdog cron) as a declarative gre_tunnels role using systemd-networkd .netdev/.network units and a systemd timer, instead of imperative shell run from the init script. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Kontext
lib/gre.shbaut und überwacht die GRE-Backbone-Tunnel zu den anderen Freifunk-Chemnitz-Servern imperativ per Shell, aufgerufen ausffc-server.sh(start/stop) bzw.initd-ffc.sh watchdog(Cron, jede Minute). Dieser PR bildet dieselbe Funktionalität als deklarative Ansible-Rolle ab, als Grundlage für eine schrittweise Ablösung der Shell-Skripte durch Ansible. Die bestehenden Skripte werden nicht verändert oder entfernt.Bisherige Funktionsweise (
lib/gre.sh)Aufbau der Tunnel (
gre_add_tunnel, aufgerufen für jeden Eintrag inGRE_PEERSaußer dem eigenen Server übergre_add_all_tunnels):ip link add gre-<peer> type gretap remote <peer-ip> local $WANIP ttl 255ip addr add 169.254.<WANIP.o3>.<WANIP.o4> peer 169.254.<peer-ip.o3>.<peer-ip.o4>/32 scope link dev gre-<peer>ip -6 addr add fe80::ffc:<hex(WANIP.o3)>:<hex(WANIP.o4)>/64 dev gre-<peer>ip link set mtu 1426 up dev gre-<peer>Das läuft bei jedem
ffc-server.sh starterneut ab; es gibt keine Prüfung, ob ein Tunnel bereits existiert (ip link addschlägt dann fehl, wird aber nicht separat behandelt).Abbau (
gre_stop): findet alle laufendengre-*-Interfaces über/proc/net/devund löscht sie perip link delete.Überwachung (
gre_cron, ausffc_watchdogalle 5 Minuten aufgerufen, wenn per Cron* * * * * initd-ffc.sh watchdogeingerichtet ist): für jedes laufendegre-*-Interface wirdping6 -c5 -i1 ff02::2%<iface>ausgeführt und aufDUP-Antworten (Duplicate Address, d.h. mehrere Router haben geantwortet) geprüft. Kommt keineDUP-Antwort, gilt der Tunnel als down undlog_errorwird aufgerufen, was den Fehler nach Syslog schreibt (logger) und – nur wennIS_CRON=1gesetzt ist – zusätzlich eine Mail anLOG_TOschickt.Konfiguration:
WANIF,WANIP,GRE_PEERS(Array"host:ip") undLOG_TOkommen ausconf/general.conf/conf/general.local.confund werden beim Start vonffc-server.shpersourcegeladen.Neue Funktionsweise (Ansible-Rolle
gre_tunnels)Statt der imperativen
ip-Befehle nutzt die Rolle systemd-networkd.netdev/.network-Units, die von Ansible als Templates ausgerollt werden – das ist idempotent (Ansible vergleicht/überschreibt die Datei, kein Fehler bei erneutem Lauf) und übernimmt Tunnel-Persistenz/Neuaufbau nach Reboot von systemd, statt vom Init-Skript.ansible/roles/gre_tunnels/:defaults/main.yml– Variablen:gre_wanip(≙WANIP),gre_peers(≙GRE_PEERS, als Liste von{name, ip}),gre_networkd_priority, sowie die Watchdog-Variablen (siehe unten)templates/gre-tunnel.netdev.j2– erzeugt je Peer eingretap-NetDev mitLocal/Remote/TTL=255(entsprichtip link add ... type gretap)templates/gre-tunnel.network.j2– matcht das Interface und setztMTUBytes=1426, die link-lokale IPv4-Adresse mitPeer=/Scope=linksowie die IPv6-Adressefe80::ffc:<hex>:<hex>/64(identische Berechnung wie im Original, per Test verifiziert)tasks/main.yml:gre_wanip/gre_peers(≙gre_init)systemd-networkdremoteIP != WANIP-Check ingre_add_all_tunnels)gre_peersstehen (≙gre_stop, aber selektiv statt "alles löschen")handlers/main.yml–systemd-networkdneu starten bzw.daemon-reload/Timer-Neustart bei ÄnderungenWatchdog (≙
gre_cron/gre_check_tunnel), ersetzt den Minuten-Cron durch einen systemd-Timer:templates/gre-watchdog.sh.j2– iteriert über allegre-*-Interfaces (/sys/class/net), pingtff02::2%<iface>, zähltDUP-Antworten, loggt perloggerund verschickt optional eine Mail angre_watchdog_mail_to(≙LOG_TO) — inhaltlich identisch zum Originaltemplates/gre-watchdog.service.j2/gre-watchdog.timer.j2– oneshot-Service + Timer, Standardintervall 5 Minuten (≙ der%300-Takt inffc_watchdog)gre_watchdog_enabled: falseabschaltbarBeispiel-Einbindung:
ansible/site.yml– Playbook, wendet die Rolle auf die Hostgruppeffc_serversanansible/group_vars/ffc_servers.yml– aktuelle Peer-Liste 1:1 ausconf/general.confübernommen, plus Beispiel-Mailadresse;gre_wanipmuss weiterhin pro Host gesetzt werden (host_vars)Was bewusst nicht migriert wurde
WANIFwird vonlib/gre.shselbst gar nicht für die GRE-Logik verwendet (nur die Existenzprüfung ingre_init) – daher in der Rolle nicht übernommen.mail,ping6/iputils) werden wie im Original vorausgesetzt, nicht automatisch installiert.lib/gre.sh; die übrigenlib/*.sh-Komponenten (batman, fastd, bird, dnsmasq, radvd, meshviewer) laufen unverändert überffc-server.shweiter.Testing
ansible-playbook --syntax-checkbash -nauf dem gerenderten Watchdog-Scriptconf/general.confgerendert und die berechneten Adressen (169.254.x.y,fe80::ffc:hex:hex) manuell gegen die Formel ingre_add_tunnelverifiziert🤖 Generated with Claude Code