Ansible: mysql_user roto en 2.7.1 al usar /root/.my.cnf

Creado en 29 oct. 2018  ·  29Comentarios  ·  Fuente: ansible/ansible



RESUMEN

Al actualizar de 2.7.0 a 2.7.1, comenzamos a ver este error del módulo mysql_user

unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")

La tarea es la siguiente:

# Write password to root home as readable only by root so future mysql
# operations can function.
- name: Write root login credentials
  copy:
      dest: /root/.my.cnf
      owner: root
      group: root
      mode: 0600
      content: |
          # {{ ansible_note }}
          [client]
          user=root
          password={{ db_root_password }}

# By default the root user has no password. Set one.
- name: Set root user password
  mysql_user:
      host: "{{ item }}"
      name: root
      password: "{{ db_root_password }}"
      # Login without credentials
      check_implicit_admin: yes
      state: present
  with_items:
      - localhost
      - "{{ ansible_hostname }}"
      - 127.0.0.1
      - ::1

Este último falla.

Ansible 2.7.0 funciona bien.

TIPO DE PROBLEMA
  • Informe de error
NOMBRE DEL COMPONENTE

mysql_user

VERSION ANSIBLE


pegar abajo
ansible 2.7.1
archivo de configuración = Ninguno
ruta de búsqueda del módulo configurado = ['/Users/esamatti/.ansible/plugins/modules', '/ usr / share / ansible / plugins / modules']
ansible python module location = /usr/local/lib/python3.7/site-packages/ansible
ubicación ejecutable = / usr / local / bin / ansible
versión de python = 3.7.0 (predeterminado, 2 de octubre de 2018, 09:18:58) [Clang 10.0.0 (clang-1000.11.45.2)]


##### CONFIGURATION
<!--- Paste verbatim output from "ansible-config dump --only-changed" between quotes -->
```paste below
ANSIBLE_PIPELINING(/Users/epeli/code/playbooks/ansible.cfg) = True
ANSIBLE_SSH_ARGS(/Users/epeli/code/playbooks/ansible.cfg) = -o ForwardAgent=yes
DEFAULT_FORKS(/Users/epeli/code/playbooks/ansible.cfg) = 100
DEFAULT_HOST_LIST(/Users/epeli/code/playbooks/ansible.cfg) = ['/Users/epeli/code/playbooks/tools/dynamic-inventory']
DEFAULT_REMOTE_USER(/Users/epeli/code/playbooks/ansible.cfg) = root
DEFAULT_SUDO_FLAGS(/Users/epeli/code/playbooks/ansible.cfg) = -HE
DEFAULT_VAULT_PASSWORD_FILE(env: ANSIBLE_VAULT_PASSWORD_FILE) = /Users/epeli/.ansible-vault-password
SO / MEDIO AMBIENTE

macOS Mojave versión 10.14 (18A391)

Y servidor Ubuntu 18.04

PASOS PARA REPRODUCIR

Ver RESUMEN

RESULTADOS PREVISTOS

RESULTADOS ACTUALES


paste below TASK [mariadb : Set root user password] ******************************************************************************************************************************************************************************** failed: [1.2.3.4] (item=localhost) => {"changed": false, "item": "localhost", "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"} failed: [1.2.3.4] (item=customer) => {"changed": false, "item": "customer", "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"} failed: [1.2.3.4] (item=127.0.0.1) => {"changed": false, "item": "127.0.0.1", "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"} failed: [1.2.3.4] (item=::1) => {"changed": false, "item": "::1", "msg": "unable to connect to database, check login_user and login_password are correct or /root/.my.cnf has the credentials. Exception message: (1698, \"Access denied for user 'root'@'localhost'\")"}

affects_2.7 bug collection community.general database has_pr module mysql needs_collection_redirect python3 community test

Comentario más útil

Ok, lo encontré. Fue una discusión sobre # ansible-devel el 2 de octubre, y el usuario que tuvo un problema para conectarse (primero sospechó que el problema era manejar una contraseña de cadena vacía) finalmente descubrió que necesita usar login_unix_socket (debido al comportamiento diferente que mencioné anteriormente), le funcionó. Desafortunadamente, no creó un problema para eso.

De todos modos, @epeli @anniemelen @ bchanan03 , ¿puedes probar la opción login_unix_socket y ver si eso te soluciona el problema?

Todos 29 comentarios

Hola @epeli , ¡gracias por enviar este número!

haga clic aquí para obtener ayuda con el bot

Archivos identificados en la descripción:

Si estos archivos son inexactos, actualice la sección component name de la descripción o use el comando !component bot.

haga clic aquí para obtener ayuda con el bot

@epeli Hola, https://github.com/ansible/ansible/pull/47809 soluciona esto por ti, ¿podrías agregar comentarios sobre las relaciones públicas?

@timorunge Verás, agregar diferentes usuarios de mysql era posible sin este parche ...
Sí, mi problema no está relacionado con este PR, pero sí con el # 47736, así que sigo hablando allí. Y no puedo proporcionar Dockerfile, lo siento.

¿Has probado lo mismo ya en un orden diferente? Lo que significa básicamente: ¿primero iniciar sesión sin contraseña, establecer la contraseña de root y luego generar el .my.cnf?

¿Qué conector de base de datos de Python estás usando estos días? ¿MySQLdb o PyMySQL?

Hola a todos,
¿Es posible que esté viendo el mismo problema con Ansible 2.7.5? con mysql_db

ansible 2.7.5
  config file = None
  configured module search path = [u'/home/vagrant/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.12 (default, Nov 12 2018, 14:36:49) [GCC 5.4.0 20160609]

Corriendo:
`` `- nombre: install_gerrit | creando MySQL DB (si se usa)
mysql_db:
nombre: "{{item.db}}"
codificación: latin1
estado: presente
with_items: '{{gerrit_db_info}}'
cuando: item.type está definido y item.type == "mysql"

