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 :
- Installation automatique pour différents systèmes d'exploitation
- (Pré-) génération de proxysql.cnf
- Gestion d'un Cluster ProxySQL (avec un module personnalisé qui ajoute la fonctionnalité de configurer les serveurs ProxySQL)
- Différenciation entre les
global_variables
dynamiques et statiques - redémarrage de ProxySQL si nécessaire
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
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
- proxysql_proxysql_servers.py qui est ajouté au dossier de la bibliothèque de ce rôle.
Licence
Licence BSD 3-Clause "New" ou "Revised"
Informations sur l'auteur
- Timo Runge
This role is a fork from timorunge.proxysql. The role installs and configures ProxySQL - the high performance, high availability, protocol aware proxy for MySQL.
ansible-galaxy install vdzhorov.proxysql