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