timorunge.proxysql

proxysql


Actualmente, este rol no es compatible con ProxySQL >= v2.0.1.

Este rol solo es compatible con Ansible 2.7.9 o superior debido a un error en la migración de MySQLdb a PyMySQL (#40123) en el módulo MySQL utils.

La versión 0.3.0 es compatible con Ansible 2.7.0 o inferior.


Este rol instala y configura ProxySQL - un proxy de alto rendimiento, alta disponibilidad y que maneja protocolos para MySQL.

Desde la versión 2.3.0, Ansible ofrece un módulo para configurar ProxySQL. Este rol de Ansible utiliza esta funcionalidad, pero añade algunas características (esperemos que útiles):

Por favor, también revisa la sección "Problemas conocidos o: Buenas prácticas" en este documento.

Requisitos

Este rol requiere Ansible 2.5.0 o superior.

Puedes usar pip para instalar (y definir) una versión estable:

pip install ansible==2.7.9

Todos los requisitos de plataforma están listados en el archivo de metadatos.

Instalación

ansible-galaxy install timorunge.proxysql

Variables del rol

Las variables que se pueden pasar a este rol. Para todas las variables, consulta defaults/main.yml.

# Habilitar / deshabilitar ProxySQL como un servicio.
# Tipo: Bool
proxysql_service_enabled: True

# Reiniciar ProxySQL si cambian variables estáticas. Para una lista de variables estáticas, revisa `proxysql_non_dynamic_variables` en `vars/main.yml`.
# Tipo: Bool
proxysql_restart_on_static_variables_change: True

# Repositorio

# Si tanto `proxysql_use_official_repo` como `proxysql_use_percona_repo` están configurados en `False`, el módulo descargará automáticamente la versión definida de `proxysql_version` como un paquete de Github e instalará la misma.

# Utilizar el repositorio oficial de ProxySQL.
# Tipo: Bool
proxysql_use_official_repo: True

# Utilizar el repositorio de Percona.
# Tipo: Bool
proxysql_use_percona_repo: False

# Definir la versión del repositorio para el repositorio de Percona.
# Tipo: Str
proxysql_percona_release: latest

# La versión de ProxySQL que se debe instalar si no se utiliza el repositorio de ProxySQL.
# Tipo: Int
proxysql_version: 1.4.15

# Configuración

# La ruta donde ProxySQL debe guardar su base de datos y registros.
# Tipo: Str
proxysql_datadir: /var/lib/proxysql

# Define la plantilla de proxysql.cnf
# Tipo: Str
proxysql_proxysql_cnf_template: proxysql.cnf.j2

# Define la plantilla de proxysql-admin.cnf
# Tipo: Str
proxysql_proxysql_admin_cnf_template: proxysql-admin.cnf.j2

# Las variables de inicio de sesión para la configuración de ProxySQL. Se utilizan solo dentro del archivo `main.yml` y aquí para simplificar la configuración.
# Tipo: Str
proxysql_login_admin_host: 127.0.0.1
proxysql_login_admin_password: admin
proxysql_login_admin_port: 6032
proxysql_login_admin_user: admin

# Variables globales
# `admin_variables` en `proxysql_global_variables_kv`: contiene variables globales que controlan la funcionalidad de la interfaz de administración.
# `admin_variables` están precedidas por `admin-`.
# `mysql_variables`: en `proxysql_global_variables_kv` contiene variables globales que controlan la funcionalidad para manejar el tráfico MySQL entrante.
# `mysql_variables` están precedidas por `mysql-`.

# Las variables deben ser un string o un entero. Debes marcar un valor booleano como un string, por ejemplo "True" o "False".

# Para una referencia completa consulta:
# https://github.com/sysown/proxysql/wiki/Global-variables

# Formato:
# Tipo: Dict
# proxysql_global_variables:
#   load_to_runtime: "True"
#   save_to_disk: "True"
#   login_host: "{{ proxysql_login_admin_host }}"
#   login_password: "{{ proxysql_login_admin_password }}"
#   login_port: "{{ proxysql_login_admin_port }}"
#   login_user: "{{ proxysql_login_admin_user }}"
proxysql_global_variables:
  login_host: "{{ proxysql_login_admin_host }}"
  login_password: "{{ proxysql_login_admin_password }}"
  login_port: "{{ proxysql_login_admin_port }}"
  login_user: "{{ proxysql_login_admin_user }}"
# Formato:
# Tipo: Dict
# proxysql_global_variables_kv:
#   clave: valor
# p.ej.:
# proxysql_global_variables_kv:
#   admin-admin_credentials: "{{ proxysql_login_admin_user }}:{{ proxysql_login_admin_password }}"
#   admin-mysql_ifaces: "{{ proxysql_login_admin_host }}:{{ proxysql_login_admin_port }}"
#   mysql-interfaces: 0.0.0.0:6033
#   mysql-commands_stats: "True"
#   mysql-threads: 4
proxysql_global_variables_kv: {}

# Servidores de backend
# `proxysql_backend_servers`: contiene filas de la tabla mysql_servers de la interfaz de administración. Básicamente, estos definen los servidores de backend hacia los cuales se enruta el tráfico MySQL entrante.

# Para una referencia completa consulta:
# https://docs.ansible.com/ansible/latest/modules/proxysql_backend_servers_module.html
# Importante: Este módulo utiliza `hostgroup` (que es el nombre correcto en la base de datos) en lugar de `hostgroup_id` (que es el valor predeterminado en el módulo de Ansible)!

# Formato:
# Tipo: Dict
# proxysql_backend_servers:
#   mysql-srv1-hg1:
#     comment: mysql-srv1-hg1
#     hostgroup: 1
#     hostname: 172.16.77.101
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     max_connections: 1000
#     max_replication_lag: 0
#     status: ONLINE
#     weight: 1
#   mysql-srv1-hg2:
#     comment: mysql-srv1-hg2
#     hostgroup: 2
#     hostname: 172.16.77.101
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     max_connections: 1000
#     max_replication_lag: 0
#     status: ONLINE
#     weight: 1
proxysql_backend_servers: {}

# Servidores ProxySQL
# `proxysql_proxysql_servers`: contiene filas para la tabla proxysql_servers de la interfaz de administración. Básicamente, estos definen los servidores ProxySQL que se utilizan para el clustering.

# Para una referencia completa consulta:
# `library/proxysql_proxysql_servers.py`, ya que no es parte del paquete oficial de Ansible.

# Formato:
# Tipo: Dict
# proxysql_proxysql_servers:
#   proxysql-srv-1:
#     comment: proxysql-srv-1
#     hostname: 172.16.77.201
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     weight: 0
#   proxysql-srv-2:
#     comment: proxysql-srv-2
#     hostname: 172.16.77.202
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     weight: 0
proxysql_proxysql_servers: {}

# Grupos de host de replicación
# `proxysql_replication_hostgroups`: representan un par de writer_hostgroup y reader_hostgroup. ProxySQL monitorizará el valor de read_only para todos los servidores en los grupos de host especificados y, según el valor de read_only, asignará el servidor a los grupos de hosts de escritura o lectura.

# Para una referencia completa consulta:
# https://docs.ansible.com/ansible/latest/modules/proxysql_replication_hostgroups_module.html

# Formato:
# Tipo: Dict
# proxysql_replication_hostgroups:
#   Cluster:
#     comment: Cluster
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     reader_hostgroup: 2
#     writer_hostgroup: 1
proxysql_replication_hostgroups: {}

# Usuarios
# `proxysql_mysql_users`: contiene filas para la tabla mysql_users de la interfaz de administración. Básicamente, estos definen los usuarios que pueden conectarse al proxy y los usuarios con los que el proxy puede conectarse a los servidores de backend.

# Para una referencia completa consulta:
# http://docs.ansible.com/ansible/latest/proxysql_mysql_users_module.html

# Formato:
# Tipo: Dict
# proxysql_mysql_users:
#   user1:
#     active: 1
#     backend: 1
#     default_hostgroup: 1
#     fast_forward: 0
#     frontend: 1
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     max_connections: 10000
#     password: Passw0rd
#     transaction_persistent: 1
#     username: user1
#   user2:
#     active: 1
#     backend: 1
#     default_hostgroup: 2
#     fast_forward: 0
#     frontend: 1
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     max_connections: 1000
#     password: dr0wssaP
#     transaction_persistent: 1
#     username: user2
proxysql_mysql_users: {}

# Reglas de consulta
# `proxysql_query_rules` contiene filas para la tabla mysql_query_rules desde la interfaz de administración. Básicamente, estas definen las reglas utilizadas para clasificar y enrutar el tráfico MySQL entrante, según varios criterios (patrones coincidentes, usuario que ejecuta la consulta, etc.).

# Para una referencia completa consulta:
# http://docs.ansible.com/ansible/latest/proxysql_query_rules_module.html

# Formato:
# Tipo: Dict
# proxysql_query_rules:
#   catchall:
#     active: 1
#     apply: 1
#     destination_hostgroup: 1
#     flagIN: 0
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     match_pattern: .*@.*
#     negate_match_pattern: 0
#     rule_id: 1
#   selectforupdate:
#     active: 1
#     apply: 1
#     destination_hostgroup: 1
#     flagIN: 0
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     match_pattern: ^SELECT.*FOR UPDATE
#     negate_match_pattern: 0
#     rule_id: 2
#   select:
#     active: 1
#     apply: 0
#     destination_hostgroup: 2
#     flagIN: 0
#     login_host: "{{ proxysql_login_admin_host }}"
#     login_password: "{{ proxysql_login_admin_password }}"
#     login_port: "{{ proxysql_login_admin_port }}"
#     login_user: "{{ proxysql_login_admin_user }}"
#     match_pattern: ^SELECT.*
#     negate_match_pattern: 0
#     rule_id: 3
proxysql_query_rules: {}

# Herramienta de administración de Percona ProxySQL
# La solución ProxySQL Admin (proxysql-admin) configura los nodos del clúster Percona XtraDB en ProxySQL.

# Para una referencia completa consulta:
# https://github.com/percona/proxysql-admin-tool

# Formato:
# Tipo: Dict
# proxysql_percona_admin_tool:
#   PROXYSQL_DATADIR: "{{ proxysql_datadir }}"
#   PROXYSQL_USERNAME: "{{ proxysql_login_admin_user }}"
#   PROXYSQL_PASSWORD: "{{ proxysql_login_admin_password }}"
#   PROXYSQL_HOSTNAME: "{{ proxysql_login_admin_host }}"
#   PROXYSQL_PORT: "{{ proxysql_login_admin_port }}"
#   CLUSTER_USERNAME: admin
#   CLUSTER_PASSWORD: admin
#   CLUSTER_HOSTNAME: localhost
#   CLUSTER_PORT: 3306
#   MONITOR_USERNAME: monitor
#   MONITOR_PASSWORD: monit0r
#   CLUSTER_APP_USERNAME: proxysql_user
#   CLUSTER_APP_PASSWORD: passw0rd
#   WRITE_HOSTGROUP_ID: 10
#   READ_HOSTGROUP_ID: 11
#   MODE: singlewrite
proxysql_percona_admin_tool:
  PROXYSQL_DATADIR: "{{ proxysql_datadir }}"
  PROXYSQL_USERNAME: "{{ proxysql_login_admin_user }}"
  PROXYSQL_PASSWORD: "{{ proxysql_login_admin_password }}"
  PROXYSQL_HOSTNAME: "{{ proxysql_login_admin_host }}"
  PROXYSQL_PORT: "{{ proxysql_login_admin_port }}"

Ejemplos

1) Ejemplo completo de configuración

