【问题标题】:Ansible unable to find .my.cnf Can't connect to local MySQL serverAnsible 找不到 .my.cnf 无法连接到本地 MySQL 服务器
【发布时间】:2020-11-02 17:08:52
【问题描述】:

自从 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 一起工作。 我真的很难找到解决方案。这不应该像魅力一样起作用吗?

【问题讨论】:

  • @techraf 剧本没有脚本?还有什么? ansible 脚本(剧本)访问服务器,否则 ansible 将毫无意义。 (3) 我知道有时程序员往往没有太多的幻想,但如果我说我添加了它......也许......也许你可以预料到?积极思考的人!感谢您鼓舞人心的言论!

标签: ansible


【解决方案1】:

好吧,想通了。就我而言,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。

【讨论】:

  • 我在 Ubuntu 18.04 上遇到了同样的问题,这解决了问题。
  • Debian 11/bullseye 上的同样问题,这已解决。
【解决方案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”,无需密码

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

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

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

如果你从 remote_host 运行你的剧本,你可能会得到错误 "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。

【讨论】:

    【解决方案3】:

    就我而言,我使用的是 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
    

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

    【讨论】:

      【解决方案4】:

      让我们先深入了解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创建db,只有当它不存在时。

      那么我们什么时候需要login_unix_socket

      答案就在文档本身。

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

      是的,只有当您的数据库实例位于执行 ansible 的同一服务器中时。

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

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

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

      [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】:

        无法找到 /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]:失败! => {“改变”:假, “msg”:“无法找到 /root/.my.cnf。异常消息:(1045, \"用户'root'@'localhost'的访问被拒绝(使用密码:YES)\")"}

        ** 这就是我修复它的方法**

        - 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
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            值得注意的是,ansible 只需要来自.my.cnf 文件的登录名和密码。所以如果你有这样的.my.cnf

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

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

            但对于 ansible,您必须在 playbook 文件中指定主机和端口:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-01
              • 2017-12-09
              • 2017-04-20
              相关资源
              最近更新 更多