dev-sec.mysql

Rol de Ansible: MySQL

CI

Instala y configura el servidor MySQL o MariaDB en servidores RHEL/CentOS o Debian/Ubuntu.

Requisitos

No se requieren requisitos especiales; debes tener acceso de root, así que ejecuta este rol en un playbook con become: yes, o invoca el rol en tu playbook así:

- hosts: database
  roles:
    - role: geerlingguy.mysql
      become: yes

Variables del Rol

Las variables disponibles están listadas a continuación, junto con sus valores predeterminados (ver defaults/main.yml):

mysql_user_home: /root
mysql_user_name: root
mysql_user_password: root

El directorio home donde se guardarán las configuraciones de MySQL en Python, que Ansible usará al conectarse a MySQL. Este debe ser el directorio home del usuario que ejecuta este rol de Ansible. Puedes establecer mysql_user_name y mysql_user_password si ejecutas este rol bajo una cuenta de usuario no-root y quieres establecer un usuario no-root.

mysql_root_home: /root
mysql_root_username: root
mysql_root_password: root

Detalles de la cuenta de usuario root de MySQL.

mysql_root_password_update: false

Si se debe forzar la actualización de la contraseña del usuario root de MySQL. Por defecto, este rol solo cambiará la contraseña del usuario root cuando MySQL se configure por primera vez. Puedes forzar una actualización al configurarlo a yes.

Nota: Si obtienes un error como ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) después de una ejecución fallida o interrumpida del playbook, esto generalmente significa que la contraseña root no se actualizó originalmente. Intenta eliminar el archivo .my.cnf dentro del mysql_user_home configurado o actualízalo y establece password='' (la contraseña predeterminada no segura). Ejecuta el playbook nuevamente, con mysql_root_password_update configurado a yes, y la configuración debería completarse.

Nota: Si obtienes un error como ERROR 1698 (28000): Access denied for user 'root'@'localhost' (using password: YES) al intentar iniciar sesión desde la CLI, es posible que debas ejecutar como root o sudoer.

mysql_enabled_on_startup: true

Si MySQL debe habilitarse al inicio.

mysql_config_file: *el valor predeterminado depende del SO*
mysql_config_include_dir: *el valor predeterminado depende del SO*

El archivo de configuración principal my.cnf y el directorio de inclusión.

overwrite_global_mycnf: true

Si el my.cnf global debe sobrescribirse cada vez que se ejecute este rol. Configurarlo a no le dice a Ansible que solo cree el archivo my.cnf si no existe. Esto debe dejarse en su valor predeterminado (yes) si deseas usar las variables de este rol para configurar MySQL.

mysql_config_include_files: []

Una lista de archivos que deberían sobrescribir el my.cnf global por defecto. Cada elemento en el array requiere un parámetro "src" que es un camino a un archivo. Un parámetro opcional "force" puede forzar que el archivo se actualice cada vez que ansible se ejecute.

mysql_databases: []

Las bases de datos de MySQL a crear. Cada base de datos tiene los valores name, encoding (predeterminado a utf8), collation (predeterminado a utf8_general_ci) y replicate (predeterminado a 1, solo se usa si la replicación está configurada). Los formatos de estos son los mismos que en el módulo mysql_db.

También puedes eliminar una base de datos (o asegurarte de que no esté en el servidor) estableciendo state a absent (predeterminado a present).

mysql_users: []

Los usuarios de MySQL y sus privilegios. Un usuario tiene los valores:

  • name
  • host (predeterminado a localhost)
  • password (puede ser en texto plano o encriptada—si es encriptada, establecer encrypted: yes)
  • encrypted (predeterminado a no)
  • priv (predeterminado a *.*:USAGE)
  • append_privs (predeterminado a no)
  • state (predeterminado a present)

Los formatos de estos son los mismos que en el módulo mysql_user.

mysql_packages:
  - mysql
  - mysql-server

(Paquetes específicos del SO, los predeterminados de RedHat/CentOS se enumeran aquí) Paquetes a instalar. En algunas situaciones, es posible que debas agregar paquetes adicionales, como mysql-devel.

mysql_enablerepo: ""

(Solo para RedHat/CentOS) Si has habilitado repositorios adicionales (podrías considerar geerlingguy.repo-epel o geerlingguy.repo-remi), esos repositorios se pueden enumerar bajo esta variable (por ejemplo, remi,epel). Esto puede ser útil, como ejemplo, si quieres instalar versiones posteriores de MySQL.

mysql_python_package_debian: python3-mysqldb

(Solo para Ubuntu/Debian) Si necesitas anular explícitamente el paquete Python de MySQL, puedes establecerlo aquí. Establece esto en python-mysqldb si usas distribuciones más antiguas que ejecutan Python 2.

