vdzhorov.proxysql

proxysql


Actuellement, ce rôle est compatible avec ProxySQL >= v2.0.1 si vous utilisez RHEL 8. Si vous souhaitez installer la série ProxySQL 1.4.x, vous devrez utiliser RHEL 7 ou une version antérieure.

Ce rôle n'est compatible qu'avec Ansible 2.7.9 ou supérieur en raison d'un bug lors de la migration de MySQLdb à PyMySQL (#40123) dans le module MySQL utilitaires.

La version 0.3.0 est compatible avec Ansible 2.7.0 ou inférieur.


Ce rôle installe et configure ProxySQL - un proxy performant, hautement disponible et sensible aux protocoles pour MySQL.

Depuis la version 2.3.0, Ansible fournit un module pour configurer ProxySQL lui-même. Ce rôle Ansible utilise cette fonctionnalité tout en ajoutant quelques caractéristiques (espérons-le utiles) supplémentaires :

Veuillez également consulter la section "Problèmes connus ou : Bon à savoir" dans ce document.

Exigences

Ce rôle nécessite Ansible 2.5.0 ou supérieur.

Vous pouvez simplement utiliser pip pour installer (et définir) une version stable :

pip install ansible==2.7.9

Tous les besoins en matière de plateformes sont listés dans le fichier métadonnées.

Installation

ansible-galaxy install vdzhorov.proxysql

Variables de rôle

Les variables qui peuvent être passées à ce rôle. Pour toutes les variables, consultez defaults/main.yml.

# Activer / désactiver ProxySQL en tant que service.
# Type : Bool
proxysql_service_enabled: True

# Redémarrer ProxySQL si les variables statiques changent. Pour une liste des variables statiques, consultez `proxysql_non_dynamic_variables` dans `vars/main.yml`.
# Type : Bool
proxysql_restart_on_static_variables_change: True

# Référentiel

# Si `proxysql_use_official_repo` et `proxysql_use_percona_repo` sont tous deux définis sur `False`, le module téléchargera automatiquement la version définie de `proxysql_version` en tant que paquet depuis Github et l'installera.

# Utiliser le dépôt officiel de ProxySQL.
# Type : Bool
proxysql_use_official_repo: True

# Utiliser le dépôt Percona.
# Type : Bool
proxysql_use_percona_repo: False

# Définir la version du dépôt pour le dépôt percona.
# Type : Str
proxysql_percona_release: latest

# La version de ProxySQL à installer si le dépôt ProxySQL n'est pas utilisé.
# Type : Int
proxysql_version: 1.4.15

# Configuration

# Le chemin où ProxySQL devrait enregistrer sa base de données et ses journaux.
# Type : Str
proxysql_datadir: /var/lib/proxysql

# Définir le modèle proxysql.cnf
# Type : Str
proxysql_proxysql_cnf_template: proxysql.cnf.j2

# Définir le modèle proxysql-admin.cnf
# Type : Str
proxysql_proxysql_admin_cnf_template: proxysql-admin.cnf.j2

# Les variables de connexion pour la configuration de ProxySQL lui-même. Elles sont utilisées uniquement dans le fichier `main.yml` et ici pour simplifier la configuration.
# Type : 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` dans `proxysql_global_variables_kv`: contient des variables globales qui contrôlent la fonctionnalité de l'interface admin.
# `admin_variables` sont préfixés par `admin-`.
# `mysql_variables`: dans `proxysql_global_variables_kv` contient des variables globales qui contrôlent la fonctionnalité pour le traitement du trafic MySQL entrant.
# `mysql_variables` sont préfixés par `mysql-`.

# Les variables doivent être soit une chaîne de caractères, soit un entier. Vous devez marquer une valeur booléenne comme une chaîne, par exemple "True" ou "False".

# Pour une référence complète, consultez :
# https://github.com/sysown/proxysql/wiki/Global-variables

