vdzhorov.proxysql

proxysql


Actualmente, este rol es compatible con ProxySQL >= v2.0.1 si estás usando RHEL 8. Si deseas instalar la serie ProxySQL 1.4.x, necesitarás utilizar RHEL 7 o inferior.

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 los módulos de utilidad de MySQL.

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 y alta disponibilidad, consciente del protocolo para MySQL.

Desde la versión 2.3.0, Ansible proporciona un módulo para configurar ProxySQL por sí mismo. Este rol de Ansible utiliza esta funcionalidad, pero agrega algunas características (esperemos que útiles):

Por favor, también echa un vistazo a la sección "Problemas conocidos o: Es bueno saber" 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 la plataforma están listados en el archivo de metadatos.

Instalación

ansible-galaxy install vdzhorov.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 las variables estáticas cambian. Para ver la lista de variables estáticas, consulta `proxysql_non_dynamic_variables` en `vars/main.yml`.
# Tipo: Bool
proxysql_restart_on_static_variables_change: True

# Repositorio

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

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

# Usar 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 usa 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

# Definir la plantilla proxysql.cnf
# Tipo: Str
proxysql_proxysql_cnf_template: proxysql.cnf.j2

# Definir la plantilla 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 en sí. 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 o una cadena o un entero. Debes marcar un valor booleano como una cadena, 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:
#   key: value
# 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 para la tabla mysql_servers de la interfaz de administración. Básicamente, estos definen los servidores de backend hacia los cuales se dirige 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 predeterminado en el módulo 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 la agrupación.

# Para una referencia completa, consulta:
# `library/proxysql_proxysql_servers.py` ya que esto 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 monitoreará el valor de read_only para todos los servidores en los grupos de host especificados, y en función del valor de read_only, asignará el servidor a los grupos de host de escritor o lector.

# 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 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 de la interfaz de administración. Básicamente, estas definen las reglas utilizadas para clasificar y enrutar el tráfico MySQL entrante, de acuerdo con varios criterios (patrones coincidentes, usuario que utilizó 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 de administración de ProxySQL (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 de configuración completa

Aquí puedes ver un ejemplo completo de la configuración de ProxySQL. En este caso, el rol descargará directamente el paquete 1.4.15 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-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

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

Simplemente establece proxysql_use_official_repo en False para nuevas versiones de Ubuntu o usa el repositorio de Percona.

Consulta la sección 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

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

Consulta la sección 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. Simplemente define 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 en una variable estática

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

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

No es necesario 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: Es bueno saber

1) ProxySQL > 1.4.7 en Ubuntu 16.04 (corregido)

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.

Ejemplo de error:

"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 realizado un poco de investigación con mysql-python instalado a través de pip en Ubuntu 16.04. No te preocupes, también fallará con python-mysqldb.


En la biblioteca de 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 una cadena 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 utiliza un diccionario de mapeo para proporcionar funciones de citación para cada tipo. Esto es self.encoders, que, por defecto y no establecido diferente, utiliza MySQLdb.converters.

El mapeo para una cadena es StringType: Thing2Literal. Así que la cadena será escapada con el método Thing2Literal.

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

string_literal debería convertir nuestro objeto de cadena en un literal de cadena SQL. Esto significa que cualquier carácter SQL especial se escapa, y se encierra entre comillas simples. En otras palabras, realiza:

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

Durante la escapada de la cadena, los objetos de cadena se eliminan y solo devuelven una sola comilla (').

Dado que en las pruebas no se cambió nada más que la versión de ProxySQL, supongo 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.


Por último, pero no menos importante...

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

2) Paquetes para Ubuntu > 16.04 (corregido)

ProxySQL en sí no proporciona paquetes "actualizados" para Ubuntu > 16.04. Este rol de Ansible obra en torno a esto descargando la versión 16.04 para Ubuntu > 16.04 e instalando la misma (este comportamiento podría cambiar en el futuro).

Hay una dependencia de paquete para libcrypto++6 y libssl1.0.0 a partir de Ubuntu >= 18.04 (que 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 no es un problema ya que este rol de ProxySQL se encarga (generando proxysql.cnf) y proporciona la posibilidad de reiniciar automáticamente si cambia una variable así (establece proxysql_restart_on_static_variables_change en True).

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

Si cambias más de una variable estática tecnicamente 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 en sí.

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 próxima 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 ProxySQL.

4) Agrupación de ProxySQL

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

Para la inicialización desde proxysql.cnf, es importante que hostname (obviamente) y port (no toma el valor predeterminado) estén definidos.

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     Version                 Repositorio                Tamaño
============================================================================================
 Instalando:
  MySQL-python              x86_64   1.2.5-1.el7             base                      90 k
 Instalando 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    Version             Repositorio               Tamaño
============================================================================================
 Instalando:
  Percona-Server-client-57         x86_64  5.7.24-27.1.el7    percona-release-x86_64  6.8 M
 Instalando 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 compilación

Las pruebas se realizan con Docker y docker_test_runner que inicia los siguientes contenedores con diferentes configuraciones de entorno:

  • 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 verificaciones 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 localmente:
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 compilación en Travis es limitado para repositorios públicos, las pruebas automatizadas 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 de 3 cláusulas "Nueva" o "Revisada"

Información del autor

  • Timo Runge
Acerca del proyecto

This role is a fork from timorunge.proxysql. The role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.

Instalar
ansible-galaxy install vdzhorov.proxysql
Licencia
bsd-3-clause
Descargas
114
Propietario
Sysadmin and DevOps enthusiast.