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