Aquí puedes ver un ejemplo completo de configuración de ProxySQL. En este caso, el rol descargará el paquete 1.4.15 directamente y no usará el repositorio (proxysql_use_official_repo está configurado en False).

Esto es básicamente (con algunos pequeños cambios) el archivo test.yml que se utiliza para las pruebas.

- hosts: proxysql
  gather_facts: True
  vars:
    proxysql_version: 1.4.15
    proxysql_service_enabled: True
    proxysql_use_official_repo: True
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    proxysql_global_variables:
      login_host: "{{ proxysql_login_admin_host }}"
      login_password: "{{ proxysql_login_admin_password }}"
      login_port: "{{ proxysql_login_admin_port }}"
      login_user: "{{ proxysql_login_admin_user }}"
    proxysql_global_variables_kv:
      admin-admin_credentials: "{{ proxysql_login_admin_user }}:{{ proxysql_login_admin_password }}"
      admin-mysql_ifaces: "{{ proxysql_login_admin_host }}:{{ proxysql_login_admin_port }}"
      mysql-commands_stats: "True"
      mysql-connect_retries_on_failure: 10
      mysql-connect_timeout_server: 3000
      mysql-default_charset: utf8
      mysql-default_query_delay: 0
      mysql-default_query_timeout: 300000
      mysql-default_schema: information_schema
      mysql-default_sql_mode: >
                              STRICT_TRANS_TABLES,
                              ERROR_FOR_DIVISION_BY_ZERO,
                              NO_AUTO_CREATE_USER,
                              NO_ENGINE_SUBSTITUTION
      mysql-interfaces: 127.0.0.1:6033
      mysql-max_connections: 8192
      mysql-monitor_read_only_interval: 1500
      mysql-monitor_read_only_timeout: 500
      mysql-ping_timeout_server: 500
      mysql-poll_timeout: 2000
      mysql-query_retries_on_failure: 1
      mysql-sessions_sort: "True"
      mysql-threads: 4
    proxysql_backend_servers:
      mysql-srv1-hg1:
        comment: mysql-srv1-hg1
        hostgroup: 1
        hostname: 172.16.77.101
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 1000
        max_replication_lag: 0
        status: ONLINE
        weight: 1
      mysql-srv1-hg2:
        comment: mysql-srv1-hg2
        hostgroup: 2
        hostname: 172.16.77.101
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 1000
        max_replication_lag: 0
        status: ONLINE
        weight: 1
      mysql-srv2-hg2:
        comment: mysql-srv2-hg2
        hostgroup: 2
        hostname: 172.16.77.102
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 2000
        max_replication_lag: 5
        status: ONLINE
        weight: 1
      mysql-srv3-hg2:
        comment: mysql-srv3-hg2
        hostgroup: 2
        hostname: 172.16.77.103
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 2000
        max_replication_lag: 5
        status: OFFLINE_HARD
        weight: 1
    proxysql_proxysql_servers:
      proxysql-srv-1:
        comment: proxysql-srv-1
        hostname: 172.16.77.201
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        port: 6032
        weight: 0
      proxysql-srv-2:
        comment: proxysql-srv-2
        hostname: 172.16.77.202
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        port: 6032
        weight: 0
    proxysql_replication_hostgroups:
      Cluster:
        comment: Cluster
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        reader_hostgroup: 2
        writer_hostgroup: 1
    proxysql_mysql_users:
      user1:
        active: 1
        backend: 1
        default_hostgroup: 1
        fast_forward: 0
        frontend: 1
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 10000
        password: Passw0rd
        transaction_persistent: 1
        username: user1
      user2:
        active: 1
        backend: 1
        default_hostgroup: 1
        fast_forward: 0
        frontend: 1
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        max_connections: 1000
        password: dr0wssaP
        transaction_persistent: 1
        username: user2
    proxysql_query_rules:
      catchall:
        active: 1
        apply: 1
        destination_hostgroup: 1
        flagIN: 0
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        match_pattern: .*@.*
        negate_match_pattern: 0
        rule_id: 1
      selectforupdate:
        active: 1
        apply: 1
        destination_hostgroup: 1
        flagIN: 0
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        match_pattern: ^SELECT.*FOR UPDATE
        negate_match_pattern: 0
        rule_id: 2
      select:
        active: 1
        apply: 0
        destination_hostgroup: 2
        flagIN: 0
        login_host: "{{ proxysql_login_admin_host }}"
        login_password: "{{ proxysql_login_admin_password }}"
        login_port: "{{ proxysql_login_admin_port }}"
        login_user: "{{ proxysql_login_admin_user }}"
        match_pattern: ^SELECT.*
        negate_match_pattern: 0
        rule_id: 3
  roles:
    - timorunge.proxysql

