我在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
的对等身份验证明显有效时,这会失败?
答案 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;或其他特定网络地址。