Ich verwende PostgreSQL 9.3 unter FreeBSD. FreeBSD verwendet pgsql
als Standardsystembenutzer für PostgreSQL. Mein /usr/local/pgsql/data/pg_hba.conf
sieht so 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 als pgsql
ohne Passwort auf die Datenbank zugreifen.
$ su pgsql
$ psql template1
template1=# \l
List of databases
...
Das funktioniert wie beabsichtigt.
Auf einem Remote-Computer habe ich eine Ansible-Aufgabe, um eine Datenbank auf dem FreeBSD-Server zu erstellen.
- name: Create the postgresql database
postgresql_db: name=mydatabase login_user=pgsql
Die Ausführung dieser Aufgabe schlägt mit dem Fehler Peer authentication failed for user "pgsql"
fehl.
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 schlägt das fehl, wenn die Peer-Authentifizierung für den Benutzer pgsql
eindeutig funktioniert?
Das hat für mich funktioniert:
- name: Create postgres database
become: true
become_user: postgres
postgresql_db:
name: <database-name>
In Ihrem speziellen Fall könnte der Benutzer pgsql
sein, aber ich denke normalerweise, dass der Benutzer postgres
ist.
Oder mit etwas anderer Syntax (ab Ansible 1.9) und zur Benutzererstellung (möglicherweise hilfreich für jemanden)
- name: Create postgres user
postgresql_user: name={{ pg_user }} password={{ pg_password }}
become: true
become_user: postgres
Für diejenigen, die unter "Fehler beim Festlegen der Berechtigungen für die temporären Dateien, die Ansible erstellen muss ..." ausführen können, um mit become_user
zum Benutzer postgres
zu wechseln, können Sie das Pipelining auf Ubuntu-Hosts nutzen.
Erstellen Sie einen ansible.cfg
in Ihrem Playbook-Verzeichnis und fügen Sie die folgenden Zeilen hinzu:
[ssh_connection]
pipelining=True
Ich hatte das gleiche Problem. In meinem Fall habe ich übersehen, dass ich mein Ansible-Playbook so konfiguriert habe, dass es als ein anderer Linux-Benutzer als der mit Peer-Zugriff (in Ihrem Fall pgsql) ausgeführt wird. Lösung ist entweder das Ansible-Spiel als pgsql auszuführen:
- name: Create the postgresql database
remote_user: pgsql
postgresql_db: name=mydatabase login_user=pgsql
...
Oder führe es als root aus und su für den Befehl pgsql:
- name: Create the postgresql database
remote_user: root
become: yes
become_user: pgsql
postgresql_db: name=mydatabase login_user=pgsql
...
... abhängig von Ihren Zugriffsrechten via ssh.
Dies verwendet Ansible 2.0.
Eine andere Problemumgehung besteht darin, eine Verbindung über Host
(localhost) anstatt über die standardmäßige local
-Peer-Authentifizierungsmethode herzustellen:
- name: Create the postgresql database
postgresql_db:
name: mydatabase
login_user: postgres
login_Host: 127.0.0.1
Abhängig von den Einstellungen in pg_hba.conf
müssen Sie möglicherweise auch login_password
angeben. Sie können dies durch die Einstellung umgehen
Host all postgres 127.0.0.1/32 md5
zu
Host all postgres 127.0.0.1/32 trust
Ich stelle fest, dass Ihre Postgres-Version wirklich veraltet ist (9.3). Ich hatte dieses Problem kürzlich, als ich auf einem Ubuntu 14-Server mit Postgres 9.3 arbeitete.
Ich habe ein Dutzend verschiedener Dinge ausprobiert und schließlich funktionierte die Installation des Pakets acl
über apt. Ansible verwendet es zum Navigieren in einigen Berechtigungsproblemen. Das Paket wird standardmäßig auf neueren Distributionen installiert. Daher ist dieses Problem nur auf einem alten Server aufgetreten.
Dank dieser Bedrohung habe ich eine Variante des Postings von mdh gemacht. Beim Einrichten einer Datenbank generiere ich ein Passwort für den Postgres-Benutzer und speichere es in einer Datei unter dem Stammverzeichnis.
Ich dachte, warum sollte man es nicht auch (oder stattdessen) in einer .pgpass-Datei für root speichern? Also habe ich eine Vorlage wie diese erstellt (nur die letzte Zeile ist wichtig):
#### password file for posgres connection ###
#### *:*:*:*
#### works like
#### * : * : * : *
#### <ip addr> : <port nr> : <db name> : <password>
127.0.0.1:*:*:postgres:{{ new_postgres_pass }}
Speichern Sie die .pgpass-Datei im Stammverzeichnis von root. Jetzt können Sie das Modul als root verwenden, ohne den Benutzer wechseln zu müssen, um die pg_hba.conf zu ändern:
- name: Ensure postgresql mydatabase
postgresql_db:
name: mydatabase
login_user: postgres
login_Host: 127.0.0.1