Error:

falló: [192.168.202.15] {
"cambiado": falso,
"invocación": {
"module_args": {
"colación": "",
"config_file": "/root/.my.cnf",
"connect_timeout": 30,
"codificación": "latin1",
"ignore_tables": [],
"login_host": "localhost",
"login_password": nulo,
"login_port": 3306,
"login_unix_socket": nulo,
"login_user": nulo,
"nombre": "reviewdb",
"rápido": cierto,
"single_transaction": falso,
"ssl_ca": nulo,
"ssl_cert": nulo,
"ssl_key": nulo,
"estado": "presente",
"objetivo": nulo
}
},
"articulo": {
"db": "reviewdb",
"host": "localhost",
"pasar": "xxxxxx",
"tipo": "mysql",
"usuario": "gerrit"
},
"msg": "no se puede conectar a la base de datos, verifique que login_user y login_password sean correctos o que /root/.my.cnf tenga las credenciales. Mensaje de excepción: (1698, u \" Acceso denegado para el usuario 'root' @ 'localhost' \ ")"
}
''

Parece el mismo problema con mysql_db: volver a ansible v2.7.0 resolvió el problema.

No sé dónde fue eso, pero hace algún tiempo (¿semanas? ¿Meses?) Busqué un problema similar, y la razón fue que MySQLdb (que se basa en libmysql) estaba usando sockets Unix para conectarse de forma predeterminada, mientras que PyMySQL se estaba conectando a través de TCP a localhost de forma predeterminada. Dependiendo de cómo esté configurado el acceso de root a su servidor MySQL, esto podría ayudarlo a solucionar este problema.

Como dije, realmente no recuerdo dónde escribí esto antes, y ya no estoy muy seguro de los detalles, pero tal vez esto le dé a uno de ustedes que tiene este problema una pista sobre cómo resolverlo :)

Ok, lo encontré. Fue una discusión sobre # ansible-devel el 2 de octubre, y el usuario que tuvo un problema para conectarse (primero sospechó que el problema era manejar una contraseña de cadena vacía) finalmente descubrió que necesita usar login_unix_socket (debido al comportamiento diferente que mencioné anteriormente), le funcionó. Desafortunadamente, no creó un problema para eso.

De todos modos, @epeli @anniemelen @ bchanan03 , ¿puedes probar la opción login_unix_socket y ver si eso te soluciona el problema?

Hola,
Tengo el mismo problema con Centos7, ansible 2.7.6.
especificando el socket=/var/lib/mysql/mysql.sock en ~/.my.cnf
o login_unix_socket: /var/lib/mysql/mysql.sock opción en la tarea mysql_db
está arreglando el error de conexión.

cc @Xyon @bmalynovytch @dagwieers @michaelcoburn @oneiroi @tolland
haga clic aquí para obtener ayuda con el bot

Lo siento hasta ahora, creo que este error aún no se ha resuelto.

@nizarakbarm, ¿has probado lo que sugerí y @efflamlemaillet probado y verificado? Sería bueno si pudieras probar eso y confirmar si funciona (¡o no!) Aquí.

Hola @felixfontein , en Ubuntu 18.04, la @efflamlemaillet soluciona el problema
Creo que lo siguiente:
https://stackoverflow.com/questions/41846000/mariadb-password-and-unix-socket-authentication-for-root
también está relacionado.

Hola,
como dijo @pouyana , de alguna manera el módulo ansible mysql que usa la conexión de socket por defecto en el servidor local antes ahora usa tcp.

@felixfontein Funciona, pero no me gusta usar ~ / .my.cnf

@nizarakbarm login_unix_socket: /var/lib/mysql/mysql.sock es algo para especificar en Ansible. ¿Has probado eso?

@efflamlemaillet para ser más precisos, no es el módulo Ansible en sí, sino la biblioteca de conexión Python MySQL que utiliza. La antigua biblioteca, MySQLdb (que se basa en libmysql), prefiere los sockets Unix, mientras que la nueva biblioteca, PyMySQL, prefiere una conexión TCP. Si es explícito en su libro de jugadas / rol y especifica cómo conectarse, eso no importa; pero si no lo hace, depende de la biblioteca que esté usando el módulo. El módulo prueba PyMySQL primero y recurre a MySQLdb si PyMySQL no está disponible.

Ok, gracias por tu respuesta. @felixfontein A partir de su respuesta, puede ayudarme a comprender la razón del problema.

Todo es saber si debe considerarse como un error.
Si es así, quizás el módulo Ansible podría anular el comportamiento predeterminado de PyMySQL para asegurarse de que el módulo se conecte de la misma manera (si no hay una opción de conexión especificada) cuando el controlador instalado es MySQLdb o PyMySQL.

En mi caso, esta solución también ayudó
login_unix_socket: /var/run/mysqld/mysqld.sock

ansible 2.8.4
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/eldar/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.15+ (default, Nov 27 2018, 23:36:35) [GCC 7.3.0]
- name: Create database
  mysql_db:
    name: dbname
    state: present
    login_unix_socket: /var/run/mysqld/mysqld.sock  

¡Gracias @felixfontein por señalar esto!
¡Especificar el parámetro login_unix_socket: /var/run/mysqld/mysqld.sock resolvió el problema!

Tuve que actualizar cada mysql_{user,db} tareas del módulo en los archivos tasks/databases.yml , tasks/secure-installation.yml y tasks/users.yml aunque

Expliqué esto en el documento https://github.com/ansible/ansible/pull/66848
viene con 2.10

cierrame

¿Fue útil esta página
0 / 5 - 0 calificaciones