it-swarm.com.de

PostgreSQL-Peer-Authentifizierung mit Ansible fehlgeschlagen

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?

28
oakservice

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.

38
gitaarik

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
20
Most Wanted

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
8
Dylan Pierce

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.

5
René Pijl

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
2
mdh

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.

1
bugged

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
0
Rooie3000