Ошибка аутентификации PostgreSQL с помощью Ansible
Я запускаю PostgreSQL 9.3 на FreeBSD. 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
?
Ответы
Ответ 1
Это сработало для меня:
- name: Create postgres database
become: true
become_user: postgres
postgresql_db:
name: <database-name>
В вашем конкретном случае пользователь может быть pgsql
, но я думаю, что обычно пользователь postgres
.
Ответ 2
Или со слегка отличающимся синтаксисом (от Ansible 1.9) и для создания пользователя (может быть полезно кому-то)
- name: Create postgres user
postgresql_user: name={{ pg_user }} password={{ pg_password }}
become: true
become_user: postgres
Ответ 3
Для тех, кто работает в "Не удалось установить разрешения для временных файлов Ansible необходимо создать...", чтобы переключиться на пользователя postgres
с помощью become_user
, вы можете использовать конвейерную обработку на хостах Ubuntu.
Создайте ansible.cfg
в каталоге вашей книги и добавьте следующие строки:
[ssh_connection]
pipelining=True
Ответ 4
У меня была та же проблема. В моем случае я упустил из виду, что настроил мою игру Ansible-playbook для работы в качестве другого пользователя Linux, чем тот, у кого есть доступ к одноранговой сети (pgsql в вашем случае). Решение либо запускает Ansible play как 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.
Ответ 5
Другим обходным решением является подключение через 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
Ответ 6
Благодаря этой угрозе я сделал вариант сообщения mdh. Когда я настраиваю базу данных, я генерирую пароль для пользователя postgres и сохраняю его в файле в корневом каталоге.
Я подумал, почему бы не сохранить его также (или вместо этого) в файле .pgpass для root. Поэтому я создал такой шаблон (важна только последняя строка):
#### 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
Я заметил, что ваша версия Postgres действительно устарела (9.3). У меня недавно была эта проблема при работе на сервере Ubuntu 14 с Postgres 9.3.
Я перепробовал дюжину разных вещей, и наконец то, что сработало, установило пакет acl
через apt. Ansible использует его для навигации по некоторым проблемам с разрешениями. Пакет по умолчанию устанавливается на новых дистрибутивах, поэтому я видел только эту проблему на старом сервере.
Ответ 8
Итак, если я хорошо понял, что вы на удаленной машине, и, возможно, вам следует изменить /usr/local/pgsql/data/pg _hba.conf, чтобы разрешить хостам удаленных подключений все все 0.0.0.0/0 md5 'или другое конкретное сетевой адрес.