# Format :
# Type : 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 }}"
# Format :
# Type : Dict
# proxysql_global_variables_kv:
#   key: value
# par exemple :
# 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: {}

# Serveurs de backend
# `proxysql_backend_servers`: contient des lignes pour la table mysql_servers de l'interface admin. En gros, ces lignes définissent les serveurs de backend vers lesquels le trafic MySQL entrant est routé.

# Pour une référence complète, consultez :
# https://docs.ansible.com/ansible/latest/modules/proxysql_backend_servers_module.html
# Important : Ce module utilise `hostgroup` (qui est le nom correct dans la base de données) au lieu de `hostgroup_id` (qui est le nom par défaut dans le module Ansible) !

# Format :
# Type : 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: {}

# Serveurs ProxySQL
# `proxysql_proxysql_servers`: contient des lignes pour la table proxysql_servers de l'interface admin. En gros, ces lignes définissent les serveurs ProxySQL utilisés pour le clustering.

# Pour une référence complète, consultez :
# `library/proxysql_proxysql_servers.py` car cela ne fait pas partie du paquet Ansible officiel.

# Format :
# Type : 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: {}

# Groupes de réplication
# `proxysql_replication_hostgroups`: représentent une paire de writer_hostgroup et reader_hostgroup. ProxySQL va surveiller la valeur de read_only pour tous les serveurs dans les groupes spécifiés, et en fonction de cette valeur, il assignera le serveur aux groupes d'écriture ou de lecture.

# Pour une référence complète, consultez :
# https://docs.ansible.com/ansible/latest/modules/proxysql_replication_hostgroups_module.html

# Format :
# Type : 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: {}

# Utilisateurs
# `proxysql_mysql_users`: contient des lignes pour la table mysql_users de l'interface admin. En gros, ces lignes définissent les utilisateurs qui peuvent se connecter au proxy, et les utilisateurs avec lesquels le proxy peut se connecter aux serveurs de backend.

# Pour une référence complète, consultez :
# http://docs.ansible.com/ansible/latest/proxysql_mysql_users_module.html

# Format :
# Type : 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: {}

# Règles de requête
# `proxysql_query_rules` contient des lignes pour la table mysql_query_rules de l'interface admin. En gros, ces lignes définissent les règles utilisées pour classifier et router le trafic MySQL entrant, selon divers critères (modèles correspondants, utilisateur utilisé pour exécuter la requête, etc.).

# Pour une référence complète, consultez :
# http://docs.ansible.com/ansible/latest/proxysql_query_rules_module.html

# Format :
# Type : 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: {}

# Outil de gestion de ProxySQL Percona
# La solution ProxySQL Admin (proxysql-admin) configure les nœuds de cluster Percona XtraDB dans ProxySQL.

# Pour une référence complète, consultez :
# https://github.com/percona/proxysql-admin-tool

# Format :
# Type : 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 }}"

Exemples

1) Exemple de configuration complète

Ici, vous pouvez voir un exemple complet de configuration de ProxySQL. Dans ce cas, le rôle téléchargera le paquet 1.4.15 directement et n'utilisera pas le dépôt (proxysql_use_official_repo est défini sur False).

Ceci est essentiellement (avec quelques petites modifications) le fichier test.yml qui est utilisé pour les tests.

- 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) Installation depuis le dépôt officiel

Utilisez le dépôt ProxySQL (proxysql_use_official_repo est défini sur True). ProxySQL ne fournit pas de paquets dans le dépôt pour Ubuntu > 16.04.

Il suffit de définir proxysql_use_official_repo sur False pour les versions plus récentes d'Ubuntu ou d'utiliser le dépôt Percona.

Consultez la section tests pour la couverture du dépôt officiel.

- 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) Installation depuis le dépôt Percona

Utilisez le dépôt ProxySQL (proxysql_use_percona_repo est défini sur True).

Consultez la section tests pour la couverture du dépôt 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) Installation depuis un paquet deb ou rpm

