From 8a9127efbc1af1479fd8c8cce6dcb03558503f84 Mon Sep 17 00:00:00 2001 From: Andy McCrae Date: Tue, 13 Sep 2016 16:15:03 +0100 Subject: [PATCH] Prevent galera_cluster_name from changing. On a running galera cluster, we don't want to unintentionally allow a galera_cluster_name from changing. This will cause a cluster to fail to start (if the nodes are restarted sequentially) as the cluter name value has changed. To ensure we can still change this value, a new "galera_force_change_cluster_name" variable is added, which can be set to "True" in order to change the cluster name. Change-Id: I8bae038bd207a15d5731b9c91b78df851a4c1986 --- defaults/main.yml | 4 ++++ library/mysql_status_facts | 12 ++++++++---- ...rce-cluster-name-change-b4ce1e225daa840c.yaml | 15 +++++++++++++++ tasks/galera_cluster_state.yml | 16 ++++++++++++++++ 4 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 releasenotes/notes/galera-force-cluster-name-change-b4ce1e225daa840c.yaml diff --git a/defaults/main.yml b/defaults/main.yml index 8e063f91..7a25c2ac 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -25,6 +25,10 @@ galera_upgrade: false galera_wsrep_node_name: "{{ inventory_hostname }}" galera_cluster_name: openstack_galera_cluster +# This variable will prevent the galera_cluster_name from changing unintentionally on a running cluster. +# To intentionally change the galera_cluster_name set this variable to True +galera_force_change_cluster_name: False + # The galera server-id should be set on all cluster nodes to ensure # that replication is handled correctly and the error # "Warning: You should set server-id to a non-0 value if master_host is diff --git a/library/mysql_status_facts b/library/mysql_status_facts index f6458fa7..2c8d18b7 100644 --- a/library/mysql_status_facts +++ b/library/mysql_status_facts @@ -24,9 +24,9 @@ DOCUMENTATION = """ --- module: mysql_status_facts short_description: - - A module for gathering mysql status facts. + - A module for gathering mysql status and global variable facts. description: - - A module for gathering mysql status facts. + - A module for gathering mysql status and global variable facts. author: Rcbops """ @@ -44,13 +44,17 @@ class MysqlStatusFacts(object): def gather_facts(self): """Get information about mysql status.""" try: - output = subprocess.check_output(["mysql", "-e", "show status"], + status = subprocess.check_output(["mysql", "-e", "show status"], stderr=subprocess.STDOUT) + global_vars = subprocess.check_output(["mysql", "-e", + "show global variables"], + stderr=subprocess.STDOUT) except subprocess.CalledProcessError as e: message = 'Mysql fact collection failed: "%s".' % e.output.strip() self.module.fail_json(msg=message) else: - lines = output.split('\n') + lines = status.split('\n') + lines += global_vars.split('\n') facts = dict(l.split('\t') for l in lines if l) self.module.exit_json( changed=self.state_change, diff --git a/releasenotes/notes/galera-force-cluster-name-change-b4ce1e225daa840c.yaml b/releasenotes/notes/galera-force-cluster-name-change-b4ce1e225daa840c.yaml new file mode 100644 index 00000000..6d72cba5 --- /dev/null +++ b/releasenotes/notes/galera-force-cluster-name-change-b4ce1e225daa840c.yaml @@ -0,0 +1,15 @@ +--- +features: + - The ``openstack-ansible-galera_server`` role will now prevent + deployers from changing the ``galera_cluster_name`` variable + on clusters that already have a value set in a running galera + cluster. + You can set the new ``galera_force_change_cluster_name`` + variable to ``True`` to force the ``galera_cluster_name`` + variable to be changed. + We recommend setting this by running the galera-install.yml playbook + with ``-e galera_force_change_cluster_name=True``, to avoid + changing the ``galera_cluster_name`` variable unintentionally. + Use with caution, changing the ``galera_cluster_name`` value + can cause your cluster to fail, as the nodes won't join if restarted + sequentially. diff --git a/tasks/galera_cluster_state.yml b/tasks/galera_cluster_state.yml index 2fb26146..884aea66 100644 --- a/tasks/galera_cluster_state.yml +++ b/tasks/galera_cluster_state.yml @@ -64,6 +64,22 @@ tags: - galera-cluster-state-check +- name: Fail if galera_cluster_name doesnt match file value + fail: + msg: > + "The galera_cluster_name variable does not match what is set in mysql. + Check your galera_cluster_name setting in your user_*.yml files in /etc/openstack_deploy + and compare to the current value in /etc/mysql/conf.d/cluster.cnf on the host, and + the wsrep_cluster_name value set in your running galera cluster. + If you are sure you want to change this variable you can force change your + galera_cluster_name variable by setting 'galera_force_change_cluster_name: True'" + when: + - mysql_running.rc == 0 + - mysql_status['wsrep_cluster_name'] != galera_cluster_name + - not galera_force_change_cluster_name | bool + tags: + - galera-cluster-state-check + - set_fact: galera_existing_cluster: true when: mysql_running.rc == 0