Ansible: mysql_user quebrado em 2.7.1 ao usar /root/.my.cnf

Criado em 29 out. 2018  ·  29Comentários  ·  Fonte: ansible/ansible



RESUMO

Ao atualizar de 2.7.0 para 2.7.1, começamos a ver este erro do 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'\")

A tarefa é a seguinte:

# 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

O último falha.

O Ansible 2.7.0 funciona bem.

TIPO DE PROBLEMA
  • Relatório de erro
NOME DO COMPONENTE

mysql_user

VERSÃO ANSÍVEL


`` `cole abaixo
ansible 2.7.1
arquivo de configuração = Nenhum
caminho de pesquisa do 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
localização do executável = / usr / local / bin / ansible
versão do python = 3.7.0 (padrão, 2 de outubro 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
OS / MEIO AMBIENTE

macOS Mojave versão 10.14 (18A391)

E servidor Ubuntu 18.04

PASSOS PARA REPRODUZIR

Veja RESUMO

RESULTADOS ESPERADOS

RESULTADOS REAIS


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

Comentários muito úteis

Ok, eu encontrei. Foi uma discussão em # ansible-devel em 2 de outubro, e o usuário que teve um problema de conexão (ele inicialmente suspeitou que o problema era o manuseio de uma senha de string vazia) finalmente descobriu que precisava usar login_unix_socket (por causa do comportamento diferente que mencionei acima), com isso funcionou para ele. Infelizmente, ele não criou um problema para isso.

De qualquer forma, @epeli @anniemelen @ bchanan03 , pode experimentar a opção login_unix_socket e ver se isso resolve o problema para você?

Todos 29 comentários

Olá @epeli , obrigado por enviar este problema!

clique aqui para obter ajuda do bot

Arquivos identificados na descrição:

Se esses arquivos estiverem imprecisos, atualize a seção component name da descrição ou use o comando !component bot.

clique aqui para obter ajuda do bot

@epeli Olá, https://github.com/ansible/ansible/pull/47809 corrige isso para você, poderia adicionar comentários sobre o PR

@timorunge Veja, adicionar diferentes usuários do mysql era possível sem este patch ...
Sim, meu problema não está relacionado a este PR, mas sim ao # 47736, então continuo falando lá. E não posso fornecer Dockerfile, desculpe.

Você já tentou o mesmo em uma ordem diferente? Significando basicamente: Primeiro logando sem senha, definindo a senha de root e depois gerando o .my.cnf?

Qual conector de banco de dados python você está usando atualmente? MySQLdb ou PyMySQL?

Olá a todos,
É possível que eu esteja tendo o mesmo problema com o Ansible 2.7.5? com 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]

Corrida:
`` `- nome: install_gerrit | criando MySQL DB (se usado)
mysql_db:
nome: "{{item.db}}"
codificação: latin1
estado: presente
with_items: '{{gerrit_db_info}}'
quando: item.type é definido e item.type == "mysql"

Error:

