PostgreSQL与Ansible失败的对等身份验证

时间:2014-09-09 18:04:41

标签: postgresql authentication freebsd ansible ansible-playbook

我在FreeBSD上运行PostgreSQL 9.3。 FreeBSD使用pgsql作为PostgreSQL的默认系统用户。我的/usr/local/pgsql/data/pg_hba.conf看起来像这样:

# 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

使用此配置,我可以在没有密码的情况下以pgsql身份连接到数据库。

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

按预期工作。

在远程计算机上,我有一个Ansible任务在FreeBSD服务器上创建数据库。

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

执行此任务失败,错误为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

为什么当用户pgsql的对等身份验证明显有效时,这会失败?

9 个答案:

答案 0 :(得分:43)

这对我有用:

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

在您的特定情况下,用户可能是pgsql,但我认为用户通常是postgres

答案 1 :(得分:20)

或者语法略有不同(来自Ansible 1.9)和用户创建(可能对某人有帮助)

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

答案 2 :(得分:8)

对于遇到&#34;未能设置临时文件权限的人,Ansible需要创建...&#34;要使用postgres切换到become_user用户,您可以在Ubuntu主机上利用管道传输。

在您的playbook目录中创建ansible.cfg并添加以下行:

[ssh_connection]
pipelining=True

答案 3 :(得分:5)

我遇到了同样的问题。在我的情况下,我忽略了我将我的Ansible-playbook配置为另一个Linux用户而不是具有对等访问权限的用户(在您的情况下为pgsql)。解决方案是将Ansible播放为pgsql:

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

或者以root身份运行它,并使用su命令pgsql:

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

...取决于您通过ssh的访问权限。

这是使用Ansible 2.0。

答案 4 :(得分:2)

另一种解决方法是通过host(localhost)而不是默认的local对等身份验证方法进行连接:

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

根据pg_hba.conf中的设置,您可能还需要提供login_password。您可以通过设置

来规避这一点
host    all         postgres        127.0.0.1/32            md5

host    all         postgres        127.0.0.1/32            trust

答案 5 :(得分:1)

我注意到您的Postgres版本确实已经过时(9.3)。最近在使用Postgres 9.3的Ubuntu 14服务器上工作时遇到了这个问题。

我尝试了十几种不同的方法,最后有效的方法是通过apt安装acl软件包。 Ansible使用它来解决某些权限问题。该软件包默认安装在较新的发行版上,因此为什么我只在旧服务器上看到了此问题。

答案 6 :(得分:0)

多亏了这种威胁,我改写了mdh的帖子。设置数据库时,我为postgres用户生成一个密码,并将其存储在根目录下的文件中。

我想为什么不将它也(或代替)存储在root的.pgpass文件中。所以我创建了一个这样的模板(只有最后一行很重要):

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

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

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

将.pgpass文件存储在root的主目录中。现在,您可以将模块用作root用户,而无需切换用户,而不必更改pg_hba.conf:

- name: Ensure postgresql mydatabase
  postgresql_db:
    name: mydatabase
    login_user: postgres
    login_host: 127.0.0.1

答案 7 :(得分:0)

如果您没有sudo(例如debian等),但有权访问root

- name: Create database
  remote_user: root
  become: yes
  become_method: su
  become_user: postgres
  postgresql_db:
    name: my_db

答案 8 :(得分:-3)

所以,如果我理解你在远程机器上,也许你应该更改/usr/local/pgsql/data/pg_hba.conf以允许远程连接&#39;托管所有0.0.0.0/0 md5&# 39;或其他特定网络地址。