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

在CentOS Stream 9上用Ansible重置MySQL 8 root密码遇阻求助

在CentOS Stream 9上用Ansible重置MySQL 8 root密码的解决方案

问题分析

你遇到的核心问题有两个:

  • 方法1中mysql命令的-p参数未直接指定密码,导致进入交互式等待状态,加上引号嵌套错误,最终挂起;
  • MySQL 8在CentOS Stream 9默认安装后,root@localhost采用unix_socket认证方式,而非密码认证,这导致你用临时密码或新密码尝试连接时都会失败。

修复步骤

1. 正确获取临时密码

先确保能从日志中正确提取临时密码:

- name: 获取MySQL临时root密码
  ansible.builtin.shell: grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}' | tail -n 1
  register: mysql_root_temp_pw
  no_log: true

2. 切换root认证方式并设置密码

由于默认是socket认证,需要先通过临时密码连接并修改认证方式,再设置新密码:

- name: 修改root认证方式并设置新密码
  ansible.builtin.shell: >
    mysql -u root -p"{{ mysql_root_temp_pw.stdout }}" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{{ centos_mysql_root_password }}';"

注:如果临时密码过期,可临时修改MySQL服务参数跳过权限表启动重置,但全新安装场景下上述方法足够可靠。

3. 用mysql_user模块管理root权限

密码设置完成后,再使用community.mysql.mysql_user模块配置root的登录主机:

- name: 限制root仅从本地登录
  community.mysql.mysql_user:
    login_user: root
    login_password: "{{ centos_mysql_root_password }}"
    name: root
    host: "{{ item }}"
    password: "{{ centos_mysql_root_password }}"
    state: present
  with_items:
    - localhost
    - 127.0.0.1
    - ::1

- name: 部署root用户的.my.cnf配置
  ansible.builtin.template:
    src: my.cnf.j2
    dest: /root/.my.cnf
    mode: '0600'

.my.cnf.j2模板内容示例:

[mysql]
user=root
password={{ centos_mysql_root_password }}
[mysqldump]
user=root
password={{ centos_mysql_root_password }}

完整Playbook示例

---
- hosts: centos_stream9
  vars:
    centos_mysql_root_password: "YourStrongPassword123!"
  tasks:
    - name: 安装MySQL 8相关包
      ansible.builtin.dnf:
        name:
          - mysql-server
          - mysql
          - python3-PyMySQL
        state: present

    - name: 启动并启用mysqld服务
      ansible.builtin.service:
        name: mysqld
        state: started
        enabled: true

    - name: 等待mysqld服务完全启动
      ansible.builtin.wait_for:
        path: /var/lib/mysql/mysql.sock
        state: present
        timeout: 60

    - name: 获取MySQL临时root密码
      ansible.builtin.shell: grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}' | tail -n 1
      register: mysql_root_temp_pw
      no_log: true

    - name: 修改root认证方式并设置新密码
      ansible.builtin.shell: >
        mysql -u root -p"{{ mysql_root_temp_pw.stdout }}" --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '{{ centos_mysql_root_password }}';"

    - name: 限制root仅从本地登录
      community.mysql.mysql_user:
        login_user: root
        login_password: "{{ centos_mysql_root_password }}"
        name: root
        host: "{{ item }}"
        password: "{{ centos_mysql_root_password }}"
        state: present
      with_items:
        - localhost
        - 127.0.0.1
        - ::1

    - name: 部署root用户的.my.cnf配置
      ansible.builtin.template:
        src: my.cnf.j2
        dest: /root/.my.cnf
        mode: '0600'

关键说明

  • 必须先切换root的认证方式为mysql_native_password,否则后续用密码连接会失败;
  • 使用-p"{{ mysql_root_temp_pw.stdout }}"的格式,避免-p后留空格导致交互式等待;
  • 确保安装python3-PyMySQL包,否则community.mysql.mysql_user模块无法正常工作;
  • .my.cnf文件必须设置0600权限,避免安全风险。

内容的提问来源于stack exchange,提问作者iknowiknownothing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:55:31