批量部署MySQL 8.0集群关键在inventory分组清、my.cnf.j2模板动态准、mysqld --initialize-insecure权限卡得死:必须硬拆mysql_masters/mysql_slaves组,模板依group_names动态设log-bin/read_only/skip-slave-start,server-id全局唯一,/etc/my.cnf权限644,初始化须mysql用户执行且目录属主严格匹配。

批量部署 MySQL 8.0 集群,关键不在“装得快”,而在 inventory 分组清、my.cnf.j2 模板动态准、mysqld --initialize-insecure 权限卡得死——这三处错任意一个,集群大概率卡在 Seconds_Behind_Master: NULL 或直接报 ERROR 2003 (HY000): Can't connect to MySQL server。
inventory 必须硬拆 mysql_masters 和 mysql_slaves 组
Ansible 不会识别主从语义,只认你写进 group 名字里的字符串。用 [dbservers] 一把抓再靠 when: inventory_hostname == 'db1' 判断角色,扩容时改主机名就得同步改几十处条件,极易漏。
-
[mysql_masters]只放 1 台(MGR 场景下可多台),用于写入 + 生成 binlog -
[mysql_slaves]放所有只读节点,用于拉取 relay log - 后续所有模板渲染、任务分支、handlers 触发,都基于
{% if 'mysql_masters' in group_names %},不是主机名或自定义变量
my.cnf.j2 模板里必须动态控制 log-bin、read_only 和 skip-slave-start
MySQL 主从行为由配置文件加载时决定,不是启动后靠 SQL 临时设的。写死参数或漏开关,会导致从库被写入、主库复制线程自启、或从库根本拉不到日志。
- 主库必须有:
log-bin = /data/mysql/binlog/mysql-bin、binlog-format = ROW、skip-slave-start = 1 - 从库必须有:
read_only = ON、relay-log = /data/mysql/relaylog/relay-bin、skip-slave-start = 0 -
server-id必须全局唯一:主库用100,从库用201、202这类递增值;不能全写1 -
/etc/my.cnf文件权限必须是644,否则mysqld启动时静默拒绝读取,日志只报Failed to open config file
mysqld --initialize-insecure 对用户和目录属主极其敏感
MySQL 8.0+ 已弃用 mysql_install_db,改用 mysqld --initialize-insecure 初始化数据目录。这个命令不校验密码,但会严格检查运行用户和路径权限。
- 命令必须由
mysql用户执行,不能用root直接跑 -
/data/mysql目录属主必须是mysql:mysql,且需提前chown -R mysql:mysql /data/mysql - 命令必须加
--user=mysql和--basedir参数,否则报Failed to find valid data directory - 首次运行后不会生成临时 root 密码,适合自动化场景,但后续必须立刻用
mysql_user模块设强密码
最易被忽略的是 /etc/my.cnf 权限和 mysqld --initialize-insecure 的执行用户——两者出错都不会抛明确错误,只会让服务起不来或复制不生效,排查时容易绕远路。


















