claranet.mariadb

Rol de Ansible - mariadb

Mantenedor Licencia Lanzamiento Estado Versión de Ansible Ansible Galaxy

:star: ¡Danos una estrella en GitHub — nos motiva mucho!

Instala y configura el servidor MariaDB en sistemas Debian y RedHat.

:warning: Requisitos

Ansible >= 2.10

:arrows_counterclockwise: Dependencias

- community.mysql.mysql_db
- community.mysql.mysql_user
- community.mysql.mysql_replication

:zap: Instalación

ansible-galaxy install claranet.mariadb

Versión de MariaDB a instalar


por defecto es 10.11

mariadb_version: '10.11'

Características y etiquetas disponibles


Este rol soporta las siguientes características y etiquetas en el siguiente orden durante la ejecución:

Característica Etiqueta
Instalación install
Cifrado en reposo encryption
Configuración configure
Instalación segura secure-installation
Gestión de usuarios users
Replicación replication
Gestión de bases de datos databases
Respaldo backup

Uso de proxies


Este rol soporta el uso de proxies.

Las variables mariadb_http_general_proxy y mariadb_https_general_proxy pueden usarse para especificar un proxy para el acceso general a Internet (como la descarga de archivos).

Las variables mariadb_http_pkg_proxy y mariadb_https_pkg_proxy pueden usarse para especificar un proxy para la interacción del gestor de paquetes (como la descarga de paquetes o la actualización de la caché).

Nota: Estas variables se traducen en las variables de entorno http_proxy y https_proxy que se pasan a las tareas correspondientes.

Crear/Eliminar usuarios de bases de datos


Este valor controla en qué host los usuarios sin claves de host ni hosts están especificados. por defecto es localhost

mariadb_users_default_host: localhost

¡Se requieren contraseñas!

mariadb_users_default_host: localhost
mariadb_users:
  - name: 'user1' # ninguna clave de host o hosts especificada, así que user1 será creado con el valor de la variable mariadb_users_default_host
    password: '*******'
    priv: '*.*:USAGE'
    home: /home/example  # Supone que este directorio ya existe en el servidor remoto
    copy_cnf: true
    state: present

  - name: 'user1' # se especificó la clave de host, así que user2 se creará con el valor especificado
    password: '*******'
    priv: '*.*:USAGE'
    host: 127.0.0.1

  - name: 'user3' # se especificaron claves de hosts, así que user3 se creará con todos los valores
    state: absent
    hosts:
      - ::1
      - 127.0.0.1
      - localhost:
      - 10.10.10.3
      
  - name: 'old'
    state: absent
    host: localhost

Al manejar la replicación, el rol solo configura usuarios en el servidor principal y se espera que la replicación lleve la configuración de los usuarios a los nodos replicados.

Establecer privilegios de usuario en bases de datos y tablas


Define los privilegios de usuario según el siguiente formato:

db.table:priv1,priv2

