web-dev-qa-db-fra.com

L'authentification des pairs échouant avec PostibleSQL avec Ansible

J'utilise PostgreSQL 9.3 sur FreeBSD. FreeBSD utilise pgsql comme utilisateur système par défaut pour PostgreSQL. Mon /usr/local/pgsql/data/pg_hba.conf ressemble à ceci:

# 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

Avec cette configuration, je peux me connecter à la base de données en tant que pgsql sans mot de passe.

$ su pgsql
$ psql template1
template1=# \l
                         List of databases
...

Cela fonctionne comme prévu.

Sur une machine distante, j'ai une tâche Ansible pour créer une base de données sur le serveur FreeBSD.

- name: Create the postgresql database
  postgresql_db: name=mydatabase login_user=pgsql

L'exécution de cette tâche échoue avec l'erreur 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

Pourquoi cela échoue-t-il lorsque l'authentification homologue pour l'utilisateur pgsql fonctionne clairement?

28
oakservice

Cela a fonctionné pour moi:

- name: Create postgres database
  become: true
  become_user: postgres
  postgresql_db:
    name: <database-name>

Dans votre cas spécifique, l'utilisateur peut être pgsql, mais je pense généralement que l'utilisateur est postgres.

38
gitaarik

Ou avec une syntaxe légèrement différente (à partir d'Ansible 1.9) et pour la création d'utilisateur (peut être utile pour quelqu'un)

- name: Create postgres user
  postgresql_user: name={{ pg_user }} password={{ pg_password }}
  become: true
  become_user: postgres
20
Most Wanted

Pour ceux qui rencontrent "Impossible de définir les autorisations sur les fichiers temporaires, Ansible doit créer ..." afin de pouvoir basculer vers l'utilisateur postgres avec become_user, vous pouvez utiliser le traitement en pipeline des hôtes Ubuntu.

Créez un ansible.cfg dans votre répertoire playbook et ajoutez les lignes suivantes:

[ssh_connection]
pipelining=True
8
Dylan Pierce

J'ai eu le même problème. Dans mon cas, j'ai oublié que j'ai configuré mon Ansible-playbook pour qu'il s'exécute sous un autre utilisateur Linux que celui avec accès homologue (pgsql dans votre cas). La solution est soit exécuter le jeu Ansible en tant que pgsql:

- name: Create the postgresql database
  remote_user: pgsql
  postgresql_db: name=mydatabase login_user=pgsql
  ...

Ou exécutez-le en tant que root, et utilisez su pour pgsql pour la commande:

- name: Create the postgresql database
  remote_user: root
  become: yes
  become_user: pgsql
  postgresql_db: name=mydatabase login_user=pgsql
  ...

... en fonction de vos droits d'accès via ssh.

Ceci utilise Ansible 2.0.

5
René Pijl

Une autre solution consiste à se connecter via Host (localhost) au lieu de la méthode d'authentification homologue par défaut local:

- name: Create the postgresql database
  postgresql_db:
    name: mydatabase
    login_user: postgres
    login_Host: 127.0.0.1

Selon les paramètres définis dans pg_hba.conf, vous devrez peut-être aussi fournir login_password. Vous pouvez contourner ce problème en définissant

Host    all         postgres        127.0.0.1/32            md5

à

Host    all         postgres        127.0.0.1/32            trust
2
mdh

Grâce à cette menace, j'ai créé une variante du message de mdh. Lorsque je configure une base de données, je génère un mot de passe pour l'utilisateur postgres et le stocke dans un fichier situé dans le répertoire racine.

Je pensais pourquoi ne pas le stocker aussi (ou à la place) dans un fichier .pgpass pour root. J'ai donc créé un modèle comme celui-ci (seule la dernière ligne est importante):

#### password file for posgres connection ###

#### *:*:*:*
#### works like
####    *      :      *    :     *     :     *
#### <ip addr> : <port nr> : <db name> : <password>

127.0.0.1:*:*:postgres:{{ new_postgres_pass }}

Stockez le fichier .pgpass dans le répertoire de base de root. Maintenant, vous pouvez utiliser le module en tant que root sans changer d'utilisateur et sans avoir à changer le fichier pg_hba.conf:

- name: Ensure postgresql mydatabase
  postgresql_db:
    name: mydatabase
    login_user: postgres
    login_Host: 127.0.0.1
0
Rooie3000