[erledigt] Fingerübung für Programmgierer: Gateways in Domänenliste aktualisieren

Moin,

leider ist durch unser Domänenroulette (Neuverteilung der Domänen auf die Gateways zur besseren Auslastung) die Domänenliste im Wiki total veraltet.

Wer hätte Lust als kleine Fingerübung aus den Ansible Quelldaten die Liste neu zu generieren bzw. zu aktualisieren? Es wäre gut, dafür ein Skript zu haben, weil wir häufiger mal Domänen auf andere Gateways verschieben (Python / Bash / Java / … was immer du gerne benutzt).

Die Quelldaten liegen hier: https://github.com/FreiFunkMuenster/ansible-ffms/tree/master/host_vars

Zu jedem Gateway gibt es eine Liste „domaenenliste“, die selbstsprechend die Domänen enthält. Die Ports haben sich nicht geändert.

Wäre klasse, falls da jemand zu Lust hat.

Die Non-plus-ultra-Funktionalität wäre natürlich, dass sich das Skript im Wiki anmelden kann, und die Änderungen direkt einpflegt. Manuelles Kopieren geht aber auch.

Viele Grüße
Matthias

1 Like

An einer Stelle hakt es im Moment. Die nötigen, zusätzlichen Parameter habe ich als Kommentar im Format key=value in der hosts-Datei eingetragen.

Wo mein Skill im Moment noch nicht reicht: Wie lese ich die Daten passend aus?

Hier die Änderung (Pull-Request steht noch aus)

# Multidomänen-L2TP Gateways mit oder ohne Direktanbindung FFRL
# 'capacity' im Kommentar gibt die erwünschte relative Auslastung mit Traffic und L2TP-Verbindungen an
# 'server' im Kommentar muss angegeben werden, wenn mehrere L2TP-VM auf einem Blech laufen. Der Wert kann frei gewählt werden.
[gateways]
tj01                    ansible_ssh_host=46.4.122.254           ansible_ssh_port=22	#			capacity=1.00
parad0x			ansible_ssh_host=5.9.67.189		ansible_ssh_port=22	# Direktanbindung FFRL	capacity=1.00
c1024			ansible_ssh_host=176.9.88.123		ansible_ssh_port=22	# Direktanbindung FFRL	capacity=1.00
fanlin			ansible_ssh_host=89.163.221.125		ansible_ssh_port=22	# Direktanbindung FFRL	capacity=1.00
des1			ansible_ssh_host=5.9.86.154		ansible_ssh_port=22	# Direktanbindung FFRL	capacity=1.00
des2			ansible_ssh_host=148.251.45.45		ansible_ssh_port=22	# Direktanbindung FFRL	capacity=1.00
remue-09		ansible_ssh_host=148.251.208.170	ansible_ssh_port=22	#			capacity=0.67	server=remue
nightbounce		ansible_ssh_host=46.4.90.220		ansible_ssh_port=22	# Direktanbindung FFRL	capacity=1.00
handle			ansible_ssh_host=51.15.146.100		ansible_ssh_port=22	# Direktanbindung FFRL	capacity=1.00
corny			ansible_ssh_host=144.76.81.157		ansible_ssh_port=22	# Direktanbindung FFNW	capacity=0.50

In welcher Sprache versuchst du es denn auszulesen?

Corny kannst du auch mit 1.0 berechnen und remue-09 würde ich glaube ich auch auf 1.0 hochschrauben da mittlerweile neben dem Dom06 Gateway was aber nicht mehr der Rede wert ist, alleine auf dem Blech…

Ich verstehe nicht genau, was du auslesen möchtest? Gib am Besten mal ein Beispiel bitte.

Ich benötige eine Liste oder Array, z.B.

name      capacity      server
tj01      1.0  
paradox   1.0
....
remue-09  1.0           remue

Also muss du quasi genau die hosts-Datei parsen. Hab mit Python da noch keine Erfahrung, aber irgendwie die Tabelle lesen. Eventuell gibt es da ein Funktion.

So, das Skript ist fertig. Der Pull-Request ist eröffnet.

Das Smoke-Testing war erfolgreich, ansonsten gehe ich aber nicht davon aus, dass das Skript sonderlich robust ist.

EDIT: Wie besprochen werden die DHCP-Bereiche nicht übernommen. Bitte kurz Bescheid geben, falls das doch erfolgen soll.

Hi,

vielen Dank! Das wird klasse mit dem Skript.

Ich fürchte leider schon. Ansible kann die Bereiche zwar nun automatisch berechnen, aber das dauert beim Ausrollen irgendwie jedes Mal 30 Minuten. Ich weiß nicht, warum das so ewig dauert, aber das ist nicht praktikabel.

