Ansible无法找到.my.cnf无法连接到本地MySQL服务器

时间:2017-06-18 12:16:40

标签: ansible

我花了6个小时试图找出ansible如何在ubuntu 16上使用我的mariadb。

当我使用

手动登录服务器时
  

mysql -u someuser -p

一切正常

当我尝试使用ansible脚本访问服务器时使用:

  - name: Create mysql database
    mysql_user: name=someuser state=present password=somepw

抱怨:

  

致命:[IP]:失败! => {"改变":假,"失败":是的,   " msg":"无法连接到数据库,请检查login_user和   login_password是正确的或/home/someuser/.my.cnf有   证书。异常消息:(2002,\"无法连接到本地MySQL   服务器通过socket' /tmp/mysql.sock' (2)\")"}

然后我尝试将.my.cnf放入远程服务器上的目录中,就像它试图告诉我一样。 我还添加了login_user和login_password。没有帮助。

该文件如下所示:

/home/someuser/.my.cnf

 [client] 
 user=someuser
 password=somepw

"好"我想。也许在ansible脚本和conf文件中,凭据加倍。我试图离开conf文件或跳过ansible脚本中的凭据。没有帮助

我也重启了mysql服务器。没有帮助。奇怪的是,从服务器本身一切都与mysql shell一起工作。 我真的很难找到解决方案。难道这项工作不应该像魅力一样吗?

7 个答案:

答案 0 :(得分:6)

好的想通了。在我的案例中,Ubuntu 16将套接字文件放入

  

/var/run/mysqld/mysqld.sock

其中ansible并不期待它。 所以对我来说,它将login_unix_socket放入剧本(ansible脚本)

  - name: Create mysql database
    mysql_db:
      login_unix_socket: /var/run/mysqld/mysqld.sock
      name: projectname
      state: present 

并将.my.cnf放在上面。

答案 1 :(得分:2)

  

需要远程主机上的MySQLdb Python包。对于Ubuntu,这就像apt-get install python-mysqldb一样简单。 (参见apt。)对于CentOS / Fedora,这就像yum install MySQL-python一样简单。 (见yum。)

     

传递凭据时,都需要login_password和login_user。如果没有,模块将尝试从〜/ .my.cnf读取凭据,最后回到使用没有密码的MySQL默认登录“root”

之后请使用以下代码连接DB:

  mysql_user:
    name: root
    password: deepak
    login_unix_socket: /var/run/mysqld/mysqld.sock

请从my.cnf验证您的套接字文件并进行更新。

如果您正在从remote_host运行您的playbook,则可能会出错 "msg": "unable to connect to database, check login_user and login_password are correct or /home/********/.my.cnf has the credentials. Exception message: (1045, \"Access denied for user '********@'localhost' (using password: NO)\")"

要解决此问题,您必须允许远程主机连接到mysql。

答案 2 :(得分:0)

  

无法找到/root/.my.cnf。异常消息

我何时收到此错误。

- name: "Mysql Configuration - Resetting RootPassword"
  mysql_user:
    login_user: root
    login_password: ''
    name: root
    host: localhost     <<===================== Cause of Error.
    password: "{{mysql_root_password}}"


- name: "Mysql Configuration - Creating Wordpress Database"
  mysql_db:
    login_user: root
    login_password: "{{mysql_root_password}}"
    db: "{{wp_database}}"
    state: present
  致命:[centos-client.ansible.lab]:失败! => {“已更改”:false,   “ msg”:“无法找到/root/.my.cnf。异常消息:(1045,   \“拒绝用户'root'@'localhost'的访问(使用密码:是)\”)“}

**这就是我修复的方式**

- name: "Mysql Configuration - Resetting RootPassword"
  mysql_user:
    login_user: root
    login_password: ''
    name: root
    host_all: yes     <<=====================  Fix
    password: "{{mysql_root_password}}"


