Ansible: mysql_user ist in 2.7.1 bei Verwendung von /root/.my.cnf fehlerhaft

Erstellt am 29. Okt. 2018  ·  29Kommentare  ·  Quelle: ansible/ansible



ZUSAMMENFASSUNG

Beim Upgrade von 2.7.0 auf 2.7.1 wurde dieser Fehler vom Modul mysql_user angezeigt

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'\")

Die Aufgabe lautet wie folgt:

# 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

Letzteres schlägt fehl.

Ansible 2.7.0 funktioniert einwandfrei.

AUSGABETYP
  • Fehlerbericht
KOMPONENTENNAME

mysql_user

ANSIBLE VERSION


`` `unten einfügen
ansible 2.7.1
Konfigurationsdatei = Keine
konfigurierter Modul-Suchpfad = ['/Users/esamatti/.ansible/plugins/modules', '/ usr / share / ansible / plugins / modules']
ansible python module location = /usr/local/lib/python3.7/site-packages/ansible
ausführbarer Speicherort = / usr / local / bin / ansible
Python-Version = 3.7.0 (Standard, 2. Oktober 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 / UMWELT

macOS Mojave Version 10.14 (18A391)

Und Ubuntu 18.04 Server

SCHRITTE ZUM REPRODUZIEREN

Siehe ZUSAMMENFASSUNG

ERWARTETE ERGEBNISSE

TATSÄCHLICHE ERGEBNISSE


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

Hilfreichster Kommentar

Ok, ich habe es gefunden. Es war eine Diskussion über # ansible-devel am 2. Oktober, und der Benutzer, der ein Verbindungsproblem hatte (er vermutete zuerst, dass die Behandlung eines leeren String-Passworts das Problem war), fand schließlich heraus, dass er login_unix_socket (wegen des unterschiedlichen Verhaltens, das ich oben erwähnt habe), damit hat es für ihn funktioniert. Leider hat er dafür kein Problem geschaffen.

Wie auch immer, @epeli @anniemelen @ bchanan03 , können Sie die Option login_unix_socket ausprobieren und sehen, ob das Problem dadurch für Sie behoben wird?

Alle 29 Kommentare

Hallo @epeli , danke, dass du dieses Problem eingereicht hast!

Klicken Sie hier für Bot-Hilfe

In der Beschreibung angegebene Dateien:

Wenn diese Dateien ungenau sind, aktualisieren Sie bitte den Abschnitt component name der Beschreibung oder verwenden Sie den Befehl !component bot.

Klicken Sie hier für Bot-Hilfe

@epeli Hallo, behebt https://github.com/ansible/ansible/pull/47809 dies für Sie ? Könnten Sie bitte Kommentare zur PR hinzufügen

@timorunge Sie sehen, das Hinzufügen verschiedener MySQL-Benutzer war ohne diesen Patch möglich ...
Ja, mein Problem hat nichts mit dieser PR zu tun, aber mit # 47736, also rede ich dort weiter. Und ich kann Dockerfile leider nicht bereitstellen.

Haben Sie das gleiche schon in einer anderen Reihenfolge versucht? Das heißt im Grunde: Melden Sie sich zuerst ohne Passwort an, legen Sie das Root-Passwort fest und generieren Sie anschließend die .my.cnf?

Welchen Python-DB-Connector verwenden Sie derzeit? MySQLdb oder PyMySQL?

Hallo zusammen,
Ist es möglich, dass ich dasselbe Problem mit Ansible 2.7.5 sehe? mit 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]

Laufen:
`` `- name: install_gerrit | Erstellen von MySQL DB (falls verwendet)
mysql_db:
Name: "{{item.db}}"
Kodierung: latin1
Zustand: vorhanden
with_items: '{{gerrit_db_info}}'
wenn: item.type definiert ist und item.type == "mysql"

Error:

