Ansible: mysql_user не работает в 2.7.1 при использовании /root/.my.cnf

Созданный на 29 окт. 2018  ·  29Комментарии  ·  Источник: ansible/ansible



РЕЗЮМЕ

При обновлении с 2.7.0 до 2.7.1 мы начали видеть эту ошибку из модуля 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'\")

Задача следующая:

# 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

Последний не работает.

Ansible 2.7.0 отлично работает.

ТИП ПРОБЛЕМЫ
  • Сообщение об ошибке
КОМПОНЕНТ НАЗВАНИЕ

mysql_user

ДОСТУПНАЯ ВЕРСИЯ


вставить ниже
доступный 2.7.1
файл конфигурации = Нет
настроенный путь поиска модуля = ['/Users/esamatti/.ansible/plugins/modules', '/ usr / share / ansible / plugins / modules']
расположение модуля ansible python = /usr/local/lib/python3.7/site-packages/ansible
расположение исполняемого файла = / usr / local / bin / ansible
версия python = 3.7.0 (по умолчанию, 2 октября 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
ОС / СРЕДА

macOS Mojave версии 10.14 (18A391)

И сервер Ubuntu 18.04

ДЕЙСТВИЯ ПО ВОСПРОИЗВЕДЕНИЮ

СМОТРЕТЬ РЕЗЮМЕ

ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ

ФАКТИЧЕСКИЕ РЕЗУЛЬТАТЫ


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

Самый полезный комментарий

Хорошо, нашел. Это было обсуждение # ansible-devel 2 октября, и пользователь, у которого возникла проблема с подключением (сначала он подозревал, что проблема заключается в обработке пароля с пустой строкой), наконец, обнаружил, что ему нужно использовать login_unix_socket (из-за разного поведения, о котором я упоминал выше), у него это сработало. К сожалению, он не создал для этого проблемы.

В любом случае, @epeli @anniemelen @ bchanan03 , можешь ли ты попробовать вариант login_unix_socket и посмотреть, решит ли это проблему для вас?

Все 29 Комментарий

Файлы, указанные в описании:

Если эти файлы неточны, обновите раздел описания component name или используйте команду !component bot.

нажмите здесь, чтобы получить помощь по ботам

@epeli Привет, https://github.com/ansible/ansible/pull/47809 исправляет это для вас, не могли бы вы добавить комментарии к PR?

@timorunge Видите ли, добавление разных пользователей mysql было возможно без этого патча ...
Да, моя проблема не связана с этим PR, но связана с # 47736, поэтому я продолжаю говорить там. И я не могу предоставить Dockerfile, извините.

Вы уже пробовали то же самое в другом порядке? В основном это означает: сначала войти в систему без пароля, установить пароль root, а затем создать .my.cnf?

Какой коннектор БД Python вы используете сейчас? MySQLdb или PyMySQL?

Привет всем,
Возможно ли, что я вижу такую ​​же проблему с Ansible 2.7.5? с 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]

