Verhindern Sie die gleichzeitige setzt mit Ansible
Jemand auf mein team kann SSH in unserem speziellen deploy server und von dort aus ausführen einer Ansible playbook zu drücken neuen code zu Maschinen.
Wir sind besorgt über das, was passiert, wenn zwei Menschen versuchen zu tun, setzt gleichzeitig. Wir möchten es so machen, dass das playbook wird scheitern, wenn jemand anderes gerade läuft es.
Vorschläge, wie dies zu tun? Die standard-Lösung ist die Verwendung eines pid-Datei, aber Ansible nicht über eine integrierte Unterstützung für diese.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie schreiben ein wrapper für ansible-Befehle wie folgt :
Definieren diese Funktion im
~/.bashrc
Benutzer auf das bereitstellen von Feld-und Sie sind gesetzt.Sie können das gleiche tun für die
ansible
Befehl, wenn Sie wünschen, aber angesichts der Frage bin ich nicht sicher, es ist erforderlich.EDIT: Umgeschrieben, mit der signal-handler zu verhindern lock-Datei baumelt herum, wenn Benutzer drücken Sie Strg-C.
EDIT2: Tippfehler
[ -e $lock ] || (echo $SSH_CLIENT | cut -f1 -d' ' > $lock)
(und passen Sie das Skript entsprechend), die dauert weniger als eine Millisekunde. In der Praxis klingt ganz vernünftig. Oder schreiben Sie die lock-Datei mit eingeschränkten Berechtigungen, so kann ein anderer Benutzer nicht überschreiben. Alles in allem ist dies natürlich ein hack am besten. Rundeck sieht cool aus.flock -x $HOME/.ansible_lock -c 'ansible-playbook ...'
Ich persönlich verwende RunDeck ( http://rundeck.org/ ) als wrapper um meine Ansible playbooks hat mehrere Gründe:
Gibt es viele weitere gute Gründe, natürlich, aber meine Finger sind müde von der Eingabe 😉
Lege ich diese in mein main playbook, nach
lock_file_path
: Dies ist eine Datei, deren Existenz anzeigt, dass es eine aktuell laufende ansible bereitstellen, oder es war ein deploy vor, dass du abgebrochen aus irgendeinem Grund.force_ignore_lock
: Diese standardmäßig auf false zurücksetzen, indem Sie eine option flag, das kannst du im command-line-wrapper zu ansible. Sie ermöglicht es, ansible, weiterhin mit dem bereitstellen., Was dieser tut,
pre_tasks
Den ersten
pre_task
überprüft, ob dielock_file_path
vorhanden ist, und nimmt das Ergebnis in einem register genanntlock_file
.Die nächste Aufgabe, die dann prüft, ob die Datei vorhanden ist, und wenn die person, die Bereitstellung entschieden hat, Sie zu ignorieren (hoffentlich nach der Kommunikation mit anderen team-mates). Wenn nicht, wird der Auftrag schlägt fehl, mit einer hilfreichen Fehlermeldung.
Wenn der Benutzer wählt, um sich mit der Bereitstellung auch wenn es eine
lock_file
mit der nächsten Aufgabe löscht die zuvor erstelltelock_file
und eine neue erstellt. Die anderen Aufgaben, die in der ausgewählten Rolle dann weiter glücklich.post_tasks
Dies ist ein hook aufgerufen, unmittelbar nachdem alle Aufgaben in der Bereitstellung abgeschlossen wurden. Die Aufgabe, hier löscht die
lock_file
, sodass die nächste person bereitstellen glücklich, ohne Probleme.when: lock_file.stat.exists|bool and not force_ignore_lock|bool
. Dies nutzt dieforce_ignore_lock
variable, die gesetzt werden können, in einem Kommandozeilen-flag auf ein wrapper-Skript geschrieben wie z.B. python verwenden klicken. Beispiel: `@deploy.command() @click.option('--force', help="Ignore the lock file that prevents parallel deploys, \ if a previous deploy was aborted.", is_flag=True, default=False) def backend(api_server, force): """Deploys the backend application.""" if force: ignore_lock = 'true' else: ignore_lock = 'false' extra_vars = { 'force_ignore_lock': ignore_lock } call_ansible(api_server, 'api_server.yml', json.dumps(extra_vars))
Haben Sie als Einstellung
maxsyslogins
in Grenzen.conf? Eingeschränkt werden kann dies durch die Gruppe.Dieser ist ein bisschen schwerer als das, was Sie gefragt haben. Sie möchten möglicherweise versuchen Sie es auf einem VM-ersten. Beachten Sie, dass niemand von Anwender Zugriff haben wird, wenn es alle anderen Benutzer auf dem system an alle, die 1 begrenzen, der nicht nur zählt, Anwender. Auch, wenn Sie als Benutzer multiplex-Ihre ssh-verbindungen (ControlMaster auto), Sie werden immer noch in der Lage, log-in, mehrere Male; es ist anderen Nutzern, die würde gesperrt werden.
Können Sie den flock Befehl, die wickeln Sie den Befehl mit einem Dateisystem-basierten flock(2):
Wrap aber es passt Ihre Anwender am besten. Dies hinterlässt einen anhaltenden Sperrdatei in /tmp, aber beachten Sie, dass es nicht sicher zu löschen[1]. Es ist atomar, und sehr einfach.
Wrapper-Skripts sind nicht nützlich, wenn Aufträge ausgeführt werden, die von mehreren build-hosts. Für diese Art von Fällen, die sperren zu, die gehandhabt werden, indem das playbook.
Ansible hat jetzt eine wait_for Modul, das verwendet werden kann für die Verriegelung. Hier ein kurzes Beispiel (ohne Berücksichtigung von stale locks):
Ansible prüfen, ob die lock-Datei für eine konfigurierbare timeout-Zeit, und dann aufgeben, wenn es nicht entfernt wird, in diesem Zeitraum.
Können Sie auch einfache Variante des wrapper:
Ich würde schauen in eine distributed-lock-Mechanismus wie Tierpfleger, dass ich so eine Rolle, da es eine
znode
Modul. Verteilt für hohe Verfügbarkeit und schreiben der lock-out der Ziel-Knoten.Die Rolle zu schreiben, wäre ein znode des Ziel-namens unter
/deployment/
am Anfang und würde es löschen, nach. Wenn die Sperre bereits vorhanden ist, können Sie scheitern und werfen Sie eine Nachricht in einemblock
.