pulse-mind.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用户身份运行此角色,可以设置mysql_user_name
和mysql_user_password
以配置一个非root用户。
mysql_root_home: /root
mysql_root_username: root
mysql_root_password: root
MySQL根用户帐户的详细信息。
mysql_root_password_update: false
是否强制更新MySQL根用户的密码。默认情况下,该角色仅在首次配置MySQL时更改根用户的密码。你可以通过将其设置为yes
来强制更新。
注意:如果在剧本运行失败或中断后出现
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
的错误,这通常意味着根密码最初没有更新。尝试删除配置的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 *adm在Debian上*
mysql_log: ""
mysql_log_error: *默认值取决于操作系统*
mysql_syslog_tag: *默认值取决于操作系统*
MySQL日志配置。将mysql_log
(常规查询日志)或mysql_log_error
设置为syslog
将使MySQL使用mysql_syslog_tag
记录到syslog。
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
需要解析为Slave可以访问的IP或主机名(这可以是/etc/hosts
的注入或其他方式),否则从服务器无法与主服务器通信。
如果复制主服务器在你运行ansible的地方和MySQL副本运行的地方有不同的IP地址,你可以选择指定mysql_replication_master_inventory_host
以访问该机器(例如,你在本地计算机上运行ansible,但MySQL主服务器和副本需要在不同的网络上进行通信)。
在CentOS 7上安装更新版本的MySQL
如果你想从官方仓库安装MySQL,而不是安装系统默认的MariaDB等效项,可以在剧本中添加以下pre_tasks
任务:
pre_tasks:
- name: Install the MySQL repo.
yum:
name: http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
state: present
when: ansible_os_family == "RedHat"
- name: Override variables for 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'为引用,但不需要进行修改。
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的作者。