Vous pouvez installer ProxySQL directement depuis une release GitHub. Il suffit de définir la proxysql_version. Réglez proxysql_use_official_repo et proxysql_use_percona_repo sur 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) Ne pas redémarrer ProxySQL après un changement de variable statique

Si vous souhaitez redémarrer ProxySQL vous-même après un changement de configuration des variables statiques, vous devez définir proxysql_restart_on_static_variables_change sur False.

Dans ce cas, vous rencontrez un problème connu qui n'est pas dramatique. Dans ce cas, les tests d'idempotence échoueront.

Vous n'avez pas besoin d'appliquer Ansible à nouveau après un redémarrage manuel.

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

Problèmes connus ou : Bon à savoir

1) ProxySQL > 1.4.7 sur Ubuntu 16.04 (réglé)

Sur Ubuntu 16.04, Ansible (peu importe la version) / ProxySQL > 1.4.7 semble avoir des problèmes de communication correcte via mysql-python / python-mysqldb.

Exemple d'erreur :

"impossible de modifier le serveur.. (1045, 'token non reconnu : \"\\'\\n  ET compression = 0\\n  ET poids = 1\\n  ET use_ssl = 0\\n  ET max_connections = 2000\\n  ET max_latency_ms = 0\\n  ET max_replication_lag = 5\"')"

Remarque :

J'ai effectué un petit travail de recherche avec mysql-python installé via pip sur Ubuntu 16.04. Pas de souci, cela échoue également avec python-mysqldb.


Dans la bibliothèque Python MySQLdb, la méthode execute (classe BaseCursor) génère une requête de la manière suivante :

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

db.literal fait partie de la classe Connection et retourne des objets simples sous forme de chaîne et plusieurs objets sous forme de séquence tout en convertissant chaque séquence également.

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

self.escape doit échapper tous les caractères spéciaux dans l'objet donné et utilise un dictionnaire de correspondance pour fournir des fonctions de citation pour chaque type. Cela fait partie de self.encoders, qui par défaut et n'est pas défini différemment utilise MySQLdb.converters.

La correspondance pour une chaîne est StringType: Thing2Literal. Ainsi, la chaîne sera échappée avec la méthode Thing2Literal.

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

string_literal doit convertir notre objet chaîne en un littéral de chaîne SQL. Cela signifie que tous les caractères SQL spéciaux sont échappés et qu'il est entouré de guillemets simples. En d'autres termes, cela effectue :

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

Lors de l'échappement, les objets de chaîne sont supprimés et renvoient juste un guillemet simple (').

Étant donné que dans les tests, rien à part la version de ProxySQL n'a changé, je suppose qu'un changement dans ProxySQL (diff 1.4.7 vs. 1.4.8) est à l'origine de l'échec d'Ansible. Car ProxySQL lui-même - s'il n'est pas déclenché via Ansible - fonctionne parfaitement bien.


Dernier point mais non des moindres...

Ce problème est résolu en installant mysqlclient - qui est un fork de MySQLdb - via pip.

2) Paquets pour Ubuntu > 16.04 (réglé)

ProxySQL lui-même ne fournit pas de paquets "à jour" pour Ubuntu > 16.04. Ce rôle Ansible contourne cela en téléchargeant la version 16.04 pour Ubuntu > 16.04 et en installant la même (ce comportement pourrait changer à l'avenir).

Il existe une dépendance de paquet pour libcrypto++6 et libssl1.0.0 à partir d'Ubuntu >= 18.04 (ce qui est trié automatiquement).

3) Variables globales non dynamiques

ProxySQL a certaines global_variables qui ne peuvent pas être changées pendant l'exécution (voir proxysql_non_dynamic_variables dans vars/main.yml). Cela dit, cela n'est pas un problème en soi, car ce rôle ProxySQL s'en occupe (en générant proxysql.cnf) et fournit la possibilité de redémarrer automatiquement si une telle variable change (définissez proxysql_restart_on_static_variables_change sur True).

