postgresql authentication freebsd ansible ansible-playbook

PostgreSQL falla en la autenticación de pares con Ansible



authentication freebsd (7)

Entonces, si entendí bien, está en una máquina remota, y tal vez debería cambiar /usr/local/pgsql/data/pg_hba.conf para permitir que las conexiones remotas alojen todas las 0.0.0.0/0 md5 u otra dirección de red específica.

Estoy ejecutando PostgreSQL 9.3 en FreeBSD. FreeBSD usa pgsql como usuario predeterminado del sistema para PostgreSQL. Mi /usr/local/pgsql/data/pg_hba.conf tiene este aspecto:

# 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

Con esta configuración puedo conectarme a la base de datos como pgsql sin una contraseña.

$ su pgsql $ psql template1 template1=# /l List of databases ...

Eso funciona según lo previsto.

En una máquina remota, tengo una tarea ansible para crear una base de datos en el servidor de FreeBSD.

- name: Create the postgresql database postgresql_db: name=mydatabase login_user=pgsql

La ejecución de esta tarea falla con el error Error de 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

¿Por qué falla esto cuando la autenticación de pares para el usuario pgsql está funcionando claramente?


Esto funcionó para mí:

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

En su caso específico, el usuario podría ser pgsql , pero creo que generalmente el usuario es postgres .


Gracias a esta amenaza hice una variante de la publicación de mdh. Cuando configuro una base de datos, genero una contraseña para el usuario de postgres y la almaceno en un archivo en el directorio raíz.

Pensé por qué no almacenarlo también (o en su lugar) en un archivo .pgpass para root. Así que creé una plantilla como esta (solo la última línea es importante):

#### password file for posgres connection ### #### *:*:*:* #### works like #### * : * : * : * #### <ip addr> : <port nr> : <db name> : <password> 127.0.0.1:*:*:postgres:{{ new_postgres_pass }}

Almacene el archivo .pgpass en el directorio de inicio de la raíz. Ahora puede usar el módulo como root sin cambiar de usuario de tener que cambiar pg_hba.conf:

- name: Ensure postgresql mydatabase postgresql_db: name: mydatabase login_user: postgres login_host: 127.0.0.1


O con una sintaxis ligeramente diferente (de Ansible 1.9) y para la creación del usuario (puede ser útil para alguien)

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


Otra solución es conectarse a través del host (localhost) en lugar del método de autenticación por pares local predeterminado:

- name: Create the postgresql database postgresql_db: name: mydatabase login_user: postgres login_host: 127.0.0.1

Dependiendo de la configuración en pg_hba.conf , es posible que también deba proporcionar login_password . Usted puede evitar esto estableciendo

host all postgres 127.0.0.1/32 md5

a

host all postgres 127.0.0.1/32 trust


Para aquellos que se ejecutan en "Error al establecer permisos en los archivos temporales que Ansible necesita crear ..." para cambiar al usuario de postgres con become_user , puede aprovechar la canalización en los hosts de Ubuntu.

Cree un ansible.cfg en el directorio de su libro de jugadas y agregue las siguientes líneas:

- name: Create the postgresql database remote_user: pgsql postgresql_db: name=mydatabase login_user=pgsql ...


Yo tuve el mismo problema. En mi caso, pasé por alto que configuré mi Ansible-playbook para que se ejecute como otro usuario de Linux que el que tiene acceso de igual a igual (pgsql en su caso). La solución es ejecutar el juego Ansible como pgsql:

- name: Create the postgresql database remote_user: root become: yes become_user: pgsql postgresql_db: name=mydatabase login_user=pgsql ...

O ejecútelo como root, y su a pgsql para el comando:

[ssh_connection] pipelining=True

... dependiendo de sus derechos de acceso a través de ssh.

Esto está utilizando Ansible 2.0.