geerlingguy.mysql

Ansible 角色:MySQL

CI

在 RHEL/CentOS 或 Debian/Ubuntu 服务器上安装和配置 MySQL 或 MariaDB 服务器。

需求

没有特殊要求;请注意,此角色需要 root 访问权限,所以请在包含 become: yes 的剧本中运行,或者在剧本中像这样调用该角色:

- hosts: database
  roles:
    - role: geerlingguy.mysql
      become: yes

角色变量

可用的变量如下所示,包含默认值(见 defaults/main.yml):

mysql_user_home: /root
mysql_user_name: root
mysql_user_password: root

用于存储 Python MySQL 设置的主目录,Ansible 连接 MySQL 时会使用。应该是运行该 Ansible 角色的用户的主目录。如果您在非 root 用户账户下运行此角色并想要设置非 root 用户,可以设置 mysql_user_namemysql_user_password

mysql_root_home: /root
mysql_root_username: root
mysql_root_password: root

MySQL root 用户账户信息。

mysql_root_password_update: false

是否强制更新 MySQL root 用户的密码。默认情况下,此角色仅在初次配置 MySQL 时更改 root 用户的密码。您可以通过将其设置为 yes 强制更新。

注意:如果在失败或中断的剧本运行后出现 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 错误,通常意味着 root 密码最初没有更新。尝试删除配置的 mysql_user_home 中的 .my.cnf 文件,或者更新它并设置 password=''(不安全的默认密码)。再次运行剧本,mysql_root_password_update 设置为 yes,设置应该完成。

注意:如果在从 CLI 登录时出现 ERROR 1698 (28000): Access denied for user 'root'@'localhost' (using password: YES) 错误,您可能需要以 root 用户或 sudo 权限运行。

mysql_enabled_on_startup: true

是否在启动时启用 MySQL。

mysql_config_file: *默认值取决于操作系统*
mysql_config_include_dir: *默认值取决于操作系统*

主要的 my.cnf 配置文件和包含目录。

overwrite_global_mycnf: true

每次运行此角色时是否应覆盖全局 my.cnf。将其设置为 no 将告诉 Ansible 仅在 my.cnf 文件不存在时创建该文件。如果您希望使用此角色的变量配置 MySQL,则应将其保留为默认值(yes)。

mysql_config_include_files: []

一个文件列表,用来覆盖默认全局 my.cnf。数组中的每个项目都需要一个 "src" 参数,即文件的路径。可选的 "force" 参数可以强制每次 Ansible 运行时更新文件。

mysql_databases: []

要创建的 MySQL 数据库。一个数据库包含值 nameencoding(默认为 utf8)、collation(默认为 utf8_general_ci)和 replicate(默认为 1,仅在配置了复制时使用)。这些格式与 mysql_db 模块中的格式相同。

您还可以通过将 state 设置为 absent(默认为 present)来删除一个数据库(或确保它不在服务器上)。

mysql_users: []

