Ich suche nach einer Möglichkeit, ein Postgres-Skript mit Ansible auszuführen. Während ich ein einigermaßen gutes Beispiel fand Here muss ich:
Kann jemand mir sagen, ob das möglich ist und wenn es ein Beispiel dafür ist, es zu laufen. Hier ist, was ich bisher versucht habe mit Ansible und es hing nur an diesen Punkten:
%Vor%Das hängt immer beim ersten Teil davon ab, wenn man sich in die Bilddatenbank einloggt.
Dies:
%Vor%tut nicht, was Sie denken, dass es tut.
Der erste Befehl führt psql -U bob image
aus. Dies startet eine psql
-Sitzung. psql
wartet auf Eingabe von stdin. Ansible wird niemals irgendwelche senden, es wartet einfach auf den Befehl, den Sie angegeben haben, um zu beenden, also kann es den Beendigungscode überprüfen.
So wartet Ansible auf psql
, um zu beenden, und psql
wartet darauf, dass Ansible eine Eingabe sendet.
Jede Aufgabe in Ansible ist unabhängig. Die Module shell
oder command
ändern nicht die Shell, in der nachfolgende Befehle ausgeführt werden. Sie können das einfach nicht so machen, wie Sie es erwarten.
Auch wenn psql
nach der ersten Aufgabe (oder im Hintergrund) beendet wurde, erhalten Sie nur eine Fehlermeldung von der zweiten Aufgabe wie:
Die Art, wie Sie das versuchen, wird nicht funktionieren.
Sie müssen jede Aufgabe als separaten Befehl psql
mit einer Befehlszeichenfolge ausführen:
... oder mit Standardeingabe, außer dass Ansible anscheinend nicht unterstützt, eine Variable als stdin an einen Befehl zu übergeben.
... oder mit einem (möglicherweise vorlagenbasierten) SQL-Skript:
%Vor% Alternativ können Sie die integrierte Unterstützung von Ansible für die Abfrage von PostgreSQL verwenden, aber in diesem Fall können Sie nicht die Backslash-Befehle des psql
-Clients wie \d
verwenden, Sie müssten nur SQL verwenden. Abfrage information_schema
für Tabelleninformationen, etc.
Hier ist ein Beispiel aus einem Automatisierungsmodul, das ich geschrieben habe, das viel mit PostgreSQL macht.
Wirklich, ich sollte es einfach aufschnappen und eine psql
Ansible Aufgabe schreiben, die Befehle über psql
ausführt, anstatt shell
zu verwenden, was schrecklich und ungeschickt ist. Im Moment funktioniert es jedoch. Ich verwende Verbindungszeichenfolgen, die von Variablen zugewiesen oder mit set_fact
generiert wurden, um das Chaos ein wenig zu reduzieren und Verbindungen flexibler zu machen.
Die Antwort, die Craig gibt, ist gut, löst aber nicht das Problem, die Befehle als einen bestimmten Benutzer auszuführen. Das kann mit meinen Ergänzungen zu seinem Code getan werden:
%Vor%Beachten Sie die Parameter "Werden" und "Werden Sie Benutzer". Dadurch wird Ansible angewiesen, vor dem Ausführen der Befehle zum richtigen Benutzer zu wechseln.
WICHTIG: Ansible Version 1.9 und früher verwenden sudo: yes
und sudo_user: postgres
anstelle von become: true
und become_user: postgres
Ausgehend von den obigen hervorragenden Antworten können Sie in Ihrer Ansible-Aufgabe auch Umgebungsvariablen angeben, wie unten gezeigt. Beachten Sie, dass davon ausgegangen wird, dass Sie eine .pgpass-Datei mit dem Kennwort für die Zieldatenbank eingerichtet haben.
%Vor%Tags und Links postgresql ansible