- name: "Mysql Configuration - Creating Wordpress Database"
  mysql_db:
    login_user: root
    login_password: "{{mysql_root_password}}"
    db: "{{wp_database}}"
    state: present

答案 3 :(得分:0)

在我的情况下,我使用的是CentOS,在CentOS中,袜子路径与我所想的完全不同,

使用

找到了路径
HTTPS=true

最后,此问题已得到解决,

ps -ef | grep mariadb

我知道这是一个很老的问题。我最近遇到了同样的情况,并认为这可能对某些追求同样的人有所帮助。

答案 4 :(得分:0)

首先让我们深入研究mysql_db模块:

要监视的主要参数是login_hostlogin_userlogin_password

最简单的方法(在此示例中,创建数据库)是:

- name: Create database
  mysql_db:
    name: "{{ the_name_of_db_to_create }}"
    login_host: "{{ the_instance_where_db_needs_creating }}"
    login_user: "{{ the_master_username_for_instance }}"
    login_password: "{{ the_master_password_for_instance }}"
    state: present

在这种情况下,我们不需要$HOME/.my.conf,因为login_userlogin_password优先。

P.S:请确保仅在数据库不存在时才使用state: present创建数据库。

那么我们什么时候需要login_unix_socket

答案在文档本身中。

The path to a Unix domain socket for **local** connections.

是的,仅当您的数据库实例位于与ansible相同的服务器上时。

如果您尝试添加此属性并尝试连接到远程实例,则它将失败,并显示与OP相同的错误消息,因为此参数似乎覆盖了login_hostlocalhost

那么我们什么时候需要$HOME/.my.conf

当您的git资料库中存放的是Ansible剧本时,由于任何原因,都无法在其中保留用户名和密码之类的详细信息。您仍然可以隐藏在env vars后面或在执行过程中使用var文件,等等。但是您可以决定手动或作为一次性操作将$HOME/.my.conf添加到服务器中。该文件的格式为:

[client] 
user=the_master_username_for_instance
password=the_master_password_for_instance

不用说,添加此文件时,不需要参数login_userlogin_password

当我既不提及参数又不提及conf文件时会发生什么?

Ansible随后将尝试使用用户名root且没有密码。


现在,让我们看看如何使用mysql_user模块创建新用户

请注意,该模块不仅仅用于创建新用户。但这是迄今为止最受欢迎的功能。

最简单的方法是:

- name: Create user
  mysql_user:
    name: "{{ the_name_of_user_to_create }}"
    login_host: "{{ the_instance_where_db_needs_creating }}"
    login_user: "{{ the_master_username_for_instance }}"
    login_password: "{{ the_master_password_for_instance }}"
    state: present

所有参数均遵循与mysql_db模块中相同的规则。

现在,这将创建user@'localhost'。如果要创建user@'some_other_host'怎么办?

这里是:

- name: Create user
  mysql_user:
    name: "{{ the_name_of_user_to_create }}"
    password: "{{ the_password_for__the_new_user }}"
    login_host: "{{ the_instance_where_db_is }}"
    login_user: "{{ the_master_username_for_instance }}"
    login_password: "{{ the_master_password_for_instance }}"
    state: present
    host: "{{ the_client_host }}"

请注意,%可以使用the_client_host,以允许从任何地方访问。

答案 5 :(得分:0)

请注意,在某些发行版(如ubuntu)中,您可能需要使用login_unix_socket来指定mysql套接字的确切位置。

答案 6 :(得分:0)

值得注意的是,Ansible 仅从.my.cnf文件中获取登录名和密码。因此,如果您有.my.cnf这样的话:

[client]
host=10.0.0.4
user=root
port=3310
password=strongpassword

[mysql]
database=irk

它使您只需键入mysql即可轻松地从控制台连接到mysql。

但是对于Ansible,您必须在剧本文件中指定主机和端口:

- mysql_user:
    ...
    login_host: 10.0.0.4
    login_port: 3310