ansibleguy.infra_mariadb

Logo de 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.

Cómprame un café

Estado de prueba de Molecule Estado de prueba de YamlLint Estado de prueba de PyLint Estado de prueba de Ansible-Lint Ansible Galaxy

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'                                          |
> +------------------------------------------------------------------------------------------------+
Acerca del proyecto

Role to deploy one or multiple MariaDB instances on a linux server

Instalar
ansible-galaxy install ansibleguy.infra_mariadb
Licencia
other
Descargas
5k
Propietario
[email protected] | GPG: https://badges.ansibleguy.net/public.gpg