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。