mysql_port: "3306"
mysql_bind_address: '0.0.0.0'
mysql_datadir: /var/lib/mysql
mysql_socket: *el valor predeterminado depende del SO*
mysql_pid_file: *el valor predeterminado depende del SO*

mysql_login_host: ""
mysql_login_user: ""
mysql_login_password: ""
mysql_ca_cert: ""

Configuración de conexión predeterminada de MySQL.

mysql_log_file_group: mysql *adm en Debian*
mysql_log: ""
mysql_log_error: *el valor predeterminado depende del SO*
mysql_syslog_tag: *el valor predeterminado depende del SO*

Configuración de registro de MySQL. Establecer mysql_log (el registro de consultas generales) o mysql_log_error a syslog hará que MySQL registre en syslog usando el mysql_syslog_tag.

mysql_slow_query_log_enabled: false
mysql_slow_query_log_file: *el valor predeterminado depende del SO*
mysql_slow_query_time: 2

Configuraciones del registro de consultas lentas. Ten en cuenta que el archivo de registro será creado por este rol, pero si estás ejecutando en un servidor con SELinux o AppArmor, es posible que debas agregar esta ruta a las rutas permitidas para MySQL, o desactivar el perfil mysql. Por ejemplo, en Debian/Ubuntu, puedes ejecutar 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"
...

El resto de las configuraciones en defaults/main.yml controlan el uso de memoria de MySQL y algunas otras configuraciones comunes. Los valores predeterminados están ajustados para un servidor donde MySQL puede consumir 512 MB de RAM, por lo que deberías considerar ajustarlos para adaptarlos mejor a tu servidor particular.

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: {}

Configuraciones de replicación. Establece mysql_server_id y mysql_replication_role por servidor (por ejemplo, el maestro sería ID 1, con el mysql_replication_role de master, y el esclavo sería ID 2, con el mysql_replication_role de slave). El mysql_replication_user usa las mismas claves que los elementos individuales en mysql_users, y se crea en servidores maestros, y se usa para replicar en todos los esclavos.

mysql_replication_master debe resolverse a una IP o un nombre de host que sea accesible para los esclavos (esto podría ser una inyección de /etc/hosts u otro medio), de lo contrario los esclavos no pueden comunicarse con el maestro.

Si el maestro de replicación tiene diferentes direcciones IP donde estás ejecutando ansible y donde está ejecutándose el mysql replica, puedes opcionalmente especificar un mysql_replication_master_inventory_host para acceder a la máquina (por ejemplo, ejecutas ansible en tu máquina local, pero el maestro de mysql y el replica deben comunicarse en una red diferente)

mysql_hide_passwords: false

¿Necesitas ocultar la salida de las tareas que contienen contraseñas durante la ejecución?

Versiones posteriores de MySQL en CentOS 7

Si deseas instalar MySQL desde el repositorio oficial en lugar de instalar los equivalentes de MariaDB que vienen por defecto, puedes agregar la siguiente tarea pre_tasks en tu playbook:

  pre_tasks:
    - name: Instalar el repositorio de MySQL.
      yum:
        name: http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
        state: present
      when: ansible_os_family == "RedHat"
  
    - name: Sobrescribir variables para 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"

Uso de MariaDB

Este rol funciona tanto con MySQL como con una versión compatible de MariaDB. En RHEL/CentOS 7+, el motor de base de datos mariadb fue sustituido como el paquete de reemplazo predeterminado de MySQL. No se requieren modificaciones, aunque todas las variables aún hacen referencia a 'mysql' en lugar de mariadb.

Configuración de MariaDB en Ubuntu 14.04 y 16.04

En Ubuntu, los nombres de los paquetes son diferentes, por lo que la variable mysql_package debe alterarse. Establece las siguientes variables (como mínimo):

    mysql_packages:
      - mariadb-client
      - mariadb-server
      - python-mysqldb

Dependencias

Si tienes ansible instalado (por ejemplo, pip3 install ansible), no hay ninguna.

Si solo has instalado ansible-core, asegúrate de requerir community.mysql en tu collections/requirements.yml o instálalo manualmente con ansible-galaxy collection install community.mysql.

Ejemplo de Playbook

    - hosts: db-servers
      become: yes
      vars_files:
        - vars/main.yml
      roles:
        - { role: geerlingguy.mysql }

Dentro de 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"

Licencia

MIT / BSD

Información del Autor

Este rol fue creado en 2014 por Jeff Geerling, autor de Ansible for DevOps.

Acerca del proyecto

MySQL server for RHEL/CentOS and Debian/Ubuntu.

Instalar
ansible-galaxy install dev-sec.mysql
Licencia
mit
Descargas
23.5k
Propietario
Security + DevOps: Automatic Server Hardening