4. 使用Ansible Playbook安装和配置MySQL数据库
任务目标
编写一个Ansible Playbook,在目标主机上完成MySQL数据库的安装、服务配置、数据库与用户创建,并开放远程访问权限。执行完毕后,可通过远程客户端使用新建账号连接MySQL并操作指定数据库。
环境依赖
- 控制端:装有Ansible 2.9+的主机
- 目标主机:CentOS 7/8 或 RHEL 7/8(本文以CentOS 7为例)
- 目标主机需已配置SSH免密登录,且当前用户具备sudo权限
- 目标主机可访问EPEL或官方MySQL yum仓库(本文使用MySQL官方yum仓库)
Playbook完整代码
---
- name: Install and configure MySQL database
hosts: db_servers
become: yes
vars:
mysql_root_password: "Root@12345"
mysql_db_name: "appdb"
mysql_user_name: "appuser"
mysql_user_password: "App@12345"
mysql_bind_address: "0.0.0.0"
mysql_repo_url: "https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm"
tasks:
- name: Install MySQL yum repository
yum:
name: "{{ mysql_repo_url }}"
state: present
- name: Install MySQL server
yum:
name: mysql-community-server
state: present
update_cache: yes
- name: Start and enable mysqld service
service:
name: mysqld
state: started
enabled: yes
- name: Get temporary root password
shell: grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}'
register: mysql_temp_password
changed_when: false
- name: Set root password and configure remote access
shell: |
mysql --connect-expired-password -u root -p"{{ mysql_temp_password.stdout }}" -e "
ALTER USER 'root'@'localhost' IDENTIFIED BY '{{ mysql_root_password }}';
CREATE DATABASE IF NOT EXISTS {{ mysql_db_name }};
CREATE USER IF NOT EXISTS '{{ mysql_user_name }}'@'%' IDENTIFIED BY '{{ mysql_user_password }}';
GRANT ALL PRIVILEGES ON {{ mysql_db_name }}.* TO '{{ mysql_user_name }}'@'%';
FLUSH PRIVILEGES;
"
register: mysql_config_result
failed_when: mysql_config_result.rc != 0
- name: Update MySQL bind address
lineinfile:
path: /etc/my.cnf
regexp: '^bind-address'
line: 'bind-address = {{ mysql_bind_address }}'
create: yes
- name: Restart mysqld to apply bind address
service:
name: mysqld
state: restarted
运行方式
# 1. 在inventory文件中定义db_servers主机组
# 2. 执行Playbook
ansible-playbook -i inventory.ini mysql_install.yml
验证方法
Playbook执行成功后,在任意能访问目标主机3306端口的机器上执行以下命令验证:
mysql -h <目标主机IP> -u appuser -p'App@12345' -e "USE appdb; SELECT 1;"
若返回结果包含1,说明数据库安装成功、用户创建成功、远程访问权限已生效。同时可执行mysql -h <目标主机IP> -u root -p'Root@12345' -e "SHOW DATABASES;"验证root远程登录(需注意root默认仅限localhost,如需root远程登录需额外授权)。
常见问题
- yum仓库安装失败:确认目标主机可访问外网,或提前将rpm包下载到本地并改用本地路径。
- 临时密码获取为空:MySQL 8.0首次启动后日志路径可能不同,可检查
/var/log/mysqld.log是否存在,或改用mysqld --initialize-insecure方式初始化(需在安装后手动执行)。 - 密码策略限制:MySQL 8.0默认密码策略要求长度≥8且包含大小写字母、数字和特殊字符,示例密码已满足要求;若需修改策略,可在
/etc/my.cnf的[mysqld]段添加validate_password.policy=LOW。 - 防火墙拦截:若目标主机启用了firewalld,需放行3306端口:
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload。