PostgreSQL scheitern peer-Authentifizierung mit Ansible
Ich bin mit PostgreSQL 9.3 auf FreeBSD. FreeBSD verwendet pgsql
als die Standard-system-Benutzer für die PostgreSQL. Meine /usr/local/pgsql/data/pg_hba.conf
sieht wie folgt aus:
# TYPE DATABASE USER ADDRESS METHOD
local all pgsql peer
local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
Mit dieser Konfiguration kann ich mit der Datenbank verbinden, als pgsql
ohne Passwort.
$ su pgsql
$ psql template1
template1=# \l
List of databases
...
Funktioniert wie vorgesehen.
Auf einer remote-Maschine, ich habe eine Ansible Aufgabe eine Datenbank zu erstellen, die auf dem FreeBSD-server.
- name: Create the postgresql database
postgresql_db: name=mydatabase login_user=pgsql
Ausführen dieser Aufgabe schlägt fehl, mit dem Fehler Peer authentication failed for user "pgsql"
.
PLAY [web] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [host.example.org]
TASK: [database | Create the postgresql database] *****************************
failed: [host.example.org] => {"failed": true}
msg: unable to connect to database: FATAL: Peer authentication failed for user "pgsql"
FATAL: all hosts have already failed -- aborting
Warum diese scheitern, wenn die peer-Authentifizierung für den Benutzer pgsql
ist deutlich arbeiten?
- Haben Sie zum ausführen des ansible-Modul als
pgsql
Benutzer? zB hinzufügen:sudo: true
undsudo_user: pgsql
auf Ihren Befehl - Haben Sie schließlich herausfinden, eine Lösung für dieses?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser arbeitete für mich:
In Ihrem speziellen Fall kann der Benutzer
pgsql
, aber ich denke, dass normalerweise der Benutzer istpostgres
.Oder mit leicht unterschiedlichen syntax (von Ansible 1.9) und für user anlegen (könnte hilfreich sein für jemanden)
sudo: yes; sudo_user: postgres
Für diejenigen, läuft in "Fehler beim setzen von Berechtigungen für den temporären Dateien Ansible Bedürfnisse zu erstellen...", um zu wechseln
postgres
Benutzer mitbecome_user
Sie nutzen können, pipelining auf Ubuntu-hosts.Erstellen Sie eine
ansible.cfg
in Ihrem playbook-Verzeichnis und fügen Sie die folgenden Zeilen:Ich hatte das gleiche problem. In meinem Fall habe ich übersehen, dass ich konfigurierte meine Ansible-playbook laufen, wie andere Linux-user, als die, die mit peer-Zugriff (pgsql in Ihrem Fall). Lösung ist entweder das Ansible spielen pgsql:
Oder führen Sie es als root und su pgsql für den Befehl:
... in Abhängigkeit von Ihren Zugriffsrechten über ssh.
Dies ist mit Ansible 2.0.
Eine andere Problemumgehung ist die Verbindung über
host
(localhost) anstelle der Standard -local
peer-Authentifizierung-Methode:Je nach den Einstellungen in
pg_hba.conf
müssen Sie möglicherweise auch zu bietenlogin_password
. Umgehen kannst du dies, indem Siezu
Ich bemerken, dass Ihr Postgres version ist wirklich veraltet (9.3). Ich hatte dieses Problem vor kurzem bei einer Ubuntu-14-server mit Postgres 9.3.
Ich habe versucht, ein Dutzend verschiedene Dinge, und schließlich, was funktioniert hat war die Installation der
acl
Paket über apt. Ansible verwendet es für die Navigation habe einige Berechtigungsprobleme. Das Paket installiert ist standardmäßig auf neueren Distributionen laufen, also warum habe ich nur gesehen, dass dieses problem auftauchen, auf einem alten server.Dank dieser Bedrohung machte ich eine Variante von mdh ' s post. Wenn ich eine Datenbank Erzeuge ich ein Kennwort für den postgres-Benutzer und ich speichern Sie es in eine Datei unter dem root-Verzeichnis.
Dachte ich, warum nicht speichern Sie es auch (oder stattdessen) in einem .pgpass-Datei für root aus. So habe ich eine Vorlage wie diese (nur die Letzte Zeile ist wichtig):
Speichern .pgpass-Datei im home-Verzeichnis von root. Jetzt können Sie das Modul als root ohne Wechsel Benutzer aus ändern der pg_hba.conf:
Also wenn ich gut verstanden, Sie sind auf einer remote-Maschine, und vielleicht sollten Sie ändern /usr/local/pgsql/data/pg_hba.conf remote-verbindungen erlauben 'host all all 0.0.0.0/0 md5" oder eine andere bestimmte Netzwerk-Adresse.