Подтвердить что ты не робот

Ошибка аутентификации 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?

4b9b3361

Ответ 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 'или другое конкретное сетевой адрес.