diff --git a/defaults/main.yml b/defaults/main.yml index eef380b9..2035ca1d 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -42,6 +42,8 @@ galera_force_change_cluster_name: False galera_server_distro_package_pins: [] galera_debconf_items: [] galera_server_percona_distro_packages: [] +galera_mariadb_server_package: "{{ _galera_mariadb_server_package }}" +galera_repo_url: "{{ _galera_repo_url }}" galera_existing_cluster: true @@ -101,5 +103,3 @@ galera_debian_cnf_overrides: {} # the cluster will be used which is something to note if deploying galera on different # hardware. # galera_max_connections: 500 - -using_mysql_init: no diff --git a/meta/main.yml b/meta/main.yml index ce8bbdc1..e42487dc 100644 --- a/meta/main.yml +++ b/meta/main.yml @@ -18,7 +18,7 @@ galaxy_info: description: Installation galera server company: Rackspace license: Apache2 - min_ansible_version: 1.9 + min_ansible_version: 2.1 platforms: - name: Ubuntu versions: diff --git a/releasenotes/notes/galera-server-mariadb-10-1-8620e7eadafb6e8f.yaml b/releasenotes/notes/galera-server-mariadb-10-1-8620e7eadafb6e8f.yaml new file mode 100644 index 00000000..891b77c9 --- /dev/null +++ b/releasenotes/notes/galera-server-mariadb-10-1-8620e7eadafb6e8f.yaml @@ -0,0 +1,10 @@ +--- +upgrade: + - The galera_server role now installs MariaDB server version 10.1. + - For systems using the APT package manager, the sources files for + the MariaDB and Percona repos now have consistent names, + 'MariaDB.list' and 'Percona.list'. + - The ``galera_mariadb_apt_server_package`` and ``galera_mariadb_yum_server_package`` + variables have been renamed to ``galera_mariadb_server_package``. + - The ``galera_apt_repo_url`` and ``galera_yum_repo_url`` variables have been renamed + to ``galera_repo_url``. diff --git a/tasks/galera_bootstrap.yml b/tasks/galera_bootstrap.yml index abe523d7..ec4dbc92 100644 --- a/tasks/galera_bootstrap.yml +++ b/tasks/galera_bootstrap.yml @@ -18,27 +18,40 @@ num_retries: 1 wait_delay: 3 +- name: Start galera cluster + command: galera_new_cluster + when: + - ansible_service_mgr == 'systemd' + - inventory_hostname == galera_server_bootstrap_node + - mysql_running.rc != 0 + register: start_cluster + failed_when: false + tags: + - galera-bootstrap + +# TODO: Remove this task after 10.0 is removed from upgrade path +- name: Start cluster with wsrep init fallback + command: "/etc/init.d/mysql bootstrap" + when: + - ansible_service_mgr == 'systemd' + - start_cluster | failed + - inventory_hostname == galera_server_bootstrap_node + - mysql_running.rc != 0 + tags: + - galera-bootstrap + - name: Start cluster with wsrep service: name: mysql state: restarted arguments: "--wsrep-new-cluster" when: - - not using_mysql_init | bool + - ansible_service_mgr != 'systemd' - inventory_hostname == galera_server_bootstrap_node - mysql_running.rc != 0 tags: - galera-bootstrap -- name: Start cluster with wsrep init - command: "/etc/init.d/mysql bootstrap" - when: - - inventory_hostname == galera_server_bootstrap_node - - mysql_running.rc != 0 - - using_mysql_init | bool - tags: - - galera-bootstrap - - name: Wait for operational state command: mysql --silent --skip-column-names -e 'SHOW STATUS LIKE "wsrep_evs_state"' register: galera_check_wait @@ -62,3 +75,8 @@ tags: - galera-operational - galera-bootstrap + +- include: galera_upgrade_post.yml + static: no + when: + - galera_upgrade | bool diff --git a/tasks/galera_install_apt.yml b/tasks/galera_install_apt.yml index d616e4da..0ab916b9 100644 --- a/tasks/galera_install_apt.yml +++ b/tasks/galera_install_apt.yml @@ -58,29 +58,39 @@ tags: - galera-apt-keys +- name: Remove old repos + lineinfile: + dest: "/etc/apt/sources.list.d/{{ item.name }}.list" + regexp: "^((?!{{ item.repo }}).*)$" + state: absent + with_items: + - { name: "MariaDB", repo: "{{ galera_repo.repo }}" } + - { name: "Percona", repo: "{{ galera_percona_xtrabackup_repo.repo }}" } + tags: + - galera-client-repos + - percona-repos + - name: Add galera repo apt_repository: - repo: "{{ item.repo }}" - state: "{{ item.state }}" + repo: "{{ galera_repo.repo }}" + filename: MariaDB + state: "{{ galera_repo.state }}" register: add_repos until: add_repos|success retries: 5 delay: 2 - with_items: - - "{{ galera_repo }}" tags: - galera-repos - name: Add percona repo apt_repository: - repo: "{{ item.repo }}" - state: "{{ item.state }}" + repo: "{{ galera_percona_xtrabackup_repo.repo }}" + filename: Percona + state: "{{ galera_percona_xtrabackup_repo.state }}" register: add_repos until: add_repos|success retries: 5 delay: 2 - with_items: - - "{{ galera_percona_xtrabackup_repo }}" when: use_percona_upstream | bool tags: - percona-repos diff --git a/tasks/galera_install_yum.yml b/tasks/galera_install_yum.yml index 1573c89e..7f827de1 100644 --- a/tasks/galera_install_yum.yml +++ b/tasks/galera_install_yum.yml @@ -54,26 +54,18 @@ tags: - galera-gpg-keys -#TODO(cloudnull) Remove this task once we move to Ansible 2.1 -# where we can leverage the `yum_repository` module: -# https://docs.ansible.com/ansible/yum_repository_module.html - name: Add galera repo - copy: - content: | - [{{ item.name }}] - name={{ item.name }} - description={{ item.description }} - baseurl={{ item.baseurl }} - gpgkey={{ item.gpgkey }} - gpgcheck=1 - enabled=1 - dest: "/etc/yum.repos.d/{{ item.file }}.repo" + yum_repository: + name: "{{ galera_repo.name }}" + description: "{{ galera_repo.description }}" + baseurl: "{{ galera_repo.baseurl }}" + gpgkey: "{{ galera_repo.gpgkey }}" + gpgcheck: yes + enabled: yes register: add_repos until: add_repos|success retries: 5 delay: 2 - with_items: - - "{{ galera_repo }}" tags: - galera-repos diff --git a/tasks/galera_post_install.yml b/tasks/galera_post_install.yml index cbc93db3..ef6aa990 100644 --- a/tasks/galera_post_install.yml +++ b/tasks/galera_post_install.yml @@ -63,20 +63,16 @@ dest: /etc/init.d/mysql state: present insertafter: '^export HOME=/etc/mysql/' - line: '[ -r /etc/default/mysql ] && . /etc/default/mysql' + line: '[ -r /etc/default/mariadb ] && . /etc/default/mariadb' backup: yes tags: - galera-config -# NOTE: (mancdaz) REMOVE "/etc/default/mysql" when running MariaDB 10.1 - name: Apply service defaults template: src: "mysql_defaults.j2" - dest: "{{ item }}" + dest: "/etc/default/mariadb" mode: "0644" - with_items: - - /etc/default/mysql - - /etc/default/mariadb notify: - Restart mysql - Reload the systemd daemon @@ -104,11 +100,14 @@ when: - ansible_service_mgr == 'systemd' -- name: Apply resource limits (systemd) +- name: Apply systemd options template: - src: "systemd.limits.conf.j2" - dest: "/etc/systemd/system/mariadb.service.d/limits.conf" + src: "{{ item.src }}" + dest: "/etc/systemd/system/mariadb.service.d/{{ item.dest }}" mode: "0644" + with_items: + - { src: "systemd.limits.conf.j2", dest: "limits.conf" } + - { src: "systemd.timeout.conf.j2", dest: "timeout.conf" } when: - ansible_service_mgr == 'systemd' notify: @@ -123,8 +122,3 @@ state: absent tags: - galera-config - -- include: galera_upgrade_post.yml - static: no - when: - - galera_upgrade | bool diff --git a/tasks/galera_upgrade_check_apt.yml b/tasks/galera_upgrade_check_apt.yml index bcd3fff6..a03265dc 100644 --- a/tasks/galera_upgrade_check_apt.yml +++ b/tasks/galera_upgrade_check_apt.yml @@ -14,7 +14,7 @@ # limitations under the License. - name: Check major galera install version - command: "dpkg -s {{ galera_mariadb_apt_server_package }}" + command: "dpkg -s {{ galera_mariadb_server_package }}" failed_when: false register: installed_galera_specific when: diff --git a/tasks/galera_upgrade_check_yum.yml b/tasks/galera_upgrade_check_yum.yml index 32d54c3b..f6eed534 100644 --- a/tasks/galera_upgrade_check_yum.yml +++ b/tasks/galera_upgrade_check_yum.yml @@ -14,7 +14,7 @@ # limitations under the License. - name: Check major galera install version - command: "rpm -qi '{{ galera_mariadb_yum_server_package }}'" + command: "rpm -qi '{{ galera_mariadb_server_package }}'" failed_when: false register: installed_galera_specific when: @@ -27,7 +27,7 @@ - name: Check for any galera install version shell: | - rpm -qa | grep -i "{{ galera_mariadb_yum_server_package }}" + rpm -qa | grep -i "{{ galera_mariadb_server_package }}" failed_when: false register: installed_galera_any when: diff --git a/tasks/galera_upgrade_post.yml b/tasks/galera_upgrade_post.yml index e2de350f..a38db7dc 100644 --- a/tasks/galera_upgrade_post.yml +++ b/tasks/galera_upgrade_post.yml @@ -13,22 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -# This is starting MySQL as it may be required to restart the service more than -# once to get it to clean up old service files from the previous version. -# If the service fails to start after 3 attempts the shell command will be failed. - name: Start MySQL - shell: | - for i in {1..3}; do - /etc/init.d/mysql start || true - if pgrep mysqld; then - exit 0 - else - sleep 2 - fi - done - echo "Service failed to start" - exit 1 - changed_when: false + service: + name: mysql + state: started tags: - galera-upgrade diff --git a/tasks/galera_upgrade_pre.yml b/tasks/galera_upgrade_pre.yml index bb75719b..5d02600e 100644 --- a/tasks/galera_upgrade_pre.yml +++ b/tasks/galera_upgrade_pre.yml @@ -30,10 +30,22 @@ tags: - galera-upgrade +# Stop through the init script in case the service +# was initially started outside of systemctl. +- name: Stop mysql + command: /etc/init.d/mysql stop + changed_when: false + tags: + - galera-upgrade + +# TODO: Remove the following three tasks in Pike +# They're only required during upgrades transitioning to a +# statically named apt sources file. - name: Find old sources command: > - grep -rnil maria /etc/apt/sources.list.d/* + grep -rnil maria /etc/apt/sources.list.d/ --exclude MariaDB.list changed_when: false + failed_when: false register: old_sources tags: - galera-upgrade @@ -45,8 +57,8 @@ state: absent with_items: "{{ old_sources.stdout_lines | default([]) }}" tags: - - galera-upgrade - - galera-apt-packages + - galera-upgrade + - galera-apt-packages - name: Update apt sources (Forced) apt: @@ -63,11 +75,15 @@ - galera-apt-packages - name: UN-Install galera-server package - apt: - pkg: "mariadb-galera-server*" + package: + name: "{{ item }}" state: absent - when: - - ansible_pkg_mgr == 'apt' + with_items: + - "mariadb-galera-server*" + - "mariadb-server*" + - MariaDB-Galera-server + - MariaDB-server + - mysql-common tags: - galera-upgrade - galera-apt-packages diff --git a/templates/cluster.cnf.j2 b/templates/cluster.cnf.j2 index 8a2050c3..5cbe29f6 100644 --- a/templates/cluster.cnf.j2 +++ b/templates/cluster.cnf.j2 @@ -1,6 +1,8 @@ # {{ ansible_managed }} [mysqld] +wsrep_on = ON + # Path to Galera library wsrep_provider = /usr/lib/galera/libgalera_smm.so {% if galera_wsrep_provider_options is defined %} diff --git a/templates/mysql_defaults.j2 b/templates/mysql_defaults.j2 index 3483d540..15944312 100644 --- a/templates/mysql_defaults.j2 +++ b/templates/mysql_defaults.j2 @@ -8,7 +8,7 @@ {%- set calculated_min_connections = all_calculated_max_connections | min %} {%- set calculated_max_connections = galera_max_connections | default(calculated_min_connections) %} -# How long to wait for successfull mysql startup +# How long to wait for successful mysql startup # Startup can take a while if it requires a galera state transfer. MYSQLD_STARTUP_TIMEOUT=1800 diff --git a/templates/systemd.timeout.conf.j2 b/templates/systemd.timeout.conf.j2 new file mode 100644 index 00000000..74b9b1bd --- /dev/null +++ b/templates/systemd.timeout.conf.j2 @@ -0,0 +1,6 @@ +# {{ ansible_managed }} + +[Service] +# How long to wait for successful mysql startup +# Startup can take a while if it requires a galera state transfer. +TimeoutStartSec=1800 diff --git a/tests/galera_server-overrides.yml b/tests/galera_server-overrides.yml new file mode 100644 index 00000000..ac3e1902 --- /dev/null +++ b/tests/galera_server-overrides.yml @@ -0,0 +1,22 @@ +--- +# Copyright 2016, Rackspace US, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +galera_server_old_package: + debian: + galera_mariadb_server_package: "mariadb-galera-server-10.0" + galera_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.0/ubuntu" + redhat: + galera_mariadb_server_package: "MariaDB-Galera-server" + galera_repo_url: "http://yum.mariadb.org/10.0/centos/7/x86_64" diff --git a/tests/test.yml b/tests/test.yml index 17c0a43a..106192eb 100644 --- a/tests/test.yml +++ b/tests/test.yml @@ -19,8 +19,19 @@ # Prepare the containers - include: common/test-prepare-containers.yml -# Install Galera server +# Install previous version Galera server - include: common/test-install-galera.yml + vars: + galera_mariadb_server_package: "{{ galera_server_old_package[ansible_os_family | lower]['galera_mariadb_server_package'] }}" + galera_repo_url: "{{ galera_server_old_package[ansible_os_family | lower]['galera_repo_url'] }}" # Run functional tests - include: test-galera-server-functional.yml + +# Install current version Galera server +- include: common/test-install-galera.yml + vars: + galera_upgrade: true + +# Re-run functional tests +- include: test-galera-server-functional.yml diff --git a/vars/redhat-7.yml b/vars/redhat-7.yml index 2f41bb0a..03a18c8f 100644 --- a/vars/redhat-7.yml +++ b/vars/redhat-7.yml @@ -28,24 +28,22 @@ galera_server_required_distro_packages: - MariaDB-client - MariaDB-devel -galera_mariadb_yum_server_package: "MariaDB-Galera-server" +_galera_mariadb_server_package: "MariaDB-server" galera_server_mariadb_distro_packages: - which - - "{{ galera_mariadb_yum_server_package }}" + - "{{ galera_mariadb_server_package }}" - MariaDB-shared - percona-xtrabackup - percona-toolkit - rsync - socat -galera_yum_repo_url: "http://yum.mariadb.org/10.0/centos/7/x86_64" +_galera_repo_url: "http://yum.mariadb.org/10.1/centos/7/x86_64" galera_repo: - state: "present" name: MariaDB description: "MariaDB Repo" - file: MariaDB - baseurl: "{{ galera_yum_repo_url }}" + baseurl: "{{ galera_repo_url }}" gpgkey: "https://yum.mariadb.org/RPM-GPG-KEY-MariaDB" galera_percona_xtrabackup_repo: @@ -79,4 +77,3 @@ qpress_arch_sha256: x86_64: "d6b6b7ca3a5ad4baea34975743106ac54ac746b3e6497d59bce55765d604b697" use_percona_upstream: yes -using_mysql_init: yes diff --git a/vars/ubuntu-14.04.yml b/vars/ubuntu-14.04.yml index 0ad184a0..abb1af43 100644 --- a/vars/ubuntu-14.04.yml +++ b/vars/ubuntu-14.04.yml @@ -44,7 +44,7 @@ galera_server_required_distro_packages: # The package name for mariaDB is set as a variable # so that it can be used in debconf later in the # "galera_common" role. -galera_mariadb_apt_server_package: "mariadb-galera-server-10.0" +_galera_mariadb_server_package: "mariadb-server-10.1" # NB This is specifically galera_server_mariadb_distro_packages as these # packages only get installed during the galera play - this is because of @@ -53,18 +53,18 @@ galera_mariadb_apt_server_package: "mariadb-galera-server-10.0" galera_server_mariadb_distro_packages: - libmariadbclient-dev - mariadb-client - - "{{ galera_mariadb_apt_server_package }}" + - "{{ galera_mariadb_server_package }}" - galera-3 - rsync - socat galera_debconf_items: - question: "mysql-server/root_password" - name: "{{ galera_mariadb_apt_server_package }}" + name: "{{ galera_mariadb_server_package }}" value: "{{ galera_root_password }}" vtype: "string" - question: "mysql-server/root_password_again" - name: "{{ galera_mariadb_apt_server_package }}" + name: "{{ galera_mariadb_server_package }}" value: "{{ galera_root_password }}" vtype: "string" @@ -100,10 +100,9 @@ galera_percona_xtrabackup_repo: repo: "deb {{ galera_percona_xtrabackup_repo_url }} {{ ansible_distribution_release }} main" state: "present" -galera_apt_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.0/ubuntu" +_galera_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.1/ubuntu" galera_repo: - repo: "deb {{ galera_apt_repo_url }} {{ ansible_distribution_release }} main" + repo: "deb {{ galera_repo_url }} {{ ansible_distribution_release }} main" state: "present" use_percona_upstream: no -using_mysql_init: no diff --git a/vars/ubuntu-16.04.yml b/vars/ubuntu-16.04.yml index cfa42ddc..3a71ad5d 100644 --- a/vars/ubuntu-16.04.yml +++ b/vars/ubuntu-16.04.yml @@ -44,7 +44,7 @@ galera_server_required_distro_packages: # The package name for mariaDB is set as a variable # so that it can be used in debconf later in the # "galera_common" role. -galera_mariadb_apt_server_package: "mariadb-galera-server-10.0" +_galera_mariadb_server_package: "mariadb-server-10.1" # NB This is specifically galera_server_mariadb_distro_packages as these # packages only get installed during the galera play - this is because of @@ -53,18 +53,18 @@ galera_mariadb_apt_server_package: "mariadb-galera-server-10.0" galera_server_mariadb_distro_packages: - libmariadbclient-dev - mariadb-client - - "{{ galera_mariadb_apt_server_package }}" + - "{{ galera_mariadb_server_package }}" - galera-3 - rsync - socat galera_debconf_items: - question: "mysql-server/root_password" - name: "{{ galera_mariadb_apt_server_package }}" + name: "{{ galera_mariadb_server_package }}" value: "{{ galera_root_password }}" vtype: "string" - question: "mysql-server/root_password_again" - name: "{{ galera_mariadb_apt_server_package }}" + name: "{{ galera_mariadb_server_package }}" value: "{{ galera_root_password }}" vtype: "string" @@ -99,16 +99,14 @@ qpress_arch_sha256: ppc64le: "a31d3e00dbcec9b3f98eae82b261d054d0b80a57f4a38967d0e953811cb082f3" # Repositories -# TODO: update this to xenial if the repo ever gets created. galera_percona_xtrabackup_repo_url: "http://repo.percona.com/apt" galera_percona_xtrabackup_repo: repo: "deb {{ galera_percona_xtrabackup_repo_url }} {{ ansible_distribution_release }} main" state: "present" -galera_apt_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.0/ubuntu" +_galera_repo_url: "http://mirror.rackspace.com/mariadb/repo/10.1/ubuntu" galera_repo: - repo: "deb {{ galera_apt_repo_url }} {{ ansible_distribution_release }} main" + repo: "deb {{ galera_repo_url }} {{ ansible_distribution_release }} main" state: "present" use_percona_upstream: no -using_mysql_init: yes