Führen Sie ein PostgresSQL-Skript mit Ansible aus

8

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:

  • Führen Sie das Skript als Benutzer postgres
  • aus
  • Ich muss nicht unbedingt eine Kopie des Skripts auf dem Server aufbewahren. Wenn ich also eine Kopie benötige, wird es nur für die Verwendung mit Temps verwendet.

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.

    
ryekayo 19.08.2015, 18:33
quelle

3 Antworten

19

Warum es nicht funktioniert

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:

%Vor%

Die Art, wie Sie das versuchen, wird nicht funktionieren.

Wie es geht

Sie müssen jede Aufgabe als separaten Befehl psql mit einer Befehlszeichenfolge ausführen:

%Vor%

... 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.

So sieht ein Teil meines Codes aus

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.

%Vor%     
Craig Ringer 20.08.2015, 12:53
quelle
6

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

    
smiller171 23.08.2015 03:06
quelle
1

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%     
Roy Wood 19.01.2018 15:48
quelle

Tags und Links