geerlingguy.mysql
Ansible 角色:MySQL
在 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_name
和 mysql_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 数据库。一个数据库包含值 name
、encoding
(默认为 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_id
和 mysql_replication_role
(例如,主服务器的 ID 为 1
,mysql_replication_role
为 master
,从服务器的 ID 为 2
,mysql_replication_role
为 slave
)。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 的作者。
ansible-galaxy install geerlingguy.mysql