我花了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一起工作。 我真的很难找到解决方案。难道这项工作不应该像魅力一样吗?
答案 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_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
在这种情况下,我们不需要$HOME/.my.conf
,因为login_user
和login_password
优先。
P.S:请确保仅在数据库不存在时才使用state: present
创建数据库。
那么我们什么时候需要login_unix_socket
?
答案在文档本身中。
The path to a Unix domain socket for **local** connections.
是的,仅当您的数据库实例位于与ansible相同的服务器上时。
如果您尝试添加此属性并尝试连接到远程实例,则它将失败,并显示与OP相同的错误消息,因为此参数似乎覆盖了login_host
至localhost
。
那么我们什么时候需要$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_user
和login_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