it-swarm.com.ru

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

28
oakservice

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

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

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

38
gitaarik

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

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

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

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

[ssh_connection]
pipelining=True
8
Dylan Pierce

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

5
René Pijl

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

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