Solución idempotente para múltiples privilegios (@ver http://stackoverflow.com/a/22959760)

mariadb_privileges:
  - db1.*:ALL,GRANT
  - db2.*:USAGE
  
mariadb_users:  
  - name: 'user1'
    password: 'travis'
    priv: "{{ mariadb_privileges|join('/') }}"

Crear/Eliminar bases de datos


Todas las bases de datos deben definirse en mariadb_databases:

mariadb_databases:
  - name: 'testdb'
    collation: utf8_general_ci
    encoding: utf8
    state: present

  - name: 'olddb'
    state: absent

Excluir bases de datos de la replicación

Al gestionar la replicación, se recomienda excluir selectivamente bases de datos de la replicación configurando replicate: false para la entrada correspondiente en mariadb_databases.

Restringir la replicación a ciertas bases de datos

Puedes hacerlo configurando replicate: true en las entradas correspondientes, pero esto significa que la replicación se centrará únicamente en los cambios en esas bases de datos específicas. Por lo tanto, ciertas características esenciales como la replicación de usuarios (mysql.user) pueden no funcionar.

Replicación Master/Slave


Ejemplo de configuración para master:

---
- hosts: mariadb01
  become: true
  become_method: sudo
  vars:
    mariadb_server_id: 1
    mariadb_replication_role: 'primary'
    mariadb_replication_username: 'replicationuser'
    mariadb_replication_password: 'myPassword'
    mariadb_admin_user: "admin"
    mariadb_admin_password:  "myAdminPassword"
  roles:
    - role: claranet.mariadb
      tags: ["install,secure-installation,configure,replication"]

Ejemplo de configuración para slave:

---
- hosts: mariadb02
  become: true
  become_method: sudo
  vars:
    mariadb_server_id: 2
    mariadb_replication_role: 'replica'
    mariadb_replication_primary: 'mariadb01' # un nombre que el esclavo puede usar para conectarse al servidor maestro
    mariadb_replication_username: 'replicationuser'
    mariadb_replication_password: 'myPassword'
    mariadb_admin_user: "admin"
    mariadb_admin_password:  "myAdminPassword"
  roles:
    - role: claranet.mariadb
      tags: ["install,secure-installation,configure,replication"]

Notas

Si por alguna razón el nombre de host utilizado por el nodo controlador de ansible para comunicarse con el nodo maestro de replicación es diferente del valor proporcionado en mariadb_replication_primary, puedes establecer la variable mariadb_replication_primary_inventory_host a ese valor.

Cifrado en reposo

Habilitar Cifrado de Datos en Reposo.
Estas tareas usan Plugin de Cifrado de Gestión de Claves de Archivo para habilitar el cifrado de datos en reposo de MariaDB.

El siguiente ejemplo configurará automáticamente 5 claves de cifrado con una contraseña de cifrado generada aleatoriamente almacenada en un archivo nombrado con la variable mariadb_file_key_management_filekey.

---
- hosts: mariadb02
  become: true
  become_method: sudo
  vars:
    mariadb_data_at_rest_encryption: true
    mariadb_encryption_keygen_auto: true
    mariadb_encryption_keygen_count: 5
    mariadb_innodb_encrypt_tables: 'ON'
    mariadb_innodb_encrypt_temporary_tables: 'ON'
    mariadb_innodb_encrypt_log: 'ON'
    mariadb_encrypt_binlog: 'ON'
    mariadb_aria_encrypt_tables: 'ON'
    mariadb_encrypt_tmp_disk_tables: 1
    mariadb_encrypt_tmp_files: 1
    mariadb_admin_password: root
  roles:
    - role: claranet.mariadb
      tags: ["install,secure-installation,configure,encryption"]

En el siguiente ejemplo, las claves se llenan directamente en el libro de jugadas, pero también se puede usar Ansible Vault para recuperar las claves de cifrado siempre que cada clave resultante quepa en una sola línea; todo debería estar bien.

---
- hosts: mariadb02
  become: true
  become_method: sudo
  vars:
    mariadb_data_at_rest_encryption: true
    mariadb_encryption_keygen_auto: false
    mariadb_innodb_encrypt_tables: 'ON'
    mariadb_innodb_encrypt_temporary_tables: 'ON'
    mariadb_innodb_encrypt_log: 'ON'
    mariadb_encrypt_binlog: 'ON'
    mariadb_aria_encrypt_tables: 'ON'
    mariadb_encrypt_tmp_disk_tables: 1
    mariadb_encrypt_tmp_files: 1
    mariadb_encryption_keys:
      1: "b326176e96aef8fa324c130835b1496031cf7838f4a17c70046997996103f651"
      2: "3c32960d4194cb2b4850144880d209e500b85bd73d7935ad9734cad6dc7a8948"
      3: "6f8642ee71fca20f3ffc9819f64e2424786ede63eb9bea4b56f4db1473d150ad"
    mariadb_encryption_password: "913b847d83a8049a09f53b89bdde1465086c8b4c970a09cb91d75b2db1384e42ccc872ae996bf7cbe8f8f9ecea74795607471591565c1215a064c5c2e7fa698a9f80df668a3436587dfa8edc7a74254eee37a131de31fd0279ff5cd945655b7662d1523673c37d19546c27c83776ad3c87416a472e4c1c79fffa0c2dce462af1"
    mariadb_innodb_default_encryption_key_id: 10
    mariadb_admin_password: root
  roles:
    - role: claranet.mariadb
      tags: ["install,secure-installation,configure,encryption"]

Notas :

  • El cifrado de datos en reposo de MariaDB necesita "mariadb_overwrite_global_mycnf: true", que es el valor por defecto.
  • El cifrado de datos en reposo de MariaDB debe configurarse antes de cifrar cualquier tabla.
  • El cifrado de datos en reposo de MariaDB es una opción de tabla establecida al momento de su creación.
  • El cifrado de datos en reposo de MariaDB es compatible con la replicación.

Si deseas crear manualmente las claves de cifrado y la contraseña utilizada para cifrado, puedes ejecutar los siguientes comandos:

$ openssl rand -hex 32  # para cada clave de cifrado
$ openssl rand -hex 128 # para la contraseña de cifrado

Instalación personalizada avanzada


Hay una variable mariadb_repo_template_path que contiene la ruta a un archivo de plantilla utilizado para generar el archivo de repositorio en el servidor. El archivo de repositorio generado contiene los espejos, la versión de MariaDB y dicta la instalación.

Por lo tanto, si esta variable se sobrescribe mariadb_repo_template_path: path/relative/to/playbook/custom_repofile con un archivo personalizado, tendrás completo control sobre qué versión y desde dónde se instalará MariaDB.

Ubicación de configuración principal y extra

Por defecto, este rol genera el archivo de configuración de MySQL y lo guarda en un archivo llamado 99-ansible-role-mariadb-my.cnf. Este archivo se coloca dentro de uno de los directorios de configuración extra incluidos en el archivo my.cnf por defecto. La ruta específica de este archivo de configuración está determinada por la variable mariadb_config_file.

Recomendamos mantener el valor por defecto para mariadb_config_file, ya que asegura que la configuración de este rol persista durante las actualizaciones del sistema, que pueden restablecer el valor por defecto de my.cnf. Usar un archivo diferente para la configuración asegura que los cambios realizados por este rol se preservarán a través de las actualizaciones.

En sistemas Debian, el archivo de configuración principal (valor de mariadb_config_file) se guarda en /etc/mysql/mariadb.conf.d/99-ansible-role-mariadb-my.cnf, mientras que en sistemas RedHat se encuentra en /etc/my.cnf.d/99-ansible-role-mariadb-my.cnf.

Si cambias el valor de mariadb_config_file a la ruta por defecto de my.cnf, los directorios de configuración extra por defecto no se incluirán. Puedes cambiar esa configuración estableciendo la variable mariadb_config_include_default_dirs a true. Ten mucho cuidado al hacer esto, ya que algunos archivos cnf pueden ya estar presentes en esos directorios por defecto y incluirlos podría alterar la configuración final de formas impredecibles.

Si deseas agregar alguna configuración personalizada, puedes hacerlo estableciendo la variable mariadb_config_include_dir a un directorio que contendrá todos tus archivos de configuración extra. Completa la variable mariadb_config_include_files con los archivos de configuración reales según la documentación. Asegúrate de que tus archivos de configuración extra tengan la mayor prioridad para evitar que sean sobrescritos, especialmente cuando el directorio elegido no esté vacío.

:pencil2: Ejemplo completo de playbook

---
- hosts: all
  roles:
    - role: claranet.mariadb
      tags: [always,install,encryption,configure,secure-installation,replication,databases,users,backup]
      vars:
        mariadb_debug: true
        mariadb_version: "10.11"
        mariadb_admin_password: root

        mariadb_replication_role: master
        mariadb_replication_username: replic
        mariadb_replication_password: replic
        # Direcciones IP de los dos réplicas que se conectarán a este servidor principal
        # Si deseas usar nombres DNS para los hosts, recuerda establecer mariadb_skip_name_resolve a false
        mariadb_replication_hosts: ["172.17.0.1", "172.17.0.2", "localhost"]

        mariadb_databases:
          - name: db1
          - name: db2
            replicate: true
          - name: db3 # Solo db3 no se replicará
            replicate: false
            encoding: utf8
            collation: utf8_general_ci
            state: present

        mariadb_users_default_host: localhost
        mariadb_users:
          - name: user1
            password: strong password1
          - name: user2
            password: strong password2
            hosts:
              - ::1
              - 127.0.0.1
              - 172.17.0.1
          - name: user3
            password: strong password3
            host: '%'

        mariadb_data_at_rest_encryption: true
        mariadb_encryption_keygen_auto: false
        mariadb_innodb_encrypt_tables: 'ON'
        mariadb_innodb_encrypt_temporary_tables: 'ON'
        mariadb_innodb_encrypt_log: 'ON'
        mariadb_encrypt_binlog: 'ON'
        mariadb_aria_encrypt_tables: 'ON'
        mariadb_encrypt_tmp_disk_tables: 1
        mariadb_encrypt_tmp_files: 1
        mariadb_encryption_keys:
          1: "b326176e96aef8fa324c130835b1496031cf7838f4a17c70046997996103f651"
          2: "3c32960d4194cb2b4850144880d209e500b85bd73d7935ad9734cad6dc7a8948"
          3: "6f8642ee71fca20f3ffc9819f64e2424786ede63eb9bea4b56f4db1473d150ad"
        mariadb_encryption_password: "913b847d83a8049a09f53b89bdde1465086c8b4c970a09cb91d75b2db1384e42ccc872ae996bf7cbe8f8f9ecea74795607471591565c1215a064c5c2e7fa698a9f80df668a3436587dfa8edc7a74254eee37a131de31fd0279ff5cd945655b7662d1523673c37d19546c27c83776ad3c87416a472e4c1c79fffa0c2dce462af1"
        mariadb_innodb_default_encryption_key_id: 10

        mariadb_backup_mail_addr: [email protected]
        mariadb_backup_keep_count: 3
        mariadb_backup_schedule:
          hour: 3
          minute: 0

        mariadb_systemd_override_dir: /etc/systemd/system/mariadb.service.d
        mariadb_systemd_override:
          - filename: 10-limitcore.conf
            section: Service
            options:
              LimitNOFILE: 100000
              LimitMEMLOCK: 100000

Versiones de Linux/MariaDB soportadas

Linux/MariaDB 10.3 10.4 10.5 10.6 10.11
Debian 10
Debian 11 No No
Debian 12 No No No No
Ubuntu 20.04,18.04
Ubuntu 22.04 No No No
CentOS 8
Fedora 37 No No No

:gear: Variables del rol

Nombre de la variable Valor por defecto Notas
mariadb_version "10.11"
mariadb_debug false Controla si se deben mostrar o no las informaciones de depuración. Activar esto puede mostrar credenciales de mariadb
mariadb_mirror_base_url null La url base utilizada junto con el tipo de distribución, versión de mariadb durante la generación del archivo de configuración del repositorio. Dependiente del SO
mariadb_repo_template_path null Archivo de plantilla del repositorio que se utiliza en el servidor antes de instalar. Dependiente del SO. Este archivo controla completamente qué versión de mariadb se instala. Por tanto, sobrescribir este archivo de plantilla con uno personalizado eludirá las variables mariadb_version y mariadb_mirror_base_url
mariadb_manage_pip_dependencies true Determina si se deben ejecutar tareas relacionadas con pip (puede ser útil para los usuarios que quieren instalar bibliotecas de driver mysql por otros medios)
mariadb_packages_extra [] Paquetes adicionales para instalar junto con mariadb
mariadb_http_general_proxy null Proxy HTTP a usar para el acceso general a Internet en el servidor MariaDB
mariadb_https_general_proxy null Proxy HTTPS a usar para el acceso general a Internet en el servidor MariaDB
mariadb_http_pkg_proxy null Proxy HTTP a usar para la interacción del gestor de paquetes (como la descarga de paquetes, actualización de caché, etc.) en el servidor MariaDB
mariadb_https_pkg_proxy null Proxy HTTPS a usar para la interacción del gestor de paquetes (como la descarga de paquetes, actualización de caché, etc.) en el servidor MariaDB
mariadb_admin_home '/root' El directorio de inicio en Linux del usuario administrador de mariadb
mariadb_admin_user 'root' Nombre del usuario administrador dentro del sistema de gestión de bases de datos mariadb
mariadb_admin_password '' Contraseña del usuario administrador de mariadb
mariadb_admin_force_password_update true ¿Actualizar la contraseña del administrador?
mariadb_overwrite_global_mycnf true Sobrescribe el archivo de configuración principal my.cnf de MariaDB en cada ejecución de ansible
mariadb_config_include_dir null Ruta del directorio para configuración adicional de mariadb en tu sistema. Dependiente del OS, por defecto en sistemas Debian es /etc/mysql/mariadb.conf.d y en RedHat es /etc/my.cnf.d
mariadb_config_include_files [] Lista de archivos de configuración adicionales para copiar al servidor. Cada elemento tiene el formato { src: path/relative/to/playbook/file.cnf, force: true }
mariadb_config_include_default_dirs false Controla si se deben incluir o no los directorios de configuración extra por defecto en el mariadb_config_file que apunta a la ruta por defecto de my.cnf
mariadb_enabled_on_startup true ¿Habilitar el servicio mariadb al inicio?
mariadb_users_default_host localhost El host predeterminado asignado a nuevos usuarios si no se define ningún host
mariadb_users [] Lista utilizada para gestionar usuarios en el servidor mariadb
mariadb_databases [] Lista utilizada para gestionar bases de datos en el servidor mariadb
mariadb_error_log_enabled true
mariadb_slow_query_log_enabled true
mariadb_replication_role '' primary/replica master/slave
mariadb_replication_primary '' Nombre del maestro utilizado para configurar los servidores réplicas
mariadb_replication_primary_inventory_host "{{ mariadb_replication_primary }}" Un nombre que el controlador ansible puede usar para conectarse al servidor maestro
mariadb_replication_primary_socket "{{ _mariadb_socket }}" El socket del servicio mariadb en el servidor primario
mariadb_replication_username 'replic' Nombre de usuario del usuario de replicación que se creará en el servidor primario
mariadb_replication_password '' Contraseña del usuario de replicación
mariadb_replication_priv '.:REPLICATION SLAVE' Privilegios del usuario de replicación
mariadb_replication_hosts ['%'] Lista de hosts con los que crear el usuario de replicación. Esto puede ser usado para restringir el acceso del usuario a sólo las direcciones de los servidores réplicas
mariadb_data_at_rest_encryption false
mariadb_encryption_keygen_auto true Cuando es verdadero, las claves de cifrado de mariadb_encryption_keys y mariadb_encryption_password se generan automáticamente
mariadb_encryption_keygen_count 3 El número de claves de cifrado a generar si mariadb_encryption_keygen_auto es verdadero
mariadb_encryption_keys "" Versión diccionaria de las claves de cifrado
mariadb_encryption_password '' Contraseña utilizada para cifrar las claves de cifrado
mariadb_key_management_plugin file_key_management Esta variable se traduce a un valor plugin_load_add= en el archivo de configuración my.cnf para cargar el plugin de cifrado
mariadb_file_key_management_override false Controla si se deben sobrescribir las claves y contraseñas cifradas o solo crear si los correspondientes dos archivos no existen aún
mariadb_file_key_management_dir /etc/mysql/encryption Directorio que contiene archivos relacionados con el cifrado
mariadb_systemd_override_dir /etc/systemd/system/mariadb.service.d Variables de anulación del servicio Mariadb
mariadb_systemd_override Las opciones por entrada se traducen a un archivo con el nombre correspondiente en la carpeta mariadb_systemd_override_dir en formato ini y bajo una sección con el nombre dado. Consulta ejemplos en este readme para el formato esperado
mariadb_backup true Si se deben ejecutar tareas de respaldo (no se eliminará el respaldo si ya está planificado)
mariadb_backup_root_dir /backups Directorio raíz que contiene los respaldos
mariadb_backup_dbnames "all" Bases de datos a respaldar o "all" para respaldar todas las bases de datos
mariadb_backup_dbexclude "information_schema performance_schema" Bases de datos que no se respaldarán. Puedes añadir más bases de datos aquí. Ten cuidado de no eliminar las originales en la lista, de lo contrario podría ocurrir errores durante la ejecución del respaldo
mariadb_backup_cron_job_name Gestión de respaldos de MariaDB El nombre del trabajo cron creado para ejecutar el trabajo de respaldo de forma recurrente
mariadb_backup_schedule {minute: 0, hour: 0}
mariadb_backup_keep_count 8 Edad máxima en días que se mantienen los respaldos antes de ser eliminados
mariadb_backup_mail_addr admin@email.com Una dirección de correo electrónico que será notificada después de cada ejecución de respaldo

Invítame a un café en ko-fi.com

Variables de configuración de MySQL

Las siguientes variables están definidas y corresponden a sus respectivas variables de configuración de mysql utilizadas en el archivo my.cnf sin el prefijo mariadb_ .

Nombre de la variable Valor por defecto Notas
mariadb_port "3306"
mariadb_bind_address '0.0.0.0'
mariadb_datadir "/var/lib/mysql"
mariadb_pid_file null El valor por defecto depende del SO. en debian es= '/var/run/mysqld/mysqld.pid', en redhat es '/var/lib/mysql/mariadb.pid'
mariadb_socket null El valor por defecto depende del SO. en debian es= '/var/run/mysqld/mysqld.sock', en redhat es '/var/lib/mysql/mysql.sock'
mariadb_key_buffer_size "256M"
mariadb_max_allowed_packet "128M"
mariadb_table_open_cache "256"
mariadb_sort_buffer_size "1M"
mariadb_read_buffer_size "1M"
mariadb_read_rnd_buffer_size "4M"
mariadb_myisam_sort_buffer_size "64M"
mariadb_table_cache 2000
mariadb_thread_cache_size "8"
mariadb_query_cache_size "16M"
mariadb_max_connections 151
mariadb_tmp_table_size '64M'
mariadb_max_heap_table_size '64M'
mariadb_join_buffer_size '3M'
mariadb_innodb_file_per_table "1"
mariadb_innodb_buffer_pool_size "256M"
mariadb_innodb_log_file_size "64M"
mariadb_innodb_log_buffer_size "8M"
mariadb_innodb_flush_log_at_trx_commit "2"
mariadb_innodb_lock_wait_timeout 600
mariadb_innodb_additional_mem_pool_size "8M"
mariadb_mysqldump_max_allowed_packet "64M" Corresponde al atributo max_allowed_packet bajo la sección mysqldump en el archivo de configuración
mariadb_log ""
mariadb_log_error "/var/log/mariadb/mysql.err"
mariadb_syslog_tag null El valor por defecto depende del SO. en debian es= 'mysql', en redhat es 'mariadb'
mariadb_slow_query_log_file "/var/log/mariadb/mysql-slow.log"
mariadb_slow_query_time 2
mariadb_server_id "1"
mariadb_max_binlog_size "100M"
mariadb_expire_logs_days "10"
mariadb_innodb_encrypt_tables 'OFF'
mariadb_innodb_encrypt_temporary_tables 'OFF'
mariadb_innodb_encrypt_log 'OFF'
mariadb_innodb_encryption_threads 4
mariadb_innodb_encryption_rotate_key_age 0
mariadb_innodb_default_encryption_key_id 1
mariadb_encrypt_tmp_disk_tables 0
mariadb_encrypt_tmp_files 0
mariadb_encrypt_binlog 'OFF'
mariadb_aria_encrypt_tables 'OFF'
mariadb_file_key_management_filekey password_file Esta variable, al ser traducida dentro del archivo de configuración, se le antepone {{ mariadb_file_key_management_dir }}/
mariadb_file_key_management_filename keys.enc Esta variable, al ser traducida dentro del archivo de configuración, se le antepone {{ mariadb_file_key_management_dir }}/
mariadb_file_key_management_encryption_algorithm 'AES_CBC'
mariadb_wait_timeout 1800
mariadb_net_read_timeout 120
mariadb_skip_name_resolve true
mariadb_back_log 100
mariadb_max_connect_errors 10000
mariadb_open_files_limit 20000
mariadb_interactive_timeout 3600
mariadb_connect_timeout 120

:closed_lock_with_key: Endurecimiento

:heart_eyes_cat: Contribuyendo

Consulta la Contribuyendo si estás buscando una guía sobre cómo configurar un entorno para poder probar este rol como desarrollador.

Mozilla Public License Version 2.0

Información del autor

Hecho con orgullo por el equipo de Claranet e inspirado por:

Acerca del proyecto

Install and configure MariaDB server

Instalar
ansible-galaxy install claranet.mariadb
Licencia
mpl-2.0
Descargas
5.8k
Propietario
Open source projects from and contributed to by Claranet.