ansible 自动化部署 mysql 初始化环境需确保实例启动即安全可用,关键步骤包括:安装 community.mysql 集合、配置 mysql_community_server 模块、正确处理 root 密码与认证方式、使用模板覆盖配置并触发服务重启。

用 Ansible 自动化部署 MySQL 初始化环境,关键不是装上就行,而是让实例一启动就安全、可用、可连接。核心在于避开系统包差异、绕过默认权限陷阱、确保首次连接通路畅通。
提前装好 community.mysql 集合
Ansible 2.10+ 已移除内置 mysql_* 模块,必须手动安装社区集合:
- 在控制节点运行:
ansible-galaxy collection install community.mysql - 验证是否生效:
ansible-doc -l | grep mysql应能看到community.mysql.mysql_community_server等模块 - 若后续报
No module named 'mysql',还需在控制节点装 Python 客户端:pip install mysqlclient(别用 PyMySQL)
用 mysql_community_server 模块一键初始化
别再写 yum/apt + shell 初始化脚本——它会自动适配 RHEL/CentOS 和 Ubuntu 的包名与路径,且内置安全初始化逻辑:
- Playbook 中调用时,必须写全名:
community.mysql.mysql_community_server,不能简写为mysql或mysql-server - 显式传入
root_password参数,例如:root_password: "MyS3cur3P@ss";空密码不被允许,也不能跳过 - 模块会自动启用
validate_password插件,如需弱密码测试,得额外加 task 执行:ALTER SYSTEM SET validate_password.policy = LOW;
首次连接必须走对认证通道
MySQL 5.7+ 默认 root 只能通过 Unix socket 本地认证,Ansible 的 mysql_user 等模块若直接走 TCP 会报 Access denied:
- 连接新实例时,优先使用
login_unix_socket: /var/run/mysqld/mysqld.sock(Ubuntu/RHEL 路径一致) - 若必须走 TCP(比如容器或远程管理),则需确保:
– my.cnf 中已注释掉skip-networking
– 显式指定login_host: 127.0.0.1和login_port: 3306
–login_password设为空字符串:login_password: ""(这是合法的首次连接方式)
配置文件覆盖要用模板 + notify
直接 copy 替换 /etc/my.cnf 会破坏 RPM 包依赖的 include 结构(如 /etc/my.cnf.d/),导致启动失败:
- 用 Jinja2 模板生成配置,例如
templates/my.cnf.j2,内容包含:!includedir /etc/my.cnf.d/ - 任务中用
template:模块分发,并配合notify: Restart MySQL - handlers 里定义重启服务动作,确保配置生效且不中断