2) Instalación desde el repositorio oficial

Usa el repositorio ProxySQL (proxysql_use_official_repo está configurado en True). ProxySQL en sí no proporciona paquetes en el repositorio para Ubuntu > 16.04.

Solo establece proxysql_use_official_repo en False para versiones más nuevas de Ubuntu o usa el repositorio de Percona.

Consulta la sección de pruebas para la cobertura del repositorio oficial.

- hosts: proxysql
  vars:
    proxysql_use_official_repo: True
    proxysql_use_percona_repo: False
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    ...

3) Instalación desde el repositorio de Percona

Usa el repositorio ProxySQL (proxysql_use_percona_repo está configurado en True).

Consulta la sección de pruebas para la cobertura del repositorio de Percona.

- hosts: proxysql
  vars:
    proxysql_use_official_repo: False
    proxysql_use_percona_repo: True
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    ...

4) Instalación desde un paquete deb o rpm

Puedes instalar ProxySQL directamente desde un lanzamiento de GitHub. Solo define la proxysql_version. Establece proxysql_use_official_repo y proxysql_use_percona_repo en False.

- hosts: proxysql
  vars:
    proxysql_version: 1.4.15
    proxysql_use_official_repo: False
    proxysql_use_percona_repo: False
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    ...

5) No reiniciar ProxySQL después de un cambio de variable estática

