ansible-role-mariadb-debian/README.md

251 lines
6.3 KiB
Markdown

# Ansible role: MariaDB
[![pre-commit](https://github.com/fauust/ansible-role-mariadb/actions/workflows/pre-commit.yml/badge.svg)](https://github.com/fauust/ansible-role-mariadb/actions/workflows/pre-commit.yml)
[![molecule](https://github.com/fauust/ansible-role-mariadb/actions/workflows/molecule.yml/badge.svg)](https://github.com/fauust/ansible-role-mariadb/actions/workflows/molecule.yml)
Install and configure MariaDB Server on Debian/Ubuntu.
Optionally, this role also permits one to:
- deploy a master/replica cluster;
- setup backups and rotation of the dumps.
## Requirements
The role uses
[`mysql_user`](https://docs.ansible.com/ansible/latest/modules/mysql_user_module.html)
and
[`mysql_db`](https://docs.ansible.com/ansible/latest/modules/mysql_db_module.html)
ansible modules that depend on [PyMySQL](https://github.com/PyMySQL/PyMySQL) so
Python 2.7 or Python 3.X versions are needed.
For older Python versions, you may use
[MySQLdb](http://mysql-python.sourceforge.net/MySQLdb.html) but then the role
may not be idempotent (not tested).
## Fact gathering (performance)
Unless you want to use the MariaDB official repository (and then need
`ansible_distribution_version`, see [`tasks/setup.yml`](./tasks/setup.yml#L18))
this role does not require fact gathering.
## Role variables
Available variables are listed below, along with default values (see
[`defaults/main.yml`](./defaults/main.yml)).
### MariaDB version
```yaml
mariadb_use_official_repo: false
mariadb_use_official_repo_url: https://deb.mariadb.org
mariadb_use_official_repo_version: 10.5
```
You may deploy the MariaDB Server version that comes with your distribution
(Debian/Ubuntu) or deploy the version packaged by the MariaDB Foundation.
You can use the MariaDB Foundation repository configuration tool:
<https://mariadb.org/download/#mariadb-repositories>
By default, we deploy the MariaDB Server version that comes with the distribution.
### MariaDB service activation and restart
```yaml
mariadb_enabled_on_startup: true
mariadb_can_restart: true
```
**Warning:** you may consider setting `mariadb_can_restart` to `false` on
production systems to prevent ansible runs from restarting the MariaDB Server.
### General configuration
To populate the MariaDB Server configuration file, we use almost only raw
variables. This permits more flexibility and a very simple
[`templates/mariadb.cnf.j2`](./templates/mariadb.cnf.j2) file.
By default, some common and standard options are deployed based on the MariaDB
Foundation package and it should be easy to change them all (see
[`mariadb.cnf`](./mariadb.cnf)).
#### Basic settings
```yaml
mariadb_config_file: /etc/mysql/mariadb.cnf
mariadb_datadir: /var/lib/mysql
mariadb_port: 3306
mariadb_bind_address: 127.0.0.1
mariadb_unix_socket: /run/mysqld/mysqld.sock
```
```yaml
mariadb_basic_settings_raw: |
user = mysql
pid-file = /run/mysqld/mysqld.pid
socket = {{ mariadb_unix_socket }}
basedir = /usr
datadir = {{ mariadb_datadir }}
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
lc_messages = en_US
skip-external-locking
port = {{ mariadb_port }}
bind-address = {{ mariadb_bind_address }}
```
#### Fine tuning
```yaml
mariadb_fine_tuning_raw: |
max_connections = 100
connect_timeout = 5
wait_timeout = 600
max_allowed_packet = 16M
thread_cache_size = 128
sort_buffer_size = 4M
bulk_insert_buffer_size = 16M
tmp_table_size = 32M
max_heap_table_size = 32M
```
#### Query cache
```yaml
mariadb_query_cache_raw: |
query_cache_size = 16M
```
#### Logging
```yaml
mariadb_logging_raw: |
log_error = /var/log/mysql/error.log
```
#### Character sets
```yaml
mariadb_character_sets_raw: |
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
```
#### InnoDB
```yaml
mariadb_innodb_raw: |
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
```
#### Mariadbdump
```yaml
mariadb_mysqldump_raw: |
quick
quote-names
max_allowed_packet = 16M
```
### Database management
```yaml
mariadb_databases: []
# - name: db1
# collation: utf8_general_ci
# encoding: utf8
# replicate: true|false
```
See: <https://docs.ansible.com/ansible/latest/modules/mysql_db_module.html>
### User management
```yaml
mariadb_users: []
# - name: user
# host: 100.64.200.10
# password: password
# priv: "*.*:USAGE/db1.*:ALL"
# state: present|absent
```
See: <https://docs.ansible.com/ansible/latest/modules/mysql_user_module.html>
### Replication (optional)
Replication is only enabled if `mariadb_replication_role` has a value (`master` or
`replica`).
The replication setup on the replica use the GTID autopositioning
`master_use_gtid=slave_pos`. See:
<https://mariadb.com/kb/en/library/change-master-to/#master_use_gtid>
For the moment, we use an `SQL` command but in ansible 2.10, we should be able
to use the
[`mysql_replication`](https://docs.ansible.com/ansible/latest/modules/mysql_replication_module.html)
module (see
[`tasks/replication_replica.yml`](./tasks/replication_replica.yml#L09-L33) and
<https://github.com/ansible/ansible/pull/62648>).
#### Common vars
```yaml
# Same keys as `mariadb_users` above.
# priv is set to "*.*:REPLICATION SLAVE" by default
mariadb_replication_user: []
```
#### Master variables
```yaml
mariadb_replication_role: master
mariadb_server_id: 1
mariadb_max_binlog_size: 100M
mariadb_binlog_format: MIXED
mariadb_expire_logs_days: 10
```
#### Replica variables
```yaml
mariadb_replication_role: replica
mariadb_server_id: 1
mariadb_replication_master_ip: IP
```
### Backups (optional)
```yaml
# db dumps backup
mariadb_backup_db: false
mariadb_backup_db_cron_min: 50
mariadb_backup_db_cron_hour: 00
mariadb_backup_db_dir: /mnt/backup
mariadb_backup_db_rotation: 15
# set to "1>" to get only STDERR on cron
mariadb_backup_cron_std_output: "2>&1 | tee"
# name of the database to dump
# (mandatory if mariadb_backup_db is set to true)
mariadb_backup_db_name: []
# - db1
# - db2
```
Database dumps are done serially and the compression step (`gzip`) is done after to
avoid lengthy locks.
## Example playbook
```yaml
- hosts: db
roles:
- fauust.mariadb
```
## Lincense
GNU General Public License v3.0