You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Ubuntu远程EC2实例(web01)上使用Ansible配置MySQL时遭遇root用户认证失败问题

在Ubuntu远程EC2实例(web01)上使用Ansible配置MySQL时遭遇root用户认证失败问题

嘿,咱们来搞定你遇到的这个MySQL root认证失败问题,这在Ubuntu上配置MySQL时是个挺常见的坑,一步步来解决:

问题根源

Ubuntu默认的MySQL root用户是通过unix_socket插件认证的,而不是密码认证——也就是说,只有通过root用户(或sudo)直接登录服务器执行mysql命令才能访问,用密码尝试连接localhost会直接被拒绝,这就是你看到(1698, "Access denied for user 'root'@'localhost'")报错的原因。

解决步骤及修正后的Playbook

1. 先切换root用户的认证方式为密码认证

我们需要先通过Shell命令修改root用户的认证插件,因为此时还没法用mysql_user模块正常连接:

- name: 切换MySQL root用户为密码认证模式
  shell: |
    mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';"
  become: yes

解释:Ubuntu默认允许sudo用户直接无密码登录MySQL,所以这条命令能顺利执行,把root@localhost的认证方式改成密码认证。

2. 修正mysql_user任务的错误

你的原任务有两个小问题:

  • priv字段格式错误:多了一个点,应该是*.*:ALL,GRANT而非*.*.:ALL,GRANT
  • login_host应该用localhost(我们刚给localhost的root设置了密码),而不是直接用web01

修正后的mysql_user任务:

- name: 配置MySQL root用户远程访问权限
  mysql_user:
    check_implicit_admin: true
    login_user: root
    login_password: password
    login_host: localhost
    user: root
    password: password
    host: "{{ inventory_hostname }}"  # 对应你的web01主机
    priv: "*.*:ALL,GRANT"
    state: present

3. 确保.my.cnf文件权限正确

MySQL要求这个凭证文件的权限必须是600(只有root能读写),否则会拒绝读取,所以加一个任务设置权限:

- name: 设置.my.cnf文件的安全权限
  file:
    path: /root/.my.cnf
    mode: '0600'
    owner: root
    group: root

完整修正后的Playbook

- name: 在Ubuntu上配置MySQL
  hosts: web01
  become: yes
  tasks:
    - name: 安装MySQL服务器
      apt:
        name: mysql-server
        state: present

    - name: 安装Python MySQL依赖模块
      apt:
        name: python3-pymysql
        state: present

    - name: 启动并设置MySQL开机自启
      service:
        name: mysql
        state: started
        enabled: yes

    - name: 切换MySQL root用户为密码认证模式
      shell: |
        mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';"
      become: yes

    - name: 设置.my.cnf文件的安全权限
      file:
        path: /root/.my.cnf
        mode: '0600'
        owner: root
        group: root

    - name: 配置MySQL root用户远程访问权限
      mysql_user:
        check_implicit_admin: true
        login_user: root
        login_password: password
        login_host: localhost
        user: root
        password: password
        host: "{{ inventory_hostname }}"
        priv: "*.*:ALL,GRANT"
        state: present

    - name: 创建数据库db
      mysql_db:
        name: db
        state: present
        login_user: root
        login_password: password
        login_host: localhost

额外注意事项

  • 生产环境绝对不要用password这种弱密码,换成复杂的强密码
  • 如果你不需要root用户远程访问,建议不要创建root@web01,改用普通用户远程连接更安全
  • 敏感密码可以用Ansible Vault加密存储,避免明文写在Playbook里

备注:内容来源于stack exchange,提问作者Nikhil Chopra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 12:38:14