MySQL 用户及其权限。一个用户包含以下值:

  • name
  • host(默认为 localhost
  • password(可以是明文或加密—如果加密,请设置 encrypted: yes
  • encrypted(默认为 no
  • priv(默认为 *.*:USAGE
  • append_privs(默认为 no
  • state(默认为 present

这些格式与 mysql_user 模块中的格式相同。

mysql_packages:
  - mysql
  - mysql-server

(操作系统特定,列出了 RedHat/CentOS 默认值)要安装的包。在某些情况下,您可能需要添加额外的包,例如 mysql-devel

mysql_enablerepo: ""

(仅适用于 RedHat/CentOS)如果您启用了任何额外的仓库(建议使用 geerlingguy.repo-epel 或 geerlingguy.repo-remi),可以在此变量下列出这些仓库(例如 remi,epel)。这在想要安装更高版本的 MySQL 时会很方便。

mysql_python_package_debian: python3-mysqldb

(仅适用于 Ubuntu/Debian)如果您需要明确覆盖 MySQL Python 包,可以在这里设置。如果使用的是运行 Python 2 的旧版发行版,请将其设置为 python-mysqldb

mysql_port: "3306"
mysql_bind_address: '0.0.0.0'
mysql_datadir: /var/lib/mysql
mysql_socket: *默认值取决于操作系统*
mysql_pid_file: *默认值取决于操作系统*

默认的 MySQL 连接配置。

mysql_log_file_group: mysql *Debian 上的 adm*
mysql_log: ""
mysql_log_error: *默认值取决于操作系统*
mysql_syslog_tag: *默认值取决于操作系统*

MySQL 日志配置。将 mysql_log(普通查询日志)或 mysql_log_error 设置为 syslog 将使 MySQL 日志记录到 syslog,使用 mysql_syslog_tag

mysql_slow_query_log_enabled: false
mysql_slow_query_log_file: *默认值取决于操作系统*
mysql_slow_query_time: 2

慢查询日志设置。请注意,日志文件将由此角色创建,但如果您在具有 SELinux 或 AppArmor 的服务器上运行,您可能需要将此路径添加到 MySQL 的允许路径中,或禁用 mysql 配置文件。例如,在 Debian/Ubuntu 上,您可以运行 sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld && sudo service apparmor restart

mysql_key_buffer_size: "256M"
mysql_max_allowed_packet: "64M"
mysql_table_open_cache: "256"
...

defaults/main.yml 中的其余设置控制 MySQL 的内存使用和一些其他常见设置。默认值已针对可以消耗 512 MB RAM 的服务器进行调整,因此您应该考虑调整这些值以更好地适应您的特定服务器。

mysql_server_id: "1"
mysql_max_binlog_size: "100M"
mysql_binlog_format: "ROW"
mysql_expire_logs_days: "10"
mysql_replication_role: ''
mysql_replication_master: ''
mysql_replication_user: {}

复制设置。根据服务器设置 mysql_server_idmysql_replication_role(例如,主服务器的 ID 为 1mysql_replication_rolemaster,从服务器的 ID 为 2mysql_replication_roleslave)。mysql_replication_user 使用与 mysql_users 中单个列表项相同的键,在主服务器上创建,并用于所有从服务器的复制。

mysql_replication_master 需要解析为从服务器可以访问的 IP 或主机名(这可以是 /etc/hosts 注入或其他方式),否则从服务器无法与主服务器通信。

如果复制主服务器在运行 Ansible 的位置和 MySQL 副本的运行位置具有不同的 IP 地址,则您可以可选地指定 mysql_replication_master_inventory_host 来访问该机器(例如,您在本地机器上运行 Ansible,但 MySQL 主服务器和副本需要在不同的网络上进行通信)。

mysql_hide_passwords: false

在执行过程中,是否需要隐藏包含密码的任务输出?

在 CentOS 7 上安装更新版本的 MySQL

如果您希望从官方仓库安装 MySQL,而不是安装系统默认的 MariaDB 替代品,可以在您的剧本中添加如下 pre_tasks 任务:

  pre_tasks:
    - name: 安装 MySQL 仓库
      yum:
        name: http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
        state: present
      when: ansible_os_family == "RedHat"

    - name:  MySQL 重写变量(RedHat)
      set_fact:
        mysql_daemon: mysqld
        mysql_packages: ['mysql-server']
        mysql_log_error: /var/log/mysqld.err
        mysql_syslog_tag: mysqld
        mysql_pid_file: /var/run/mysqld/mysqld.pid
        mysql_socket: /var/lib/mysql/mysql.sock
      when: ansible_os_family == "RedHat"

MariaDB 使用

此角色适用于 MySQL 或兼容版本的 MariaDB。在 RHEL/CentOS 7+ 中,MariaDB 数据库引擎被替换为默认的 MySQL 替代包。所有变量仍然参考 'mysql' 而不是 mariadb,因此无需任何修改。

Ubuntu 14.04 和 16.04 MariaDB 配置

在 Ubuntu 上,包名称不同,因此需要更改 mysql_package 变量。至少设置以下变量:

mysql_packages:
  - mariadb-client
  - mariadb-server
  - python-mysqldb

依赖项

如果您已安装 ansible(例如 pip3 install ansible),则无依赖项。

如果您仅安装了 ansible-core,请确保在 collections/requirements.yml 中要求 community.mysql,或手动使用 ansible-galaxy collection install community.mysql 安装。

示例剧本

- hosts: db-servers
  become: yes
  vars_files:
    - vars/main.yml
  roles:
    - { role: geerlingguy.mysql }

vars/main.yml

mysql_root_password: super-secure-password
mysql_databases:
  - name: example_db
    encoding: latin1
    collation: latin1_general_ci
mysql_users:
  - name: example_user
    host: "%"
    password: similarly-secure-password
    priv: "example_db.*:ALL"

许可证

MIT / BSD

作者信息

此角色由 Jeff Geerling 创建于 2014 年。他是 Ansible for DevOps 的作者。

关于项目

MySQL server for RHEL/CentOS and Debian/Ubuntu.

安装
ansible-galaxy install geerlingguy.mysql
许可证
mit
下载
4.5M
拥有者
Father, author, developer, maker. Sometimes called "an inflammatory enigma". #stl #drupal #ansible #k8s #raspberrypi #crohns