fehlgeschlagen: [192.168.202.15] {
"geändert": falsch,
"Aufruf": {
"module_args": {
"Kollation": "",
"config_file": "/root/.my.cnf",
"connect_timeout": 30,
"encoding": "latin1",
"ignore_tables": [],
"login_host": "localhost",
"login_password": null,
"login_port": 3306,
"login_unix_socket": null,
"login_user": null,
"name": "reviewdb",
"schnell": wahr,
"single_transaction": false,
"ssl_ca": null,
"ssl_cert": null,
"ssl_key": null,
"state": "present",
"Ziel": null
}}
},
"item": {
"db": "reviewdb",
"host": "localhost",
"pass": "xxxxxx",
"type": "mysql",
"user": "gerrit"
},
"msg": "Es kann keine Verbindung zur Datenbank hergestellt werden. Überprüfen Sie, ob login_user und login_password korrekt sind oder /root/.my.cnf über die Anmeldeinformationen verfügt. Ausnahmemeldung: (1698, u \" Zugriff für Benutzer 'root' @ 'localhost' \ verweigert ")"
}}
`` `

Scheint dasselbe Problem mit mysql_db zu haben - das Zurückkehren zu ansible v2.7.0 hat das Problem behoben.

Ich weiß nicht, wo das war, aber vor einiger Zeit (Wochen? Monate?) Habe ich mich mit einem ähnlichen Problem befasst. Der Grund dafür war, dass MySQLdb (das auf libmysql basiert) standardmäßig Unix-Sockets verwendete, um eine Verbindung herzustellen, während PyMySQL stellte standardmäßig eine Verbindung über TCP zu localhost . Abhängig davon, wie der Root-Zugriff auf Ihren MySQL-Server konfiguriert ist, können Sie dieses Problem möglicherweise umgehen.

Wie gesagt, ich erinnere mich nicht wirklich, wo ich das vorher geschrieben habe, und ich bin mir über die Details nicht mehr wirklich sicher, aber vielleicht gibt dies einem von Ihnen, der dieses Problem hat, einen Hinweis, wie man es löst :)

Ok, ich habe es gefunden. Es war eine Diskussion über # ansible-devel am 2. Oktober, und der Benutzer, der ein Verbindungsproblem hatte (er vermutete zuerst, dass die Behandlung eines leeren String-Passworts das Problem war), fand schließlich heraus, dass er login_unix_socket (wegen des unterschiedlichen Verhaltens, das ich oben erwähnt habe), damit hat es für ihn funktioniert. Leider hat er dafür kein Problem geschaffen.

Wie auch immer, @epeli @anniemelen @ bchanan03 , können Sie die Option login_unix_socket ausprobieren und sehen, ob das Problem dadurch für Sie behoben wird?

Hallo,
Ich habe das gleiche Problem mit Centos7, ansible 2.7.6.
Angabe von socket=/var/lib/mysql/mysql.sock in ~/.my.cnf
oder login_unix_socket: /var/lib/mysql/mysql.sock Option in der Aufgabe mysql_db
behebt den Verbindungsfehler.

cc @Xyon @bmalynovytch @dagwieers @michaelcoburn @oneiroi @tolland
Klicken Sie hier für Bot-Hilfe

Entschuldigung bis jetzt, ich denke, dieser Fehler wird immer noch nicht behoben.

@nizarakbarm hast du versucht, was ich vorgeschlagen habe und @efflamlemaillet versucht und verifiziert? Es wäre schön, wenn Sie das versuchen und bestätigen könnten, ob es hier funktioniert (oder nicht!).

Hallo @felixfontein , unter Ubuntu 18.04 behebt die von @efflamlemaillet gegebene
Ich denke folgendes:
https://stackoverflow.com/questions/41846000/mariadb-password-and-unix-socket-authentication-for-root
ist auch verwandt.

Hallo,
Wie gesagt, @pouyana , irgendwie verwendet das ansible MySQL-Modul, das standardmäßig eine Socket-Verbindung auf dem lokalen Server verwendet, jetzt TCP.

@felixfontein Es funktioniert, aber ich

@nizarakbarm login_unix_socket: /var/lib/mysql/mysql.sock muss in Ansible angegeben werden. Hast du das versucht?

@efflamlemaillet genauer gesagt, es ist nicht das Ansible-Modul selbst, sondern die verwendete Python MySQL-Verbindungsbibliothek. Die alte Bibliothek MySQLdb (die auf libmysql basiert) bevorzugt Unix-Sockets, während die neue Bibliothek PyMySQL eine TCP-Verbindung bevorzugt. Wenn Sie in Ihrem Spielbuch / Ihrer Rolle explizit angeben und angeben, wie eine Verbindung hergestellt werden soll, spielt dies keine Rolle. Wenn Sie dies nicht tun, hängt es davon ab, welche Bibliothek das Modul verwendet. Das Modul versucht zuerst PyMySQL und greift auf MySQLdb zurück, wenn PyMySQL nicht verfügbar ist.

Oke, danke für deine Antwort. @felixfontein Aus Ihrer Antwort kann es mir helfen, den Grund des Problems zu verstehen.

Das Ganze ist zu wissen, ob es als Fehler betrachtet werden sollte?
In diesem Fall könnte das Ansible-Modul möglicherweise das PyMySQL-Standardverhalten überschreiben, um sicherzustellen, dass das Modul auf dieselbe Weise eine Verbindung herstellt (wenn keine Verbindungsoption angegeben ist), wenn der installierte Treiber MySQLdb oder PyMySQL ist.

cc @ Alexander198961
Klicken Sie hier für Bot-Hilfe

In meinem Fall hat diese Problemumgehung auch geholfen
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  

Vielen Dank an @felixfontein für diesen Hinweis!
Die Angabe des Parameters login_unix_socket: /var/run/mysqld/mysqld.sock das Problem gelöst!

Musste alle mysql_{user,db} Modulaufgaben in den Dateien tasks/databases.yml , tasks/secure-installation.yml und tasks/users.yml aktualisieren

Ich habe dies im Dokument https://github.com/ansible/ansible/pull/66848 erklärt
es kommt mit 2.10

Schließ mich

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen