diff --git a/defaults/main.yml b/defaults/main.yml index 8236b40..3b7fefa 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -135,3 +135,8 @@ mariadb_repository: "http://ftp.igh.cnrs.fr/pub/mariadb/repo/{{ mariadb_version # ------------------------------------- percona_version: '5.6' percona_repository: 'http://repo.percona.com/apt' + + +# Galera +mysql_galera_bootstrap: false +mariadb_galera_members: [] diff --git a/tasks/galera/bootstrap.yml b/tasks/galera/bootstrap.yml new file mode 100644 index 0000000..7204f97 --- /dev/null +++ b/tasks/galera/bootstrap.yml @@ -0,0 +1,23 @@ +--- +- set_fact: + booboo: /var/lib/mysql/.ansible_galera_boostrap + +- name: STAT | Bootstrap mark + stat: path={{ booboo }} + register: s + +- block: + + - name: COMMAND | Stop MariaDB + service: name=mysql state=stopped + + - name: COMMAND | Bootstrap first node + command: galera_new_cluster + register: bootstrap_run + + when: not s.stat.exists + +- name: COMMAND | Create Bootstrap mark + command: "touch {{ booboo }}" + args: + creates: "{{ booboo }}" diff --git a/tasks/galera/main.yml b/tasks/galera/main.yml new file mode 100644 index 0000000..8138554 --- /dev/null +++ b/tasks/galera/main.yml @@ -0,0 +1,19 @@ +--- + +- name: TEMPLATE | Deploy Galera configuration + template: src=etc/mysql/conf.d/09-galera.cnf.j2 dest=/etc/mysql/conf.d/09-galera.cnf + register: galeraconfig + +- name: INCLUDE | Bootstrap first node + include: 'bootstrap.yml' + when: inventory_hostname == mysql_galera_primary_node + +- name: INCLUDE | Configure other nodes + include: 'nodes.yml' + when: inventory_hostname != mysql_galera_primary_node + +- name: SERVICE | Restart MariaDB if needed + service: name=mysql state=restarted + when: > + (galeraconfig or (p is defined and p.changed)) and + (bootstrap_run is not defined) diff --git a/tasks/galera/nodes.yml b/tasks/galera/nodes.yml new file mode 100644 index 0000000..7d43971 --- /dev/null +++ b/tasks/galera/nodes.yml @@ -0,0 +1,29 @@ +--- + +- name: COMMAND | GET debian.cnf from primary node + command: cat /etc/mysql/debian.cnf + register: debiancnf + delegate_to: '{{ mysql_galera_primary_node }}' + +- name: COMMAND | Get current debian.cnf + command: cat /etc/mysql/debian.cnf + register: ondc + +- block: + + - name: SERVICE | Stop MariaDB + service: name=mysql state=stopped + + - name: COPY | Paste primary node's debian.cnf + copy: > + content={{ debiancnf.stdout }} + dest=/etc/mysql/debian.cnf + mode=0600 + owner=root + group=root + register: paste + + - name: SERVICE | Start MariaDB + service: name=mysql state=started + + when: debiancnf.stdout != ondc.stdout diff --git a/tasks/main.yml b/tasks/main.yml index 4243a54..5e5e00d 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -16,20 +16,19 @@ template: src=etc/mysql/conf.d/10-extra.cnf.j2 dest=/etc/mysql/conf.d/10-extra.cnf register: extraconfig -- name: TEMPLATE | Deploy Galera configuration - template: src=etc/mysql/conf.d/09-galera.cnf.j2 dest=/etc/mysql/conf.d/09-galera.cnf - register: galeraconfig - - name: SERVICE | Restart now (prevent bugs) service: name=mysql state=restarted when: > config.changed or - extraconfig.changed or - (galeraconfig is defined and galeraconfig.changed) + extraconfig.changed - name: TEMPLATE Create .my.cnf for root template: src=root/my.cnf dest=/root/.my.cnf owner=root group=root mode=0600 backup=yes +- name: INCLUDE | Galera + include: galera/main.yml + when: mysql_vendor == 'mariadb_galera' + - name: INCLUDE | Replication include: replication/main.yml when: mysql_replication_master or mysql_replication_slave @@ -49,4 +48,3 @@ host="{{ item.host | default('localhost') }}" state=present with_items: "{{ mysql_users }}" - diff --git a/templates/etc/mysql/conf.d/09-galera.cnf.j2 b/templates/etc/mysql/conf.d/09-galera.cnf.j2 index b31e03d..2991ad3 100644 --- a/templates/etc/mysql/conf.d/09-galera.cnf.j2 +++ b/templates/etc/mysql/conf.d/09-galera.cnf.j2 @@ -4,16 +4,26 @@ [mysqld] +# -------------------- # Galera config +# -------------------- +# Global wsrep_on=ON -# TODO: wsrep_cluster_address=gcomm://cluster01,cluster02,cluster03 -wsrep_cluster_address=gcomm://127.0.0.1 +wsrep_provider=/usr/lib/galera/libgalera_smm.so +wsrep_cluster_address=gcomm://{{ mariadb_galera_members | join(",") }} # TODO: https://mariadb.com/kb/en/mariadb/galera-cluster-system-variables/#wsrep_sst_method wsrep_sst_method=rsync # TODO: wsrep_cluster_name="my_wsrep_cluster" +# Node Configuration +wsrep_node_address="{{ mysql_wsrep_node_address | default(ansible_eth0.ipv4.address) }}" +wsrep_node_name="{{ mysql_wsrep_node_name | default(ansible_fqdn) }}" + + +# -------------------- # Deps +# -------------------- binlog_format=ROW default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 diff --git a/tests/gen.pl b/tests/gen.pl index 96440b8..d19840b 100755 --- a/tests/gen.pl +++ b/tests/gen.pl @@ -24,7 +24,8 @@ my @a = ( my $start_ip = '192.168.200.10'; my $iip = ip2long($start_ip); -my $tmp_ip = 0; + +my @galera = (); foreach my $n (@a) { @@ -40,27 +41,40 @@ foreach my $n (@a) if($data[-1] eq 'slave') { open(FILE, '>', "host_vars/$n"); - printf FILE (qq/his_master: '%s'\n/, $tmp_ip); + printf FILE (qq/his_master: '%s'\n/, long2ip($iip)); close(FILE); } - if($data[-1] =~ /^\d$/ && $data[-2] eq 'mariadbgalera') +# if($data[-1] =~ /^\d$/ && $data[-2] eq 'mariadbgalera') +# { +# open(FILE, '>', "host_vars/$n"); +# printf FILE (qq/galera_id: '%s'\n/, $data[-1]); +# close(FILE); +# } + + if($data[-2] eq 'mariadbgalera') { - open(FILE, '>', "host_vars/$n"); - printf FILE (qq/galera_id: '%s'\n/, $data[-1]); - close(FILE); + push(@galera, long2ip($iip)); + goto SKIP; } open(FILE, '>', "group_vars/" . $data[2]); - my $mv = $data[-2]; - $mv = 'mariadb_galera' if($mv eq 'mariadbgalera'); - printf FILE (qq/mysql_vendor: '%s'\n/, $mv); + printf FILE (qq/mysql_vendor: '%s'\n/, $data[2]); close(FILE); - $tmp_ip = long2ip($iip); + SKIP: $iip++; } +open(FILE, '>', 'group_vars/mariadbgalera'); +say FILE qq/mysql_vendor: 'mariadb_galera'/; +say FILE qq/mariadb_galera_members:/; +foreach(@galera) +{ + say FILE qq/ - '$_'/; +} +close(FILE); + sub ip2long { return unpack("l*", pack("l*", unpack("N*", inet_aton(shift)))); } diff --git a/tests/group_vars/all b/tests/group_vars/all index 5f57ad6..be99ae6 100644 --- a/tests/group_vars/all +++ b/tests/group_vars/all @@ -1,2 +1,2 @@ mysql_use_percona_repository: true -mysql_bind_address: '0.0.0.0' +mysql_bind_address: '{{ ansible_eth1.ipv4.address }}' diff --git a/tests/group_vars/mariadbgalera b/tests/group_vars/mariadbgalera index 6e21163..66d2e95 100644 --- a/tests/group_vars/mariadbgalera +++ b/tests/group_vars/mariadbgalera @@ -1,3 +1,5 @@ mysql_vendor: 'mariadb_galera' -mysql_use_percona_repository: false -mariadb_version: '10.1' +mariadb_galera_members: + - '192.168.200.18' + - '192.168.200.19' + - '192.168.200.20' diff --git a/tests/host_vars/jessie-default-mariadb-slave b/tests/host_vars/jessie-default-mariadb-slave index 812a255..f09b8ac 100644 --- a/tests/host_vars/jessie-default-mariadb-slave +++ b/tests/host_vars/jessie-default-mariadb-slave @@ -1 +1 @@ -his_master: '192.168.200.16' +his_master: '192.168.200.17' diff --git a/tests/host_vars/jessie-default-mysql-slave b/tests/host_vars/jessie-default-mysql-slave index b9a7abf..3f65dca 100644 --- a/tests/host_vars/jessie-default-mysql-slave +++ b/tests/host_vars/jessie-default-mysql-slave @@ -1 +1 @@ -his_master: '192.168.200.10' +his_master: '192.168.200.11' diff --git a/tests/host_vars/jessie-upstream-mariadb-slave b/tests/host_vars/jessie-upstream-mariadb-slave index 5a0ff93..47eee0e 100644 --- a/tests/host_vars/jessie-upstream-mariadb-slave +++ b/tests/host_vars/jessie-upstream-mariadb-slave @@ -1 +1 @@ -his_master: '192.168.200.12' +his_master: '192.168.200.13' diff --git a/tests/host_vars/jessie-upstream-mariadbgalera-1 b/tests/host_vars/jessie-upstream-mariadbgalera-1 deleted file mode 100644 index 3777c41..0000000 --- a/tests/host_vars/jessie-upstream-mariadbgalera-1 +++ /dev/null @@ -1 +0,0 @@ -galera_id: '1' diff --git a/tests/host_vars/jessie-upstream-mariadbgalera-2 b/tests/host_vars/jessie-upstream-mariadbgalera-2 deleted file mode 100644 index e7a5643..0000000 --- a/tests/host_vars/jessie-upstream-mariadbgalera-2 +++ /dev/null @@ -1 +0,0 @@ -galera_id: '2' diff --git a/tests/host_vars/jessie-upstream-mariadbgalera-3 b/tests/host_vars/jessie-upstream-mariadbgalera-3 deleted file mode 100644 index d29e3bd..0000000 --- a/tests/host_vars/jessie-upstream-mariadbgalera-3 +++ /dev/null @@ -1 +0,0 @@ -galera_id: '3' diff --git a/tests/host_vars/jessie-upstream-percona-slave b/tests/host_vars/jessie-upstream-percona-slave index ed31632..a421c89 100644 --- a/tests/host_vars/jessie-upstream-percona-slave +++ b/tests/host_vars/jessie-upstream-percona-slave @@ -1 +1 @@ -his_master: '192.168.200.14' +his_master: '192.168.200.15' diff --git a/tests/test.yml b/tests/test.yml index 81023c7..473f94c 100644 --- a/tests/test.yml +++ b/tests/test.yml @@ -38,6 +38,11 @@ when: c.changed - hosts: mariadbgalera + vars: + mysql_galera_primary_node: 'jessie-upstream-mariadbgalera-1' + mysql_wsrep_node_address: "{{ ansible_eth1.ipv4.address }}" + mysql_use_percona_repository: false + mariadb_version: '10.1' roles: - ../../