Ansible无法找到.my.cnf Can';无法连接到本地MySQL服务器
6个小时以来,我一直在试图找出ansible有多希望在ubuntu 16上与我的mariadb合作 当我使用手动登录服务器时 mysql-usomeuser-p 一切正常 当我尝试使用ansible脚本访问服务器时,使用: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
- 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