Wie kann man zunehmende Ansnummern in Ansible deterministisch und reproduzierbar zuweisen?

12

Ich bin neu bei Ansible, muss jedoch eine Reihe von Playbooks verwalten, die den Diensten entsprechen, die in einer bestimmten Umgebung eingerichtet werden sollen. Ihnen müssen ein Port, Zertifikate usw. zugewiesen werden. Dies führt zu vielen Dateien mit Listen mit im Wesentlichen immer gleichen Namen und einer Zuordnung zu ihnen.

In vielen Fällen denke ich, dass ich den Dienstnamen leicht als Variable wiederverwenden kann, aber bei der Zuordnung zu IPs, Ports oder anderen numerischen Kennungen habe ich noch keine Möglichkeit gefunden, ihnen unterschiedliche Nummern auf reproduzierbare Weise deterministisch zuzuweisen, und bleibt vorzugsweise die Gleiches gilt auch dann, wenn neue Dienste hinzugefügt werden. Ich habe überlegt, eine SQLite-Datenbank zu verwenden, um die Dienste zu speichern und die Werte aus ihren IDs zu generieren, aber ich habe keine Ahnung, wie ich das in Ansible integrieren soll.

Ich gehe davon aus, dass das Zuweisen zunehmender Portnummern nicht ganz neu ist. Es ist etwas, was viele Systemadministratoren im Alltag tun müssen, also muss es einen Weg geben, dies zu tun.

Bearbeiten : Wir fügen die Portnummern usw. direkt group_vars/all.ymlwie folgt hinzu:

ports:
    service1:1024
    service2:1025
    service3:1026

Das Inventar wird automatisch generiert, da wir zusätzliche Jails (BSD) erstellen und von den Rollen abhängen, die ausgeführt werden.

midor
quelle
2
Was hindert Sie daran, dort manuell eine bestimmte Portnummer hinzuzufügen, da Sie den Service wahrscheinlich sowieso zum Inventar hinzufügen müssen? Oder wenn Ihr Inventar automatisch generiert wird, sollten Sie das Problem wahrscheinlich auf der Ebene der Inventargenerierung lösen
SztupY
Würden Sie bitte einige Ansible-Schnipsel hinzufügen? Es ist nicht klar, ob Sie group_varsVariablen direkt in Inventardateien verwenden oder hinzufügen. Es ist auch nicht klar, wie Ihr Inventar generiert wird.
Woodland Hunter
Haben Sie darüber nachgedacht, ein Service Discovery Tool wie den Consul von HashiCorp zu verwenden?
Foghorn CTO

Antworten:

5

Haftungsausschluss: Ich verwende Ansible nicht.

Was ich tun würde, ist eine zufällige "vorhersehbare" Zahl zu verwenden. Laut Ansible doc können Sie den Zufallszahlengenerator setzen:

Ab Ansible Version 2.3 ist es auch möglich, den Zufallszahlengenerator aus einem Startwert zu initialisieren. Auf diese Weise können Sie zufällige, aber idempotente Zahlen erstellen:

"{{59 | random (seed = inventar_hostname)}} * * * * root / script / from / cron"

In Ihrem Fall für eine Portnummer (ich nehme an, dass sie nicht privilegiert ist) würde ich mich für eine Variable mit etwas wie:

port="{{ 32767 |random(start=1024,seed=service_name) }}"

Maximal 32767, um Konflikte mit einem vom Client initiierten Port zu vermeiden (siehe Ephemeral Port für den Grund).

Tensibai
quelle
Das ist eine gute Idee, die ich in Betracht gezogen habe, aber sie macht den zunehmenden Teil imo unmöglich. Es ist wahrscheinlich sehr wünschenswert, bestimmte Dienste zu haben, die in einem bestimmten Portbereich logisch miteinander verbunden sind.
Mitte