Ansible : Automatisation du déploiement d’un cluster multi master pour MariaDB (et MySQL…) avec Galera
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