Si deseas reiniciar ProxySQL por tu cuenta después de un cambio de configuración de variables estáticas, debes establecer proxysql_restart_on_static_variables_change en False.

En este caso, estás enfrentando un problema conocido que no es un drama. En este caso, las pruebas de idempotencia fallarán.

No necesitas aplicar Ansible nuevamente después de un reinicio manual.

- hosts: proxysql
  vars:
    proxysql_use_official_repo: False
    proxysql_restart_on_static_variables_change: False
    proxysql_login_admin_host: 127.0.0.1
    proxysql_login_admin_password: admin
    proxysql_login_admin_port: 6032
    proxysql_login_admin_user: admin
    ...

Problemas conocidos o: Buenas prácticas

1) ProxySQL > 1.4.7 en Ubuntu 16.04 (arreglado)

En Ubuntu 16.04, Ansible (la versión no importa) / ProxySQL > 1.4.7 parece tener problemas para comunicarse correctamente a través de mysql-python / python-mysqldb.

Error de ejemplo:

"unable to modify server.. (1045, 'unrecognized token: \"\\'\\n  AND compression = 0\\n  AND weight = 1\\n  AND use_ssl = 0\\n  AND max_connections = 2000\\n  AND max_latency_ms = 0\\n  AND max_replication_lag = 5\"')"

Nota:

He hecho una pequeña investigación con mysql-python instalado a través de pip en Ubuntu 16.04. No te preocupes, también falla con python-mysqldb.


En la biblioteca python MySQLdb, el método execute (clase BaseCursor) genera una consulta de la siguiente manera:

query = query % tuple([db.literal(item) for item in args])

db.literal es parte de la clase Connection y devuelve objetos individuales como un string y múltiples objetos como una secuencia mientras convierte cada secuencia también.

def literal(self, o):
  # ...
  return self.escape(o, self.encoders)

self.escape debería escapar todos los caracteres especiales en el objeto dado y está utilizando un diccionario de mapeo para proporcionar funciones de comillas para cada tipo. Este es self.encoders que - por defecto y sin establecer diferente - utiliza MySQLdb.converters.

El mapeo para un string es StringType: Thing2Literal. Así que el string será escapado con el método Thing2Literal.

def Thing2Literal(o, d):
  # ...
  return string_literal(o, d)

string_literal debería convertir nuestro objeto string en un literal de cadena SQL. Esto significa que todos los caracteres especiales de SQL están escapados y está encerrado en comillas simples. En otras palabras, realiza:

"'%s'" % escape_string(str(obj))

Al escapar el string, los objetos string se eliminan y devuelven solo una comilla simple (').

Como en las pruebas no se cambió nada más que la versión de ProxySQL, asumo que un cambio en ProxySQL (diff 1.4.7 vs. 1.4.8) está causando que Ansible falle. Porque ProxySQL en sí - si no se activa a través de Ansible - funciona perfectamente bien.


Por último...

Este problema se soluciona instalando mysqlclient - que es un fork de MySQLdb - a través de pip.

2) Paquetes para Ubuntu > 16.04 (arreglado)

ProxySQL en sí no está proporcionando paquetes "actualizados" para Ubuntu > 16.04. Este rol de Ansible trabaja alrededor de esto descargando la versión de 16.04 para Ubuntu > 16.04 e instalando la misma (este comportamiento puede cambiar en el futuro).

Hay una dependencia de paquete para libcrypto++6 y libssl1.0.0 a partir de Ubuntu >= 18.04 (lo cual se resuelve automáticamente).

3) Variables globales no dinámicas

ProxySQL tiene algunas global_variables que no se pueden cambiar durante el tiempo de ejecución (ver proxysql_non_dynamic_variables en vars/main.yml). Dicho esto, esto por sí mismo no es un problema, ya que este rol de ProxySQL se encarga (generando proxysql.cnf) y proporciona la posibilidad de reiniciar automáticamente si tal variable cambia (establecer proxysql_restart_on_static_variables_change en True).

