Ansible: mysql_user cassé dans 2.7.1 lors de l'utilisation de /root/.my.cnf

Créé le 29 oct. 2018  ·  29Commentaires  ·  Source: ansible/ansible



SOMMAIRE

Lors de la mise à niveau de 2.7.0 à 2.7.1, nous avons commencé à voir cette erreur à partir du module 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 tâche est la suivante:

# 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

Ce dernier échoue.

Ansible 2.7.0 fonctionne bien.

TYPE DE PROBLEME
  • Rapport d'erreur
NOM DU COMPOSANT

mysql_user

VERSION ANSIBLE


`` coller ci-dessous
ansible 2.7.1
fichier de configuration = Aucun
chemin de recherche du module configuré = ['/Users/esamatti/.ansible/plugins/modules', '/ usr / share / ansible / plugins / modules']
Emplacement du module python ansible = /usr/local/lib/python3.7/site-packages/ansible
emplacement de l'exécutable = / usr / local / bin / ansible
version python = 3.7.0 (par défaut, 2 octobre 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
OS / ENVIRONNEMENT

macOS Mojave version 10.14 (18A391)

Et serveur Ubuntu 18.04

ÉTAPES POUR REPRODUIRE

Voir le RÉSUMÉ

RÉSULTATS ATTENDUS

RÉSULTATS ACTUELS


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

Commentaire le plus utile

Ok, je l'ai trouvé. C'était une discussion sur # ansible-devel le 2 octobre, et l'utilisateur qui avait un problème de connexion (il a d'abord suspecté que la gestion d'un mot de passe de chaîne vide était le problème) a finalement découvert qu'il devait utiliser login_unix_socket (en raison du comportement différent que j'ai mentionné ci-dessus), avec cela, cela a fonctionné pour lui. Malheureusement, il n'a pas créé de problème pour cela.

Quoi qu'il en soit, @epeli @anniemelen @ bchanan03 , pouvez-vous essayer l'option login_unix_socket et voir si cela résout le problème pour vous?

Tous les 29 commentaires

Bonjour @epeli , merci d'avoir soumis ce numéro!

cliquez ici pour obtenir de l'aide sur les robots

Fichiers identifiés dans la description:

Si ces fichiers sont inexacts, veuillez mettre à jour la section component name de la description ou utiliser la commande !component bot.

cliquez ici pour obtenir de l'aide sur les robots

@epeli Bonjour, est-ce que https://github.com/ansible/ansible/pull/47809 corrige cela pour vous, pourriez-vous s'il vous plaît ajouter des commentaires sur le PR

@timorunge Vous voyez, l'ajout de différents utilisateurs mysql était possible sans ce patch ...
Oui, mon problème n'est pas lié à ce PR, mais au # 47736, alors je continue à en parler. Et je ne peux pas fournir Dockerfile, désolé.

Avez-vous déjà essayé la même chose dans un ordre différent? Ce qui signifie essentiellement: Première connexion sans mot de passe, définition du mot de passe root et ensuite génération du .my.cnf?

Quel connecteur DB Python utilisez-vous ces jours-ci? MySQLdb ou PyMySQL?

Salut à tous,
Est-il possible que je rencontre le même problème avec Ansible 2.7.5? avec 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]

Fonctionnement:
`` `` - nom: install_gerrit | création de MySQL DB (si utilisé)
mysql_db:
nom: "{{item.db}}"
encodage: latin1
état: présent
with_items: '{{gerrit_db_info}}'
quand: item.type est défini et item.type == "mysql"

Error:

a échoué: [192.168.202.15] {
"changé": faux,
"invocation": {
"module_args": {
"collation": "",
"config_file": "/root/.my.cnf",
"connect_timeout": 30,
"encoding": "latin1",
"ignore_tables": [],
"login_host": "localhost",
"login_password": nul,
"login_port": 3306,
"login_unix_socket": null,
"login_user": nul,
"name": "reviewdb",
"rapide": vrai,
"single_transaction": faux,
"ssl_ca": nul,
"ssl_cert": nul,
"ssl_key": nul,
"état": "présent",
"cible": nul
}
},
"article": {
"db": "reviewdb",
"hôte": "localhost",
"passer": "xxxxxx",
"type": "mysql",
"utilisateur": "gerrit"
},
"msg": "impossible de se connecter à la base de données, vérifiez que login_user et login_password sont corrects ou que /root/.my.cnf a les informations d'identification. Message d'exception: (1698, u \" Accès refusé pour l'utilisateur 'root' @ 'localhost' \ ")"
}
''

Semble le même problème avec mysql_db - le retour à ansible v2.7.0 a résolu le problème.