Бег:
`` `- name: install_gerrit | создание БД MySQL (если используется)
mysql_db:
имя: "{{item.db}}"
кодировка: latin1
состояние: настоящее
with_items: '{{gerrit_db_info}}'
когда: item.type определен и item.type == "mysql"

Error:

не удалось: [192.168.202.15] {
"изменено": ложь,
"invocation": {
"module_args": {
"сопоставление": "",
"config_file": "/root/.my.cnf",
"connect_timeout": 30,
"кодировка": "латин1",
"ignore_tables": [],
"login_host": "localhost",
"login_password": ноль,
"логин_порт": 3306,
"login_unix_socket": ноль,
"login_user": ноль,
"name": "reviewdb",
"quick": правда,
"single_transaction": ложь,
"ssl_ca": ноль,
"ssl_cert": ноль,
"ssl_key": ноль,
"состояние": "настоящее",
"цель": ноль
}
},
"вещь": {
"db": "reviewdb",
"host": "localhost",
"пройти": "хххххх",
"тип": "MySQL",
"пользователь": "геррит"
},
"msg": "невозможно подключиться к базе данных, проверьте правильность login_user и login_password или /root/.my.cnf имеет учетные данные. Сообщение об исключении: (1698, u \" Доступ запрещен для пользователя 'root' @ 'localhost' \ ")"
}
``

Кажется, такая же проблема с mysql_db - возвращение к ansible v2.7.0 разрешило проблему.

Я не знаю, где это было, но некоторое время (недели? Месяцы?) Назад я столкнулся с аналогичной проблемой, и причина заключалась в том, что MySQLdb (который основан на libmysql) использовал сокеты Unix для подключения по умолчанию, а PyMySQL по умолчанию подключался через TCP к localhost . В зависимости от того, как настроен root-доступ к вашему серверу MySQL, это может помочь вам обойти эту проблему.

Как я уже сказал, я действительно не помню, где я писал это раньше, и я больше не уверен в деталях, но, возможно, это дает кому-то из вас, у кого есть эта проблема, подсказка о том, как ее решить :)

Хорошо, нашел. Это было обсуждение # ansible-devel 2 октября, и пользователь, у которого возникла проблема с подключением (сначала он подозревал, что проблема заключается в обработке пароля с пустой строкой), наконец, обнаружил, что ему нужно использовать login_unix_socket (из-за разного поведения, о котором я упоминал выше), у него это сработало. К сожалению, он не создал для этого проблемы.

В любом случае, @epeli @anniemelen @ bchanan03 , можешь ли ты попробовать вариант login_unix_socket и посмотреть, решит ли это проблему для вас?

Здравствуйте,
У меня такая же проблема с Centos7, доступным 2.7.6.
указание socket=/var/lib/mysql/mysql.sock в ~/.my.cnf
или параметр login_unix_socket: /var/lib/mysql/mysql.sock в задаче mysql_db
исправляет ошибку подключения.

cc @Xyon @bmalynovytch @dagwieers @michaelcoburn @oneiroi @tolland
нажмите здесь, чтобы получить помощь по ботам

Извините, но я думаю, что эта ошибка все еще не решена.

@nizarakbarm вы пробовали то, что я предлагал, и @efflamlemaillet пробовали и проверяли? Было бы неплохо, если бы вы могли попробовать это и проверить, работает ли это (или нет!) Здесь.

Привет @felixfontein , в Ubuntu 18.04 данный обходной путь от
Думаю, следующее:
https://stackoverflow.com/questions/41846000/mariadb-password-and-unix-socket-authentication-for-root
тоже связано.

Привет,
как сказал @pouyana , каким-то образом

@felixfontein Это работает, но я не люблю использовать ~ / .my.cnf

@nizarakbarm login_unix_socket: /var/lib/mysql/mysql.sock - это то, что нужно указать в Ansible. Вы пробовали это?

@efflamlemaillet, если быть более точным, это не сам модуль Ansible, а используемая им библиотека соединений Python MySQL. Старая библиотека MySQLdb (основанная на libmysql) предпочитает сокеты Unix, а новая библиотека PyMySQL предпочитает TCP-соединение. Если вы явно указали в своей книге / роли и указали, как подключиться, это не имеет значения; но если вы этого не сделаете, это зависит от того, какую библиотеку использует модуль. Модуль сначала пробует PyMySQL и возвращается к MySQLdb, если PyMySQL недоступен.

Оке, спасибо за ответ. @felixfontein Из вашего ответа это может помочь мне понять причину проблемы.

Все дело в том, чтобы понять, следует ли считать это ошибкой?
Если это так, возможно, модуль Ansible может переопределить поведение PyMySQL по умолчанию, чтобы убедиться, что модуль подключается таким же образом (если не указан параметр подключения), когда установлен драйвер MySQLdb или PyMySQL.

В моем случае этот обходной путь также помог
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  

Спасибо @felixfontein за указание на это!
Указание параметра login_unix_socket: /var/run/mysqld/mysqld.sock решило проблему!

Пришлось обновлять каждые mysql_{user,db} задачи модуля в файлах tasks/databases.yml , tasks/secure-installation.yml и tasks/users.yml хотя

я объяснил это в документе https://github.com/ansible/ansible/pull/66848
идет с 2.10

close_me

Была ли эта страница полезной?
0 / 5 - 0 рейтинги