Skip to content

Ansible role for GRE backbone tunnels (alternative to lib/gre.sh) - #5

Draft
oliverlorenz wants to merge 1 commit into
chemnitzfrom
ansible-gre-tunnels
Draft

Ansible role for GRE backbone tunnels (alternative to lib/gre.sh)#5
oliverlorenz wants to merge 1 commit into
chemnitzfrom
ansible-gre-tunnels

Conversation

@oliverlorenz

Copy link
Copy Markdown
Member

Kontext

lib/gre.sh baut und überwacht die GRE-Backbone-Tunnel zu den anderen Freifunk-Chemnitz-Servern imperativ per Shell, aufgerufen aus ffc-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 in GRE_PEERS außer dem eigenen Server über gre_add_all_tunnels):

  • ip link add gre-<peer> type gretap remote <peer-ip> local $WANIP ttl 255
  • Link-lokale IPv4: ip addr add 169.254.<WANIP.o3>.<WANIP.o4> peer 169.254.<peer-ip.o3>.<peer-ip.o4>/32 scope link dev gre-<peer>
  • Link-lokale IPv6: 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 start erneut ab; es gibt keine Prüfung, ob ein Tunnel bereits existiert (ip link add schlägt dann fehl, wird aber nicht separat behandelt).

Abbau (gre_stop): findet alle laufenden gre-*-Interfaces über /proc/net/dev und löscht sie per ip link delete.

Überwachung (gre_cron, aus ffc_watchdog alle 5 Minuten aufgerufen, wenn per Cron * * * * * initd-ffc.sh watchdog eingerichtet ist): für jedes laufende gre-*-Interface wird ping6 -c5 -i1 ff02::2%<iface> ausgeführt und auf DUP-Antworten (Duplicate Address, d.h. mehrere Router haben geantwortet) geprüft. Kommt keine DUP-Antwort, gilt der Tunnel als down und log_error wird aufgerufen, was den Fehler nach Syslog schreibt (logger) und – nur wenn IS_CRON=1 gesetzt ist – zusätzlich eine Mail an LOG_TO schickt.

Konfiguration: WANIF, WANIP, GRE_PEERS (Array "host:ip") und LOG_TO kommen aus conf/general.conf/conf/general.local.conf und werden beim Start von ffc-server.sh per source geladen.

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 ein gretap-NetDev mit Local/Remote/TTL=255 (entspricht ip link add ... type gretap)
  • templates/gre-tunnel.network.j2 – matcht das Interface und setzt MTUBytes=1426, die link-lokale IPv4-Adresse mit Peer=/Scope=link sowie die IPv6-Adresse fe80::ffc:<hex>:<hex>/64 (identische Berechnung wie im Original, per Test verifiziert)
  • tasks/main.yml:
    1. prüft gre_wanip/gre_peers (≙ gre_init)
    2. aktiviert/startet systemd-networkd
    3. schließt den eigenen Server aus der Peer-Liste aus (≙ das remoteIP != WANIP-Check in gre_add_all_tunnels)
    4. templated die NetDev-/Network-Units pro Peer
    5. löscht Units von Peers, die nicht mehr in gre_peers stehen (≙ gre_stop, aber selektiv statt "alles löschen")
    6. templated Watchdog-Script + systemd-Service/-Timer (siehe unten)
  • handlers/main.ymlsystemd-networkd neu starten bzw. daemon-reload/Timer-Neustart bei Änderungen

Watchdog (≙ gre_cron/gre_check_tunnel), ersetzt den Minuten-Cron durch einen systemd-Timer:

  • templates/gre-watchdog.sh.j2 – iteriert über alle gre-*-Interfaces (/sys/class/net), pingt ff02::2%<iface>, zählt DUP-Antworten, loggt per logger und verschickt optional eine Mail an gre_watchdog_mail_to (≙ LOG_TO) — inhaltlich identisch zum Original
  • templates/gre-watchdog.service.j2 / gre-watchdog.timer.j2 – oneshot-Service + Timer, Standardintervall 5 Minuten (≙ der %300-Takt in ffc_watchdog)
  • über gre_watchdog_enabled: false abschaltbar

Beispiel-Einbindung:

  • ansible/site.yml – Playbook, wendet die Rolle auf die Hostgruppe ffc_servers an
  • ansible/group_vars/ffc_servers.yml – aktuelle Peer-Liste 1:1 aus conf/general.conf übernommen, plus Beispiel-Mailadresse; gre_wanip muss weiterhin pro Host gesetzt werden (host_vars)

Was bewusst nicht migriert wurde

  • WANIF wird von lib/gre.sh selbst gar nicht für die GRE-Logik verwendet (nur die Existenzprüfung in gre_init) – daher in der Rolle nicht übernommen.
  • Paketvoraussetzungen (mail, ping6/iputils) werden wie im Original vorausgesetzt, nicht automatisch installiert.
  • Die Rolle ersetzt nur lib/gre.sh; die übrigen lib/*.sh-Komponenten (batman, fastd, bird, dnsmasq, radvd, meshviewer) laufen unverändert über ffc-server.sh weiter.

Testing

  • ansible-playbook --syntax-check
  • YAML-Validierung aller neuen Dateien
  • bash -n auf dem gerenderten Watchdog-Script
  • Templates mit echten Peer-Daten aus conf/general.conf gerendert und die berechneten Adressen (169.254.x.y, fe80::ffc:hex:hex) manuell gegen die Formel in gre_add_tunnel verifiziert
  • Kein Test auf einem echten Server / gegen eine echte Ziel-Maschine (kein Zugriff aus dieser Umgebung) — vor dem Merge sollte das auf einem Testserver verifiziert werden.

🤖 Generated with Claude Code

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant