在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,GRANTlogin_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
相关产品推荐
相关产品推荐