Este rol también está configurando este valor en la base de datos de ProxySQL y aquí comienza el problema:

Si cambias más de un valor estático, técnicamente todo está bien. ProxySQL se reinicia y toma el nuevo valor de proxysql.cnf. Pero solo el primer valor se cambia en la base de datos.

No es un "gran problema" ya que el valor real se toma correctamente del archivo de configuración, pero verás un conjunto de cambios en la siguiente ejecución de Ansible que:

  • Reiniciará ProxySQL una vez más
  • Las pruebas de idempotencia fallarán (si no estás iniciando desde cero)

Una solución potencial podría ser no establecer proxysql_non_dynamic_variables en la base de datos de ProxySQL.

4) Clustering de ProxySQL

El clustering de ProxySQL todavía es experimental. Una cita de la documentación de clustering: "debido a que esta característica sigue siendo experimental, la tabla no se carga automáticamente desde el disco".

Para la inicialización desde el proxysql.cnf es importante que se definan hostname (obviamente) y port (no toma el valor predeterminado).

5) ProxySQL y el repositorio de Percona en CentOS...

...no funciona debido a algunos problemas de dependencia.

Técnicamente necesitamos los siguientes paquetes para aplicar Ansible correctamente:

proxysql_dependency_pkgs:
  - MySQL-python
  - mysql

Con el repositorio de Percona habilitado, las dependencias de paquetes para MySQL-python y mysql chocan.

yum install MySQL-python
...
============================================================================================
 Paquete                    Arch     Versión                 Repositorio                Tamaño
============================================================================================
 Instalando:
  MySQL-python              x86_64   1.2.5-1.el7             base                      90 k
 Instalando para dependencias:
  Percona-Server-shared-56  x86_64   5.6.43-rel84.3.el7      percona-release-x86_64   619 k

Resumen de transacción
============================================================================================
Instalar  1 Paquete (+1 Paquete Dependiente)
yum install mysql
...

============================================================================================
 Paquete                          Arch    Versión             Repositorio               Tamaño
============================================================================================
 Instalando:
  Percona-Server-client-57         x86_64  5.7.24-27.1.el7    percona-release-x86_64  6.8 M
 Instalando para dependencias:
  Percona-Server-shared-57         x86_64  5.7.24-27.1.el7    percona-release-x86_64  748 k
  Percona-Server-shared-compat-57  x86_64  5.7.24-27.1.el7    percona-release-x86_64  1.2 M

Resumen de transacción
============================================================================================
Instalar  1 Paquete (+2 Paquetes Dependientes)

Como puedes ver, MySQL-python depende de Percona-Server-shared-56 mientras que mysql depende de Percona-Server-shared-57.

Pruebas

Estado de la Construcción

Las pruebas se realizan con Docker y docker_test_runner que levantan los siguientes contenedores con diferentes configuraciones ambientales:

  • CentOS 7
  • Debian 9 (Stretch)
  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 18.04 (Bionic Beaver)

Ansible 2.7.9 está instalado en todos los contenedores y se aplica un playbook de prueba.

Para más detalles y comprobaciones adicionales, consulta la configuración de docker_test_runner y el punto de entrada de Docker. Una visión general a alto nivel se puede encontrar en la siguiente tabla:

Distribución Versión Repositorio oficial Repositorio de Percona Paquete
CentOS 7 no 1.4.15
Debian 9 1.4.15
Ubuntu 16.04 1.4.15
Ubuntu 18.04 no 1.4.15
# Pruebas locales:
curl https://raw.githubusercontent.com/timorunge/docker-test-runner/master/install.sh | sh
./docker_test_runner.py -f tests/docker_test_runner.yml

Dado que el tiempo de construcción en Travis está limitado para los repositorios públicos, las pruebas automáticas están limitadas a:

  • CentOS 7
  • Debian 8 (Jessie)
  • Debian 9 (Stretch)
  • Ubuntu 16.04 (Xenial Xerus)
  • Ubuntu 18.04 (Bionic Beaver)

Dependencias

Licencia

Licencia BSD 3-Cláusulas "Nueva" o "Revisada"

Información del autor

  • Timo Runge
Acerca del proyecto

This role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.

Instalar
ansible-galaxy install timorunge.proxysql
Licencia
bsd-3-clause
Descargas
1.7k
Propietario