From e48202838cfa7eeddb15590cce9f4b7fbaf182c4 Mon Sep 17 00:00:00 2001 From: Andrey Klychkov Date: Mon, 7 Oct 2019 16:23:56 +0300 Subject: [PATCH] mysql_replication: add master_delay parameter (#63130) --- ...replication_add_master_delay_parameter.yml | 2 + .../database/mysql/mysql_replication.py | 17 +++++++ .../mysql_replication/defaults/main.yml | 1 + .../targets/mysql_replication/tasks/main.yml | 6 ++- .../tasks/mysql_replication_master_delay.yml | 44 +++++++++++++++++++ 5 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/63130-mysql_replication_add_master_delay_parameter.yml create mode 100644 test/integration/targets/mysql_replication/tasks/mysql_replication_master_delay.yml diff --git a/changelogs/fragments/63130-mysql_replication_add_master_delay_parameter.yml b/changelogs/fragments/63130-mysql_replication_add_master_delay_parameter.yml new file mode 100644 index 00000000000..093d90ec473 --- /dev/null +++ b/changelogs/fragments/63130-mysql_replication_add_master_delay_parameter.yml @@ -0,0 +1,2 @@ +minor_changes: +- mysql_replication - add ``master_delay`` parameter (https://github.com/ansible/ansible/issues/51326). diff --git a/lib/ansible/modules/database/mysql/mysql_replication.py b/lib/ansible/modules/database/mysql/mysql_replication.py index f6209e0f5a3..5f724703314 100644 --- a/lib/ansible/modules/database/mysql/mysql_replication.py +++ b/lib/ansible/modules/database/mysql/mysql_replication.py @@ -113,6 +113,13 @@ options: choices: [current_pos, slave_pos, disabled] type: str version_added: "2.10" + master_delay: + description: + - Time lag behind the master's state (in seconds). + - Available from MySQL 5.6. + - For more information see U(https://dev.mysql.com/doc/refman/8.0/en/replication-delayed.html). + type: int + version_added: "2.10" extends_documentation_fragment: - mysql @@ -144,6 +151,12 @@ EXAMPLES = r''' mysql_replication: mode: changemaster master_use_gtid: current_pos + +- name: Change master to use replication delay 3600 seconds + mysql_replication: + mode: changemaster + master_host: 192.0.2.1 + master_delay: 3600 ''' RETURN = r''' @@ -259,6 +272,7 @@ def main(): client_key=dict(type='path', aliases=['ssl_key']), ca_cert=dict(type='path', aliases=['ssl_ca']), master_use_gtid=dict(type='str', choices=['current_pos', 'slave_pos', 'disabled']), + master_delay=dict(type='int'), ) ) mode = module.params["mode"] @@ -283,6 +297,7 @@ def main(): ssl_ca = module.params["ca_cert"] connect_timeout = module.params['connect_timeout'] config_file = module.params['config_file'] + master_delay = module.params['master_delay'] if module.params.get("master_use_gtid") == 'disabled': master_use_gtid = 'no' else: @@ -340,6 +355,8 @@ def main(): chm.append("MASTER_LOG_FILE='%s'" % master_log_file) if master_log_pos is not None: chm.append("MASTER_LOG_POS=%s" % master_log_pos) + if master_delay: + chm.append("MASTER_DELAY=%s" % master_delay) if relay_log_file: chm.append("RELAY_LOG_FILE='%s'" % relay_log_file) if relay_log_pos is not None: diff --git a/test/integration/targets/mysql_replication/defaults/main.yml b/test/integration/targets/mysql_replication/defaults/main.yml index cc1c9f1cb03..d377f51aaaf 100644 --- a/test/integration/targets/mysql_replication/defaults/main.yml +++ b/test/integration/targets/mysql_replication/defaults/main.yml @@ -2,6 +2,7 @@ master_port: 3306 standby_port: 3307 test_db: test_db test_table: test_table +test_master_delay: 60 replication_user: replication_user replication_pass: replication_pass dump_path: /tmp/dump.sql diff --git a/test/integration/targets/mysql_replication/tasks/main.yml b/test/integration/targets/mysql_replication/tasks/main.yml index 1a0d17ec1b6..b7c6086df25 100644 --- a/test/integration/targets/mysql_replication/tasks/main.yml +++ b/test/integration/targets/mysql_replication/tasks/main.yml @@ -1,6 +1,10 @@ # Copyright: (c) 2019, Andrew Klychkov (@Andersson007) # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) -# Initial CI tests of mysql_replication module +# Initial CI tests of mysql_replication module: - import_tasks: mysql_replication_initial.yml when: ansible_distribution == 'CentOS' and ansible_distribution_major_version >= '7' + +# Tests of master_delay parameter: +- import_tasks: mysql_replication_master_delay.yml + when: ansible_distribution == 'CentOS' and ansible_distribution_major_version >= '7' diff --git a/test/integration/targets/mysql_replication/tasks/mysql_replication_master_delay.yml b/test/integration/targets/mysql_replication/tasks/mysql_replication_master_delay.yml new file mode 100644 index 00000000000..c6b329283c7 --- /dev/null +++ b/test/integration/targets/mysql_replication/tasks/mysql_replication_master_delay.yml @@ -0,0 +1,44 @@ +# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +# Test master_delay mode: +- name: Run replication + mysql_replication: + login_host: 127.0.0.1 + login_port: "{{ standby_port }}" + mode: changemaster + master_delay: '{{ test_master_delay }}' + register: result + +- assert: + that: + - result is changed + - result.queries == ["CHANGE MASTER TO MASTER_DELAY=60"] + +# Auxiliary step: +- name: Start slave + mysql_replication: + login_host: 127.0.0.1 + login_port: "{{ standby_port }}" + mode: startslave + register: result + +# Check master_delay: +- name: Get standby status + mysql_replication: + login_host: 127.0.0.1 + login_port: "{{ standby_port }}" + mode: getslave + register: slave_status + +- assert: + that: + - slave_status.SQL_Delay == {{ test_master_delay }} + - slave_status is not changed + +# Stop standby for further tests: +- name: Stop slave + mysql_replication: + login_host: 127.0.0.1 + login_port: "{{ standby_port }}" + mode: stopslave