Je ne sais pas où c'était, mais il y a quelque temps (semaines? Mois?), J'ai examiné un problème similaire, et la raison en était que MySQLdb (qui est basé sur libmysql) utilisait des sockets Unix pour se connecter par défaut, tandis que PyMySQL se connectait via TCP à localhost par défaut. Selon la façon dont l'accès root à votre serveur MySQL est configuré, cela peut vous aider à contourner ce problème.

Comme je l'ai dit, je ne me souviens pas vraiment où j'ai écrit cela auparavant, et je ne suis plus vraiment sûr des détails, mais peut-être que cela donne à l'un d'entre vous qui a ce problème un indice sur la façon de le résoudre :)

Ok, je l'ai trouvé. C'était une discussion sur # ansible-devel le 2 octobre, et l'utilisateur qui avait un problème de connexion (il a d'abord suspecté que la gestion d'un mot de passe de chaîne vide était le problème) a finalement découvert qu'il devait utiliser login_unix_socket (en raison du comportement différent que j'ai mentionné ci-dessus), avec cela, cela a fonctionné pour lui. Malheureusement, il n'a pas créé de problème pour cela.

Quoi qu'il en soit, @epeli @anniemelen @ bchanan03 , pouvez-vous essayer l'option login_unix_socket et voir si cela résout le problème pour vous?

Bonjour,
J'ai eu le même problème avec Centos7, ansible 2.7.6.
en spécifiant le socket=/var/lib/mysql/mysql.sock dans ~/.my.cnf
ou login_unix_socket: /var/lib/mysql/mysql.sock option dans la tâche mysql_db
corrige l'erreur de connexion.

cc @Xyon @bmalynovytch @dagwieers @michaelcoburn @oneiroi @tolland
cliquez ici pour obtenir de l'aide sur les robots

Désolé jusqu'à présent, je pense que ce bug n'est toujours pas résolu.

@nizarakbarm avez-vous essayé ce que j'ai suggéré et @efflamlemaillet essayé et vérifié? Ce serait bien si vous pouviez essayer cela et confirmer si cela fonctionne (ou non!) Ici.

Salut @felixfontein , sur Ubuntu 18.04, la solution de contournement donnée par
Je pense, ce qui suit:
https://stackoverflow.com/questions/41846000/mariadb-password-and-unix-socket-authentication-for-root
est également liée.

Salut,
comme dit @pouyana , en quelque sorte le module mysql ansible utilisant la connexion socket par défaut sur le serveur local utilise maintenant tcp.

@felixfontein Cela fonctionne, mais je n'aime pas utiliser ~ / .my.cnf

@nizarakbarm login_unix_socket: /var/lib/mysql/mysql.sock est quelque chose à spécifier dans Ansible. Avez-vous essayé cela?

@efflamlemaillet pour être plus précis, ce n'est pas le module Ansible lui-même, mais la bibliothèque de connexion Python MySQL qu'il utilise. L'ancienne bibliothèque, MySQLdb (qui est basée sur libmysql), préfère les sockets Unix, tandis que la nouvelle bibliothèque, PyMySQL, préfère une connexion TCP. Si vous êtes explicite dans votre playbook / rôle et spécifiez comment vous connecter, cela n'a pas d'importance; mais si vous ne le faites pas, cela dépend de la bibliothèque utilisée par le module. Le module essaie d'abord PyMySQL et revient à MySQLdb si PyMySQL n'est pas disponible.

Oke, merci pour votre réponse. @felixfontein D'après votre réponse, cela peut m'aider à comprendre la raison du problème.

Le tout est de savoir si cela doit être considéré comme un bug?
Si tel est le cas, le module Ansible pourrait peut-être remplacer le comportement par défaut de PyMySQL pour s'assurer que le module se connecte de la même manière (s'il n'y a pas d'option de connexion spécifiée) lorsque le pilote installé est MySQLdb ou PyMySQL.

Dans mon cas, cette solution de contournement a également aidé
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  

Merci @felixfontein pour l'avoir signalé!
Spécifier le paramètre login_unix_socket: /var/run/mysqld/mysqld.sock résolu le problème!

A dû mettre à jour toutes les tâches du module mysql_{user,db} dans les fichiers tasks/databases.yml , tasks/secure-installation.yml et tasks/users.yml cependant

je l'ai expliqué dans le doc https://github.com/ansible/ansible/pull/66848
ça vient avec 2.10

close_me

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

jiwong picture jiwong  ·  3Commentaires

RaymiiOrg picture RaymiiOrg  ·  3Commentaires

renaudguerin picture renaudguerin  ·  3Commentaires

rokka-n picture rokka-n  ·  3Commentaires

hryamzik picture hryamzik  ·  3Commentaires