Grüße
Matthias

Soll ich die Berechnung in das Skript mit einbauen? Wenn ja – wo finde ich den Algorithmus dafür?

Ich weiß nicht, ob sich das lohnt. Denn wir stellen erst Schrittweise um. Es müsste quasi nur dort berechnet werden, wo noch nichts steht. Glaub das ist eher unpraktikabel, weil wir auf Dauer alles umstellen und dann sind die Bereiche wieder für Jahre fest.

Der Algorithmus ist einfach so:

Der Server mit der kleineren vm_id bekommt die server_id 2, also die zwei bei allen IPs am Ende, der mit der größeren die 3.

Die DHCP-Bereiche für die 2 sind:

10.dom.64.0 - 10.dom.127.255

und für die 3:

10.dom.128.0 - 10.dom.191.255

Grüße
Matthias

Ok, dann schau ich mal, ob ich das Skript so umbauen kann, dass die vorhandenen Informationen zu den DHCP-Bereichen nicht verloren gehen.

Das wäre ideal :). Tut mir leid für die Mehrarbeit. Dachte echt, wir hätten das automatisiert.

Dass Ansible dafür ewig braucht, war mir vorher nicht klar.

@jotzt, hab jetzt alle DHCP-Bereiche wieder per Hand eingetragen, damit man Ansible vernünftig ausrollen kann, bis das Problem gelöst ist, dass man nicht mehr einzelne Gateways ausrollen konnte.

Wenn du alle übernimmst, sollte es also vollständig sein bei dir.

Arbeitest du eigentlich gerade nur an der Ansible-Konfiguration oder auch an der Liste für’s Wiki (siehe erster Beitrag)?

In der Reihenfolge, wie im Wiki vermerkt:

  • host-Datei auslesen (fertig)
  • host_vars-Dateien schreiben (fast fertig)
  • Wikieintrag automatsich erstellen
1 Like

Kein Problem, ich habe deswegen ja nichts doppelt machen müssen.

Mit welchen Parametern muss man das eigentlich so ausführen? Und wie kommt die Ausgabe ins Wiki?

Das Skript? Rscript sn-alloc.R im ansible-ffms-Pfad, erwartet keine Parameter.

Ja, gute Frage. Das finde ich dann anschließend heraus :wink:

EDIT: Bis ich das mit den DHCP-Bereichen fertig habe, wird es wohl noch ein paar Tage dauern.

2 Like

@jotzt, habe leider noch einen kleine Bug gefunden: Ich habe die Domänen 2-4 neu angelegt, für die Aufteilung der Domäne-01. Nachdem ist dein Skript ausgeführt habe, waren die allerdings weg :).

Vermutlich, weil es dazu noch keine Daten gab oder so, da müsste die Auslastung dann mit 0 angesetzt werden und eine kurze Ausgabe dazu im Terminal wäre gut.

Ansonsten läuft das Skript bei mir super durch.

Grüße
Matthias

@MPW Das ist bisher nicht implementiert. Gateways können gelöscht oder hinzugefügt werden. Domains werden nur zugeteilt, wenn diese Daten haben und die Zahl der L2TP-Verbindungen größer null ist. Klares Problem.

Ich überlege mir nachher eine Lösung.

Eine Option wäre, eine domains-Datei anzulegen, in der alle Domänen stehen, die verteilt werden sollen. “Alt-Domains”, die nicht mehr benötigt werden, könne aus der Datei gelöscht werden und fliegen dann beim nächsten Durchlauf raus, obwohl Grafana noch Daten liefert. Neue Domains werden eingetragen und werden einem Gateway zugewiesen, auch wenn für sie noch keine Statistikdaten vorliegen. Hätte auch den Vorteil, dass man neuen Domains gleich einen Schätzwert für die Auslastung mitgeben kann. Sonst werden die nachrangig zugeteilt und die Gateways ungleich ausgelastet.

Eine Ausgabe der Zuteilung auf die Konsole baue ich ein.

Die Datei gibt es schon, die sind in group_vars/all gelistet.

Mir ist gerade noch ein kleiner Bug aufgefallen:

host_vars/c1024:   "01":
host_vars/c1024-      dhcp_start: 10.01.64.0
host_vars/c1024-      dhcp_end: 10.01.127.255
host_vars/c1024-      server_id: 2
host_vars/c1024-      partner: "parad0x"

Der String der Domäne könnte noch in ein Integer konvertiert werden um die führende 0 im zweiten Oktett zu entfernen.