Ce rôle définit également cette valeur dans la base de données ProxySQL elle-même et ici commence le problème :

Si vous changez plus d'une variable statique, techniquement tout est OK. ProxySQL redémarre et prend la nouvelle valeur de proxysql.cnf. Mais seule la première valeur est changée dans la base de données elle-même.

Ce n'est pas un "gros problème" puisque la vraie valeur est correctement prise à partir du fichier de configuration, mais vous verrez un ensemble de changements lors de la prochaine exécution d'Ansible qui fera :

  • Redémarrer ProxySQL une fois de plus
  • Les tests d'idempotence échoueront (si vous ne démarrez pas à zéro)

Une solution potentielle pourrait être de ne pas définir proxysql_non_dynamic_variables dans la base de données ProxySQL.

4) Clustering ProxySQL

Le clustering ProxySQL est encore expérimental. Un extrait de la documentation sur le clustering : "comme cette fonctionnalité est encore expérimentale, la table n'est pas automatiquement chargée depuis le disque".

Pour l'initialisation à partir de proxysql.cnf, il est important que hostname (évidemment) et port (il ne prend pas la valeur par défaut) soient définis.

5) ProxySQL et le dépôt Percona sur CentOS...

... ne fonctionne pas à cause de certains problèmes de dépendance.

Techniquement, nous avons besoin des paquets suivants pour appliquer Ansible correctement :

proxysql_dependency_pkgs:
  - MySQL-python
  - mysql

Avec le dépôt Percona activé, les dépendances des paquets pour MySQL-python et mysql s'opposent.

yum install MySQL-python
...
============================================================================================
 Package                    Arch     Version                 Repository                Size
============================================================================================
 Installing:
  MySQL-python              x86_64   1.2.5-1.el7             base                      90 k
 Installing for dependencies:
  Percona-Server-shared-56  x86_64   5.6.43-rel84.3.el7      percona-release-x86_64   619 k

Transaction Summary
============================================================================================
Install  1 Package (+1 Dependent package)
yum install mysql
...

============================================================================================
 Package                          Arch    Version             Repository               Size
============================================================================================
 Installing:
  Percona-Server-client-57         x86_64  5.7.24-27.1.el7    percona-release-x86_64  6.8 M
 Installing for dependencies:
  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

Transaction Summary
============================================================================================
Install  1 Package (+2 Dependent packages)

Comme vous pouvez le voir, MySQL-python dépend de Percona-Server-shared-56 tandis que mysql dépend de Percona-Server-shared-57.

Tests

Build Status

Les tests sont effectués avec Docker et docker_test_runner qui présente les conteneurs suivants avec différents paramètres d'environnement :

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

Ansible 2.7.9 est installé sur tous les conteneurs et un playbook de test est appliqué.

Pour plus de détails et vérifications supplémentaires, consultez la configuration de docker_test_runner et l'entrypoint Docker. Un aperçu de haut niveau peut être trouvé dans le tableau suivant :

Distribution Version Dépôt officiel Dépôt Percona Paquet
CentOS 7 oui non 1.4.15
Debian 9 oui oui 1.4.15
Ubuntu 16.04 oui oui 1.4.15
Ubuntu 18.04 non oui 1.4.15
# Test local :
curl https://raw.githubusercontent.com/timorunge/docker-test-runner/master/install.sh | sh
./docker_test_runner.py -f tests/docker_test_runner.yml

Étant donné que le temps de construction sur Travis est limité pour les dépôts publics, les tests automatisés sont limités à :

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

Dépendances

Licence

Licence BSD 3-Clause "New" ou "Revised"

Informations sur l'auteur

  • Timo Runge
À propos du projet

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

Installer
ansible-galaxy install vdzhorov.proxysql
Licence
bsd-3-clause
Téléchargements
114
Propriétaire
Sysadmin and DevOps enthusiast.