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.