ansibleguy.infra_mariadb
Rol de Ansible - Base de datos MariaDB - Múltiples instancias
Rol de Ansible para desplegar una o varias instancias de MariaDB en un servidor Linux.
Registros de Molecule: Corto, Completo
Probado en:
- Debian 11
Instalación
# última versión
ansible-galaxy role install git+https://github.com/ansibleguy/infra_mariadb
# desde galaxy
ansible-galaxy install ansibleguy.infra_mariadb
# o a una ruta de roles personalizada
ansible-galaxy install ansibleguy.infra_mariadb --roles-path ./roles
# instalar dependencias
ansible-galaxy install -r requirements.yml
Uso
¿Quieres una interfaz gráfica sencilla para Ansible? Consulta mi Ansible WebUI
Configuración
Necesitas definir tus instancias configurando el diccionario 'mariadb'!
mariadb:
service:
SyslogIdentifier: 'mariadb_ag_%I' # %I = Instance-Key
instances:
api:
root_pwd: !vault |
$ANSIBLE_VAULT;1.1;AES256
64373031333937633163366236663237623464336461613334343739323763373330393930666331
3333663262346337636536383539303834373733326631310a393865653831663238383937626238
35396531316338373030353530663465343838373635363633613035356338353366373231343264
3437356663383466630a666161363163346533333139656566386466383733646134616166376638
35313765356134396130333439663461353336313230366338646165376666313232
dbs:
api:
encoding: 'utf8mb4'
templates:
deprecated:
state: 'absent'
users:
app:
priv: 'api.*:ALL'
pwd: !vault ...
guy:
priv: 'api.*:SELECT,SHOW VIEW'
state: 'absent'
pwd: !vault ...
settings:
# port: 3306
innodb_log_file_size: 5G
max_connections: 2000
backup:
enabled: true
dbs: ['api']
time: '*-*-* 01:00'
# para el formato de fecha y hora consulta:
# https://wiki.archlinux.org/title/Systemd/Timers
# https://silentlad.com/systemd-timers-oncalendar-(cron)-format-explained
creds:
create: true
test:
ansible_user: 'not_root'
ansible_pwd: !vault ...
dbs:
test:
users:
dummy:
priv: 'test.*:ALL'
pwd: !vault ...
update_pwd: 'always' # de lo contrario, solo se establecerá al crear; cambiar la contraseña siempre podría traer problemas con replicaciones activa-activa
settings:
port: 3307
log_warnings: 4
long_query_time: 2
max_allowed_packet: 2G
old_instance:
state: 'absent'
Es posible que desees usar 'ansible-vault' para cifrar tus contraseñas:
ansible-vault encrypt_string
Ejecución
Ejecuta el playbook:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml --ask-vault-pass
También hay algunas etiquetas útiles disponibles:
- base => solo configura lo básico; no se tocarán las instancias
- instances
- config => configuración (base e instancias)
- dbs
- backup => trabajos de respaldo de instancias
- users
Para depurar errores, puedes establecer la variable 'debug' en tiempo de ejecución:
ansible-playbook -K -D -i inventory/hosts.yml playbook.yml -e debug=yes
Funcionalidad
Instalación de paquetes
- Dependencias de Ansible (mínimas)
- MariaDB
Configuración
Múltiples instancias de MariaDB
Creación/eliminación de bases de datos y usuarios
Script de verificación de inicio que soporta múltiples instancias
Opt-in por defecto:
- Ejecutando tareas de instalación segura
- Amortiguación reducida
- Límite de archivos abiertos aumentado (sysctl, servicio, db)
Opt-out por defecto:
- Trabajo de respaldo de base de datos
Configuración por defecto:
- datadir de la instancia: "/var/lib/mysql/instance_${KEY}/"
- configuración de la instancia: "/etc/mysql/instance.conf.d/server_${KEY}.cnf"
- reinicio del servicio en caso de fallo
- Registro en syslog
- Vincular solo a localhost
- SSL DESACTIVADO
- Registros de consulta lenta
- Archivo InnoDB por tabla
- Desactivadas las búsquedas DNS de DB
- para más información, consulta el ejemplo a continuación
Información
ADVERTENCIA: Este rol espera que la instancia predeterminada de mariadb/mysql (mysql.service/mariadb.service) en el sistema objetivo no esté y no se utilizará!
¡Su socket y puerto se cambian al ejecutar este rol!ADVERTENCIA: Si estás ejecutando tus servidores de base de datos en una configuración activa-activa, NUNCA debes ejecutar el rol en ambos nodos al mismo tiempo!
¡De lo contrario, las tareas de creación de usuarios/base de datos podrían romper tu sincronización!Nota: este rol actualmente solo soporta sistemas basados en Debian
Nota: La mayoría de la funcionalidad del rol se puede optar por incluir o excluir.
Para todas las opciones disponibles, consulta la configuración predeterminada ubicada en el archivo de configuraciones principales!
Nota: Usamos los módulos de comunidad oficiales para la configuración de base de datos y usuario. Soporte de replicación podría añadirse más adelante.
Nota: La gestión de certificados podría añadirse más adelante a este rol.
Por ahora, necesitas proporcionar los certificados manualmente (colocados en /etc/mysql/ssl/{INSTANCE_KEY}/[ca|cert|key].pem)Nota: Necesitas proporcionar los privilegios de mysql-user EXACTAMENTE como lo retorna una declaración SHOW GRANT!
Consejo: Si estás montando el datadir explícitamente, debes establecer algunas opciones de montaje para optimizar el rendimiento:
- noatime,nodiratime
Advertencia: Las conexiones a través de TCP/IP a localhost/127.0.0.1 no funcionarán por defecto cuando 'skip-name-resolve' esté habilitado!
Lanzará este error:
Host '127.0.0.1' is not allowed to connect to this MariaDB server
Ejemplo
Configuración
mariadb:
instances:
guydb:
root_pwd: !vault ...
dbs:
nice:
memes:
users:
django:
priv: 'backup.creds.defaults_file is not nonmemes.*:ALL'
pwd: !vault ...
backup:
priv: '*.*:SELECT,RELOAD,PROCESS,LOCK TABLES,BINLOG MONITOR,SHOW VIEW,EVENT,TRIGGER'
pwd: !vault ...
Resultado:
# directorios de configuración
guy@ansible:~# tree /etc/mysql
> /etc/mysql/
> ├── conf.d
> │ ├── mysql.cnf
> │ └── mysqldump.cnf
> ├── debian.cnf
> ├── debian-start # script de inicio de la instancia predeterminada
> ├── debian-start-instance.sh # script de inicio de múltiples instancias
> ├── instance.conf.d # configuraciones de instancia
> │ ├── client_guydb_startup-checks.cnf # datos de inicio de sesión para el usuario del servicio de verificación de inicio
> │ └── server_guydb.cnf # configuración del servidor de instancia
> ├── mariadb.cnf # configuración de la instancia predeterminada
> ├── mariadb.conf.d
> ├── my.cnf -> /etc/alternatives/my.cnf
> └── my.cnf.fallback
# directorios de datos
guy@ansible:~# tree /var/lib/mysql
> /var/lib/mysql/
> ├── default
> │ └── ... # instancia predeterminada de mysql
> │
> ├── instance_guydb
> │ └── ... # instancia configurada
> │
> └── ... # archivos predeterminados => no se limpian automáticamente
# archivo de configuración de la instancia
guy@ansible:~# cat /etc/mysql/instance.conf.d/server_guydb.cnf
> # Administrado por Ansible
> [mysqld]
> datadir = /var/lib/mysql/instance_guydb
> basedir = /usr
> pid-file = /run/mysqld/mysqld_guydb.pid
> socket = /run/mysqld/mysqld_guydb.sock
> lc_messages_dir = /usr/share/mysql
>
> # configuraciones
> user = mysql
> group = mysql
> bind_address = 127.0.0.1
> port = 3306
> log_warnings = 2
> character-set-server = utf8mb4
> collation-server = utf8mb4_general_ci
> innodb_file_per_table = 1
> innodb_buffer_pool_size = 512M
> innodb_log_file_size = 1GB
> max_allowed_packet = 512M
> max_connections = 500
> query_cache_size = 64M
> tmp_table_size = 64M
> max_heap_table_size = 64M
> slow-query-log = 1
> slow-query-log-file = slow-queries.log
> long_query_time = 1
> wait_timeout = 60
> symbolic-links = 0
> local-infile = 0
> open_files_limit = 1048576
# configuración del servicio
guy@ansible:~# cat /etc/systemd/system/[email protected]/override.conf
> # Administrado por Ansible
>
> [Unit]
> ConditionPathExists=/etc/mysql/instance.conf.d/server_%I.cnf
> ConditionPathExists=/etc/mysql/debian-start-instance.sh
> ConditionPathExists=/etc/mysql/instance.conf.d/client_%I_startup-checks.cnf
> Documentation=https://github.com/ansibleguy/infra_mariadb
>
> [Service]
> Environment='MYSQLD_MULTI_INSTANCE=--defaults-file=/etc/mysql/instance.conf.d/server_%I.cnf --defaults-group-suffix=.%I'
> ExecStartPost=
> ExecStartPost=/etc/mysql/debian-start-instance.sh %I
>
> LimitNOFILE=1048576
> StandardOutput=journal
> StandardError=journal
> SyslogIdentifier=mariadb_%I
> TimeoutStartSec=900
> TimeoutStopSec=900
> Restart=on-abort
> RestartSec=5s
> OOMScoreAdjust=-600
> BlockIOWeight=1000
# estado del servicio
guy@ansible:~# systemctl status [email protected]
> ● [email protected] - Servidor de base de datos MariaDB 10.5.12 (multi-instancia guydb)
> Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
> Drop-In: /etc/systemd/system/[email protected]
> └─override.conf
> Active: active (running)
> Docs: man:mariadbd(8)
> https://mariadb.com/kb/en/library/systemd/
> https://github.com/ansibleguy/infra_mariadb
> Process: 134872 ExecStartPre=/usr/bin/mysql_install_db $MYSQLD_MULTI_INSTANCE (code=exited, status=0/SUCCESS)
> Process: 134910 ExecStartPost=/etc/mysql/debian-start-instance.sh guydb (code=exited, status=0/SUCCESS)
> Status: "Ahora aceptando tus solicitudes SQL..."
> CGroup: /system.slice/system-mariadb.slice/[email protected]
> └─134898 /usr/sbin/mariadbd --defaults-file=/etc/mysql/instance.conf.d/server_guydb.cnf --defaults-group-suffix=.guydb
# bases de datos
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "show databases;"
> +--------------------+
> | Base de datos |
> +--------------------+
> | nice |
> | memes |
> | information_schema |
> | mysql |
> | performance_schema |
> +--------------------+
# usuarios de mysql
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "select user, host from mysql.user;"
> +------------------------+-----------+
> | Usuario | Host |
> +------------------------+-----------+
> | backup | localhost |
> | django | localhost |
> | mariadb.sys | localhost |
> | mariadb_startup_checks | localhost | # usuario de servicio necesario para el script de inicio (tareas de actualización, etc.)
> | mysql | localhost |
> | root | localhost |
> +------------------------+-----------+
# privilegios de mysql
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "show grants for django@localhost;"
> +---------------------------------------------------------------------------+
> | Privilegios para django@localhost |
> +---------------------------------------------------------------------------+
> | GRANT USAGE ON *.* TO `django`@`localhost` IDENTIFIED BY PASSWORD 'XXXX' |
> | GRANT ALL PRIVILEGES ON `memes`.* TO `django`@`localhost` |
> +---------------------------------------------------------------------------+
guy@ansible:~# mysql --socket=/run/mysql/mysqld_guydb.sock -p -e "show grants for backup@localhost;"
> +------------------------------------------------------------------------------------------------+
> | Privilegios para backup@localhost |
> +------------------------------------------------------------------------------------------------+
> | GRANT SELECT, RELOAD, PROCESS, LOCK TABLES, BINLOG MONITOR, SHOW VIEW, EVENT, TRIGGER ON *.* |
> | TO `backup`@`localhost` IDENTIFIED BY PASSWORD 'XXXX' |
> +------------------------------------------------------------------------------------------------+
Role to deploy one or multiple MariaDB instances on a linux server
ansible-galaxy install ansibleguy.infra_mariadb