Ansible批量部署MySQL 5.7必须严格遵循用户准备、二进制解压、初始化(区分--initialize与--initialize-insecure)、systemd服务注册、socket路径校准及ALTER USER密码加固六大环节,缺一将导致启动失败或无法登录;因CentOS 7默认仓库缺乏持续更新的5.7 RPM包(尤其5.7.44+已停更el7版本),且内网常禁用外部repo,故生产环境普遍采用二进制包部署。

mysql-5.7 的批量部署在 Ansible 中不是“一键安装”,而是由多个关键环节串联而成:用户准备、二进制解压、初始化、服务注册、密码加固。漏掉任一环,mysqld 都可能启动失败或无法登录。
为什么不能直接用 yum install mysql-community-server?
CentOS 7 默认仓库中 mysql-community-server 版本常为 5.6 或 8.0,而 mysql57-community-release 仓库虽提供 5.7,但存在两个现实问题:
一是部分内网环境禁用外部 repo;二是 5.7.44+ 后官方不再更新 el7 的 RPM 包(截至 2026 年),yum install mysql-community-server 很可能报 No package available。所以生产环境普遍采用二进制包(mysql-5.7.44-linux-glibc2.12-x86_64.tar)方式部署。
初始化时必须区分 --initialize 与 --initialize-insecure
mysqld --initialize 会生成随机 root 密码并写入 error log,适合安全要求高的场景;--initialize-insecure 则默认空密码,省去解析日志步骤,但必须紧随其后执行 mysql -e "ALTER USER ..." 加密。Ansible 中常见错误是:
• 忘记加 --user=mysql 导致 datadir 权限混乱
• 没指定 --defaults-file=/etc/my.cnf,导致初始化时读错配置、端口冲突或 socket 路径错误
• 初始化后未 chown -R mysql:mysql /data/mysql,service 启动时直接退出
systemd 服务脚本必须适配二进制部署路径
从 /usr/local/mysql/support-files/mysql.server 复制的 init.d 脚本,在 CentOS 7+ 上需手动转换为 systemd unit,否则 systemctl start mysqld 会报 Failed to start mysqld.service: Unit not found。正确做法是:
• 替换脚本中 basedir 和 datadir 为实际路径(如 /usr/local/mysql 和 /data/mysql)
• 将修改后的脚本存为 /usr/lib/systemd/system/mysqld.service
• 执行 systemctl daemon-reload,再 systemctl enable mysqld
注意:若使用 chkconfig --add,仅对 SysV init 有效,systemd 下无效
密码加固阶段容易忽略 socket 路径和权限
初始化后首次连接必须用 --socket=/data/mysql/mysql.sock(而非默认 /tmp/mysql.sock),否则报 Can't connect to local MySQL server。Ansible 中常见疏漏:
• 未创建 /tmp/mysql.sock 的软链:file: src=/data/mysql/mysql.sock dest=/tmp/mysql.sock state=link
• mysql 命令未指定 socket 参数,导致连接被拒绝
• 密码更新语句用 UPDATE user SET ...(5.7.6+ 已弃用),应改用 ALTER USER 'root'@'localhost' IDENTIFIED BY '{{ mysql_root_password }}';
• flush privileges; 必须单独执行,不能合并在一条 mysql -e 中(分号不生效)
datadir 所有者没改成 mysql,或者 my.cnf 里 socket 和命令行用的不一致。这两个点不验证,剧本跑十遍也白搭。


















