Ansible : Automatisation du déploiement d’un cluster multi master pour MariaDB (et MySQL…) avec Galera

Posted by

Cet article est la suite de mon précédent article sur le sujet dans le but de pousser le concept un peu plus loin. C’est mon premier role Ansible donc je suis à peu près certain qu’il est possible de mieux faire.

Dans un premier temps, paramétrons le fichier /etc/ansible/hosts pour y lister nos serveurs.

[galera]
db1.morot.test
db2.morot.test
db3.morot.test

On créé notre rôle avec ansible-galaxy pour se faciliter le travail :

cd /etc/ansible/
mkdir roles
ansible-galaxy init galera
- galera was created successfully

On pousse notre template de configuration MariaDB dans /etc/ansible/roles/galera/templates/my.cnf.j2 :

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock


[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages     = en_US
skip-external-locking

bind-address=0.0.0.0
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0

max_connections         = 100
connect_timeout         = 5
wait_timeout            = 600
max_allowed_packet      = 16M
thread_cache_size       = 128
sort_buffer_size        = 4M
bulk_insert_buffer_size = 16M
tmp_table_size          = 32M
max_heap_table_size     = 32M
myisam_recover_options = BACKUP
key_buffer_size         = 128M
table_open_cache        = 400
myisam_sort_buffer_size = 512M
concurrent_insert       = 2
read_buffer_size        = 2M
read_rnd_buffer_size    = 1M
query_cache_limit               = 128K
query_cache_size                = 64M
log_warnings            = 2
slow_query_log_file     = /var/log/mysql/mariadb-slow.log
long_query_time = 10
log_slow_verbosity      = query_plan

log_bin                 = /var/log/mysql/mariadb-bin
log_bin_index           = /var/log/mysql/mariadb-bin.index
expire_logs_days        = 10
max_binlog_size         = 100M
default_storage_engine  = InnoDB
innodb_buffer_pool_size = 256M
innodb_log_buffer_size  = 8M
innodb_file_per_table   = 1

Et donc on est prêt à éditer notre fichier /etc/ansible/galera/tasks/main.yml :

---
# tasks file for galera

- name: MAJ des depots
  apt:
    update_cache: yes
    name: software-properties-common
    state: latest

- name: Ajout de la cle des depots Galera
  apt_key:
    keyserver: 'keyserver.ubuntu.com'
    id: '0xF1656F24C74CD1D8'

- apt_repository:
    repo: 'deb [arch=amd64,i386,ppc64el] http://mariadb.mirrors.ovh.net/MariaDB/repo/10.2/ubuntu xenial main'
    state: present
    update_cache: yes

- name: MariaDB Root password
  debconf:
    question: "mysql-server/root_password"
    name: "mariadb-server"
    value: "secret"
    vtype: "string"

- name: MariaDB Root password confirmation
  debconf:
    question: "mysql-server/root_password_again"
    name: "mariadb-server"
    value: "secret"
    vtype: "string"

- name: Installation des paquets Galera
  apt:
    name: "{{ item }}"
  with_items:
    - rsync
    - mariadb-server
    - galera-3

- name: Configuration du serveur MariaDB pour Galera
  template:
    src: 'my.cnf.j2'
    dest: '/etc/mysql/my.cnf'
    owner: 'root'
    group: 'root'
    mode: '0644'

- name: Bootstrap du cluster
  command: /usr/bin/galera_new_cluster
  delegate_to: "{{ groups['galera'][0] }}"
  run_once: true

Et enfin, notre playbook galera.yml :

---
- hosts: galera
  gather_facts: True
  pre_tasks:
    - setup:
  roles:
    - galera

A partir de là, il n’y a plus qu’à jour le playbook sur le groupe d’hôtes pour lancer la configuration. A l’issue de cette étape, il reste à redémarrer les services MariaDB sur tous les nodes sauf le bootstrap. C’est un cas que je n’ai pas géré par Ansible.

ansible-playbook -l galera galera.yml  --ask-become-pass

2 comments

  1. Bonsoir,

    est-ce que l’utilisation d’un fichier de configuration supplémentaire dans /etc/mysql/mariadb.conf/ n’aurait pas été plus judicieux ? Cela éviterait aux mises à jour OS d’écraser la configuration ou tout du moins de poser la question de d’installer la version responsable du paquet.

    Merci,

    1. Les fichiers sont bien gérés par des includes en Ubuntu16, c’est effectivement préférable. C’est juste une ancienne habitude.
      Cette configuration a l’avantage de pouvoir être gérée telle que sous Ubuntu 14 également.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *