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 явно работает?


person oakservice    schedule 09.09.2014    source источник
comment
Вам нужно запускать модуль ansible от имени пользователя pgsql? например, добавьте: sudo: true и sudo_user: pgsql к вашей команде   -  person Steve Lorimer    schedule 09.10.2014
comment
Удалось ли вам в конце концов найти какое-либо решение этой проблемы?   -  person Enrico Carlesso    schedule 15.01.2015


Ответы (9)


Это сработало для меня:

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

В вашем конкретном случае пользователь может быть pgsql, но я думаю, что обычно это пользователь postgres.

person gitaarik    schedule 18.03.2015

Или с немного другим синтаксисом (от Ansible 1.9) и для создания пользователя (может кому-то пригодится)

- name: Create postgres user
  postgresql_user: name={{ pg_user }} password={{ pg_password }}
  become: true
  become_user: postgres
person Most Wanted    schedule 15.02.2016
comment
Ансибл ‹ 1.9: sudo: yes; sudo_user: postgres - person hudolejev; 18.07.2016

Для тех, кто сталкивается с «Не удалось установить разрешения для временных файлов, которые Ansible должен создать ...», чтобы переключиться на пользователя postgres с помощью become_user, вы можете использовать конвейерную обработку на хостах Ubuntu.

Создайте ansible.cfg в каталоге вашего playbook и добавьте следующие строки:

[ssh_connection]
pipelining=True

Обновление: согласно @lolcode Ansible 2.9.0 обновлен до ansible_pipelining

   [ssh_connection]
   ansible_pipelining = true

Обновление от 30 апреля 2020 г. для тех, у кого все еще есть проблемы, попробуйте установить acl, что заставит Ansible использовать эту файловую систему acl для монтирования модулей, которые должны быть доступны для второго пользователя, вместо того, чтобы сделать их доступными для чтения. всеми. Спасибо @Андреас Флорат

- name: install setfacl support
  become: yes
  apt: pkg=acl
person Dylan Pierce    schedule 08.09.2016
comment
Спасибо за сэкономленные часы моей жизни :) - person Amir Rustamzadeh; 05.11.2016
comment
Без проблем! Бесчисленное множество других сделали то же самое для меня. Передай вперед. - person Dylan Pierce; 29.11.2016
comment
У меня сработал конвейерный ответ = True, но в версии 2.9.0 формат изменился на ansible_pipelining = true в соответствии с [этой проблемой [1] [1]: github.com/ansible/ansible/issues/31125#issuecomment-333847610 - person lolcode; 21.11.2019
comment
Это не сработало для меня. Мне нужно было установить инструменты acl, как описано: stackoverflow.com/questions/36646880/ - person Andreas Florath; 10.04.2020
comment
@DylanPierce Обратите внимание, что вы написали ansible_pipelining немного неправильно в своем редактировании (вы написали piplining). - person Haakon; 14.06.2020
comment
Большое спасибо за обновление 2020. Я понятия не имею о postgresql и прочем, просто пытаюсь что-то собрать. Без намека на acl мне кажется, что это был бы очень-очень долгий поиск... так что ‹3 - person Peter Nerlich; 29.05.2021

У меня такая же проблема. В моем случае я упустил из виду, что настроил свою 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.

person René Pijl    schedule 09.03.2016

Другим обходным решением является подключение через 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

to

host    all         postgres        127.0.0.1/32            trust
person mdh    schedule 25.02.2017
comment
Вы помогли мне косвенно. Я использовал login_host: {{ item.login_host | по умолчанию('локальный хост') }}. Переключение на значение по умолчанию («опустить») решило мою проблему. - person frostymarvelous; 19.04.2017

Я заметил, что ваша версия Postgres действительно устарела (9.3). Недавно у меня возникла эта проблема при работе на сервере Ubuntu 14 с Postgres 9.3.

Я пробовал дюжину разных вещей, и, наконец, что сработало, так это установка пакета acl через apt. Ansible использует его для навигации по некоторым проблемам с разрешениями. Пакет устанавливается по умолчанию в более новых дистрибутивах, поэтому я видел эту проблему только на старом сервере.

person bugged    schedule 06.06.2019

Благодаря этой угрозе я сделал вариант поста 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
person Rooie3000    schedule 16.07.2018

Если у вас нет sudo (debian и т. д.), но есть доступ к root

- name: Create database
  remote_user: root
  become: yes
  become_method: su
  become_user: postgres
  postgresql_db:
    name: my_db
person Léo Benoist    schedule 14.08.2020

Итак, если я правильно понял, вы находитесь на удаленной машине, и, возможно, вам следует изменить /usr/local/pgsql/data/pg_hba.conf, чтобы разрешить удаленные подключения «host all all 0.0.0.0/0 md5» или другой конкретный сетевой адрес.

person Laurent B    schedule 29.09.2014