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

Ansible无法找到.my.cnf Can';无法连接到本地MySQL服务器,ansible,Ansible,6个小时以来,我一直在试图找出ansible有多希望在ubuntu 16上与我的mariadb合作 当我使用手动登录服务器时 mysql-usomeuser-p 一切正常 当我尝试使用ansible脚本访问服务器时,使用: - name: Create mysql database mysql_user: name=someuser state=present password=somepw 它抱怨说: 致命:[IP]:失败!=>{“更改”:false,“失败”:true, “ms

6个小时以来,我一直在试图找出ansible有多希望在ubuntu 16上与我的mariadb合作

当我使用手动登录服务器时

mysql-usomeuser-p

一切正常

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

  - name: Create mysql database
    mysql_user: name=someuser state=present password=somepw
它抱怨说:

致命:[IP]:失败!=>{“更改”:false,“失败”:true, “msg”:“无法连接到数据库,请检查登录用户和” 登录密码正确或/home/someuser/.my.cnf具有 凭据。异常消息:(2002,\”无法连接到本地MySQL 服务器通过套接字“/tmp/mysql.sock'(2)\”}

然后我尝试将.my.cnf放入远程服务器上的目录,就像它试图告诉我的那样。 我还添加了登录用户和登录密码。没有帮助

该文件如下所示:

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

[mysql]
database=irk
/home/someuser/.my.cnf

 [client] 
 user=someuser
 password=somepw
“好吧”我想。可能ansible脚本和conf文件中的凭据加倍了。我试图离开conf文件或跳过ansible脚本中的凭据。没有帮助

我还重新启动了mysql服务器。没有帮助。奇怪的是,从服务器本身来看,mysql外壳的所有功能都可以正常工作。
我真的在努力寻找解决办法。这不应该像个符咒吗?

好吧,我想起来了。在我的例子中,Ubuntu 16将套接字文件放入

/var/run/mysqld/mysqld.sock

ansible没有想到的地方。 因此,对我来说,将登录unix套接字放入剧本(ansible脚本)是有效的

和地点。我的cnf就像上面提到的

需要远程主机上的MySQLdb Python包。对于Ubuntu来说,这与安装python mysqldb一样简单。(请参阅apt.)对于CentOS/Fedora,这与yum安装MySQL-python一样简单。(见yum。)

传递凭据时需要登录密码和登录用户。如果没有,模块将尝试从~/.my.cnf读取凭据,最后返回到使用MySQL默认登录名“root”,而不使用密码

之后,请使用以下代码连接数据库:

  mysql_user:
    name: root
    password: deepak
    login_unix_socket: /var/run/mysqld/mysqld.sock
请从
my.cnf
验证套接字文件并更新它

如果您是从远程主机运行playbook,则可能会出现错误

“msg”:“无法连接到数据库,请检查登录用户和登录密码是否正确或/home/************/.my.cnf具有凭据。异常消息:(1045,\“拒绝访问用户'*******@'localhost'(使用密码:否)\”)

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

无法找到/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
-name:“Mysql配置-重置根密码”
mysql\u用户:
登录用户:root
登录\u密码:“”
姓名:root

host:localhost在我的例子中,我使用的是CentOS,在CentOS中,sock路径与我想象的完全不同

找到了具有

ps -ef | grep mariadb
最后,问题得到了如下解决:

   - name: Create database
     mysql_db:
        name: "{{ db_name }}"
        state: present
        login_unix_socket: /var/lib/mysql/mysql.sock

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

让我们先深入了解一下
mysql\u db
模块:

要查看的主要参数有
login\u host
login\u user
login\u password

最简单的方法(在本例中,创建db)是:

-名称:创建数据库
mysql_数据库:
名称:“{{要创建的数据库的名称}”
登录\u主机:“{{u数据库\u需要\u创建的\u实例\u}”
登录用户:“{{{{u主机\用户名\用于\实例的\用户名}”
登录密码:{{{{u主机密码}}
国家:现在
在这种情况下,我们不需要
$HOME/.my.conf
,因为
login\u用户
login\u密码
优先

注意:确保只有在数据库不存在时才使用
state:present
创建数据库

我们什么时候需要
login\u unix\u socket

答案就在文档本身中

The path to a Unix domain socket for **local** connections.
是,仅当您的db实例位于执行ansible的同一服务器上时

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

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

当您的git存储库保存ansible playbook时,由于任何原因,它过于敏感,无法在其中留下用户名和密码等详细信息。您仍然可以隐藏在env vars后面,或者在执行期间使用var文件,等等。。但您可以决定手动或一次性在服务器中添加
$HOME/.my.conf
。该文件的格式为:

[client] 
user=the_master_username_for_instance
password=the_master_password_for_instance
不用说,添加此文件时,不需要参数
login\u user
login\u password

如果我既不提及参数也不提及conf文件,会发生什么情况?

然后Ansible将尝试使用用户名
root
而不使用密码


现在,让我们看看如何使用
mysql\u user
module

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

最简单的方法是:

-名称:创建用户
mysql\u用户:
名称:“{{用户的名称}
登录\u主机:“{{u数据库\u需要\u创建的\u实例\u}”
登录用户:“{{{{u主机\用户名\用于\实例的\用户名}”
登录密码:{{{{u主机密码}}
国家:现在
在mysql_db模块中,所有参数都遵循与上述相同的规则

现在,这将创建
user@'localhost'
[client] 
user=the_master_username_for_instance
password=the_master_password_for_instance
[client]
host=10.0.0.4
user=root
port=3310
password=strongpassword

[mysql]
database=irk
- mysql_user:
    ...
    login_host: 10.0.0.4
    login_port: 3310