从6个小时开始,我试图找出ansible如何在ubuntu 16上使用我的mariadb.
当我手动登录服务器时
mysql -u someuser -p
一切正常
当我尝试使用ansible脚本访问服务器时:
- name: Create mysql database
mysql_user: name=someuser state=present password=somepw
Run Code Online (Sandbox Code Playgroud)
抱怨:
致命:[IP]:失败!=> {"已更改":false,"failed":true,"msg":"无法连接到数据库,请检查login_user和login_password是否正确或/home/someuser/.my.cnf是否具有凭据.异常消息:( 2002年,"无法通过套接字连接到本地MySQL服务器'/tmp/mysql.sock'(2)\")"}
然后我尝试将.my.cnf放入远程服务器上的目录中,就像它试图告诉我的那样.我还添加了login_user和login_password.没有帮助.
该文件如下所示:
/home/someuser/.my.cnf
[client]
user=someuser
password=somepw
Run Code Online (Sandbox Code Playgroud)
"好的"我想.也许在ansible脚本和conf文件中,凭据加倍.我试图离开conf文件或跳过ansible脚本中的凭据.没有帮助
我也重启了mysql服务器.没有帮助.奇怪的是,从服务器本身一切都与mysql shell一起工作.我真的很难找到解决方案.这不应该像魅力一样吗?
好吧想通了.在我的案例中,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
Run Code Online (Sandbox Code Playgroud)
和上面提到的.my.cnf一样.
让我们首先深入了解该mysql_db模块:
需要关注的主要参数是login_host、login_user、 和login_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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们不需要,$HOME/.my.conf因为login_userandlogin_password优先。
PS:一定要state: present在db不存在的情况下才使用create db。
那我们什么时候需要呢login_unix_socket?
答案就在文档本身中。
The path to a Unix domain socket for **local** connections.
Run Code Online (Sandbox Code Playgroud)
是的,仅当您的数据库实例位于执行 ansible 的同一服务器中时。
如果您尝试添加此属性并尝试连接到远程实例,它将失败并显示OP提到的相同错误消息,因为此参数似乎覆盖login_host为localhost.
那我们什么时候需要呢$HOME/.my.conf?
当您保存 ansible playbook 的 git 存储库过于敏感并且出于任何原因无法在其中留下用户名和密码等详细信息时。您仍然可以隐藏在环境变量后面或在执行期间使用 var 文件等。但是您可能决定手动添加$HOME/.my.conf到服务器中或作为一次性的 ansible 操作。文件的格式为:
[client]
user=the_master_username_for_instance
password=the_master_password_for_instance
Run Code Online (Sandbox Code Playgroud)
不用说,当添加这个文件时,参数login_user和login_password不是必需的。
当我既不提及参数也不提及conf 文件时会发生什么?
然后 Ansible 将尝试使用用户名root而不使用密码。
现在,让我们看看如何使用mysql_user模块创建新用户
请注意,该模块不仅仅用于创建新用户。但这是迄今为止最受欢迎的功能。
最简单的方法是:
The path to a Unix domain socket for **local** connections.
Run Code Online (Sandbox Code Playgroud)
所有参数都遵循与上面 mysql_db 模块中相同的规则。
现在,这将创建user@'localhost'. 如果你想创造怎么办user@'some_other_host'?
这里是:
[client]
user=the_master_username_for_instance
password=the_master_password_for_instance
Run Code Online (Sandbox Code Playgroud)
请注意,您可以使用%来the_client_host允许从任何地方进行访问。
\n\n\n需要远程主机上的 MySQLdb Python 包。对于 Ubuntu,这就像 apt-get install python-mysqldb 一样简单。(参见 apt。)对于 CentOS/Fedora,这就像 yum install MySQL-python 一样简单。(见百胜。)
\n\n传递凭据时,login_password 和 login_user 都是必需的。如果不存在,模块将尝试从 ~/.my.cnf 读取凭据,最后回退到使用 MySQL 默认登录 \xe2\x80\x98root\xe2\x80\x99,无需密码
\n
之后请使用以下代码连接数据库:
\n\n mysql_user:\n name: root\n password: deepak\n login_unix_socket: /var/run/mysqld/mysqld.sock\nRun Code Online (Sandbox Code Playgroud)\n\n请验证您的套接字文件my.cnf并更新它。
如果您从remote_host运行playbook,您可能会收到错误\n\n "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)\\")"\n
要解决此问题,您必须允许远程主机连接到 mysql。
\n| 归档时间: |
|
| 查看次数: |
7358 次 |
| 最近记录: |