falhou: [192.168.202.15] {
"alterado": falso,
"invocação": {
"module_args": {
"agrupamento": "",
"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": nulo,
"nome": "reviewdb",
"rápido": verdadeiro,
"single_transaction": falso,
"ssl_ca": null,
"ssl_cert": null,
"ssl_key": null,
"estado": "presente",
"target": null
}
},
"item": {
"db": "reviewdb",
"host": "localhost",
"pass": "xxxxxx",
"tipo": "mysql",
"usuário": "gerrit"
},
"msg": "não foi possível conectar ao banco de dados, verifique se login_user e login_password estão corretos ou /root/.my.cnf tem as credenciais. Mensagem de exceção: (1698, u \" Acesso negado para o usuário 'root' @ 'localhost' \ ")"
}
`` `

Parece o mesmo problema com mysql_db - voltar para o ansible v2.7.0 resolveu o problema.

Eu não sei onde era, mas algum tempo (semanas? Meses?) Atrás eu pesquisei um problema semelhante, e o motivo era que MySQLdb (que é baseado em libmysql) estava usando soquetes Unix para conectar por padrão, enquanto PyMySQL estava se conectando via TCP a localhost por padrão. Dependendo de como o acesso root ao servidor MySQL está configurado, isso pode ajudá-lo a contornar esse problema.

Como eu disse, eu realmente não me lembro onde escrevi isso antes, e não tenho mais certeza sobre os detalhes, mas talvez isso dê a um de vocês que está tendo este problema uma dica de como resolvê-lo :)

Ok, eu encontrei. Foi uma discussão em # ansible-devel em 2 de outubro, e o usuário que teve um problema de conexão (ele inicialmente suspeitou que o problema era o manuseio de uma senha de string vazia) finalmente descobriu que precisava usar login_unix_socket (por causa do comportamento diferente que mencionei acima), com isso funcionou para ele. Infelizmente, ele não criou um problema para isso.

De qualquer forma, @epeli @anniemelen @ bchanan03 , pode experimentar a opção login_unix_socket e ver se isso resolve o problema para você?

Olá,
Eu tenho o mesmo problema com Centos7, ansible 2.7.6.
especificando socket=/var/lib/mysql/mysql.sock em ~/.my.cnf
ou a opção login_unix_socket: /var/lib/mysql/mysql.sock na tarefa mysql_db
está corrigindo o erro de conexão.

cc @Xyon @bmalynovytch @dagwieers @michaelcoburn @oneiroi @tolland
clique aqui para obter ajuda do bot

Desculpe até agora, acho que esse bug ainda não foi resolvido.

@nizarakbarm , você tentou o que eu sugeri e @efflamlemaillet tentou e verificou? Seria bom se você pudesse tentar isso e confirmar se funciona (ou não!) Aqui.

Olá @felixfontein , no Ubuntu 18.04 a solução fornecida por
Eu acho o seguinte:
https://stackoverflow.com/questions/41846000/mariadb-password-and-unix-socket-authentication-for-root
também está relacionado.

Oi,
como disse @pouyana , de alguma forma o módulo ansible mysql usando conexão de soquete por padrão no servidor local antes agora está usando tcp.

@felixfontein Funciona, mas não gosto de usar ~ / .my.cnf

@nizarakbarm login_unix_socket: /var/lib/mysql/mysql.sock é algo a ser especificado no Ansible. Você já tentou isso?

@efflamlemaillet para ser mais preciso, não é o módulo Ansible em si, mas a biblioteca de conexão MySQL do Python que ele usa. A antiga biblioteca, MySQLdb (que é baseada em libmysql), prefere soquetes Unix, enquanto a nova biblioteca, PyMySQL, prefere uma conexão TCP. Se você for explícito em seu manual / função e especificar como se conectar, não importa; mas se você não fizer isso, depende de qual biblioteca o módulo está usando. O módulo tenta o PyMySQL primeiro e retorna ao MySQLdb se o PyMySQL não estiver disponível.

Ok, obrigado pela sua resposta. @felixfontein Com sua resposta, pode me ajudar a entender o motivo do problema.

A questão é saber se deve ser considerado um bug?
Nesse caso, talvez o módulo Ansible possa substituir o comportamento padrão do PyMySQL para garantir que o módulo se conecte da mesma maneira (se não houver uma opção de conexão especificada) quando o driver instalado for MySQLdb ou PyMySQL.

No meu caso, essa solução alternativa também ajudou
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  

Obrigado @felixfontein por apontar isso!
Especificar o parâmetro login_unix_socket: /var/run/mysqld/mysqld.sock resolveu o problema!

Tive que atualizar todas as tarefas do módulo mysql_{user,db} nos arquivos tasks/databases.yml , tasks/secure-installation.yml e tasks/users.yml embora

eu expliquei isso no documento https://github.com/ansible/ansible/pull/66848
está vindo com 2,10

close_me

Esta página foi útil?
0 / 5 - 0 avaliações