mirror of
https://github.com/ansible-collections/community.mysql.git
synced 2025-04-05 02:00:31 -07:00
Fix Instruqt Track issues
This commit is contained in:
parent
f1840a82ee
commit
b92219e06f
2 changed files with 339 additions and 215 deletions
|
@ -15,7 +15,7 @@ DOCUMENTATION = r'''
|
|||
module: mysql_replication
|
||||
short_description: Manage MySQL replication
|
||||
description:
|
||||
- Manages MySQL server replication, slave, master status, get and change master host.
|
||||
- Manages MySQL server replication, replica, primary status, get and change primary host.
|
||||
author:
|
||||
- Balazs Pocze (@banyek)
|
||||
- Andrew Klychkov (@Andersson007)
|
||||
|
@ -23,53 +23,68 @@ options:
|
|||
mode:
|
||||
description:
|
||||
- Module operating mode. Could be
|
||||
C(changemaster) (CHANGE MASTER TO),
|
||||
C(getmaster) (SHOW MASTER STATUS),
|
||||
C(getslave) (SHOW SLAVE STATUS),
|
||||
C(startslave) (START SLAVE),
|
||||
C(stopslave) (STOP SLAVE),
|
||||
C(resetmaster) (RESET MASTER) - supported since community.mysql 0.1.0,
|
||||
C(resetslave) (RESET SLAVE),
|
||||
C(resetslaveall) (RESET SLAVE ALL).
|
||||
C(changeprimary | changemaster) (CHANGE PRIMARY | MASTER TO),
|
||||
C(getprimary | getmaster) (SHOW PRIMARY | MASTER STATUS),
|
||||
C(getreplica | getslave) (SHOW REPLICA | SLAVE STATUS),
|
||||
C(startreplica | startslave) (START REPLICA | SLAVE),
|
||||
C(stopreplica | stopslave) (STOP REPLICA | SLAVE),
|
||||
C(resetprimary | resetmaster) (RESET PRIMARY | MASTER) - supported since community.mysql 0.1.0,
|
||||
C(resetreplica, resetslave) (RESET REPLICA | SLAVE),
|
||||
C(resetreplicaall, resetslave) (RESET REPLICA | SLAVE ALL).
|
||||
type: str
|
||||
choices:
|
||||
- changeprimary
|
||||
- changemaster
|
||||
- getprimary
|
||||
- getmaster
|
||||
- getreplica
|
||||
- getslave
|
||||
- startreplica
|
||||
- startslave
|
||||
- stopreplica
|
||||
- stopslave
|
||||
- resetprimary
|
||||
- resetmaster
|
||||
- resetreplica
|
||||
- resetslave
|
||||
- resetreplicaall
|
||||
- resetslaveall
|
||||
default: getslave
|
||||
master_host:
|
||||
default: getreplica
|
||||
primary_host:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_HOST) mysql variable.
|
||||
type: str
|
||||
master_user:
|
||||
aliases: [master_host]
|
||||
primary_user:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_USER) mysql variable.
|
||||
type: str
|
||||
master_password:
|
||||
aliases: [master_user]
|
||||
primary_password:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_PASSWORD) mysql variable.
|
||||
type: str
|
||||
master_port:
|
||||
aliases: [master_password]
|
||||
primary_port:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_PORT) mysql variable.
|
||||
type: int
|
||||
master_connect_retry:
|
||||
aliases: [master_port]
|
||||
primary_connect_retry:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_CONNECT_RETRY) mysql variable.
|
||||
type: int
|
||||
master_log_file:
|
||||
aliases: [master_connect_retry]
|
||||
primary_log_file:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_LOG_FILE) mysql variable.
|
||||
type: str
|
||||
master_log_pos:
|
||||
aliases: [master_log_file]
|
||||
primary_log_pos:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_LOG_POS) mysql variable.
|
||||
type: int
|
||||
aliases: [master_log_pos]
|
||||
relay_log_file:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
|
@ -78,56 +93,84 @@ options:
|
|||
description:
|
||||
- Same as mysql variable.
|
||||
type: int
|
||||
master_ssl:
|
||||
primary_ssl:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_SSL) mysql variable.
|
||||
- When setting it to C(yes), the connection attempt only succeeds
|
||||
if an encrypted connection can be established.
|
||||
- For details, refer to
|
||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||
type: bool
|
||||
default: false
|
||||
master_ssl_ca:
|
||||
aliases: [master_ssl]
|
||||
primary_ssl_ca:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_SSL_CA) mysql variable.
|
||||
- For details, refer to
|
||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||
type: str
|
||||
master_ssl_capath:
|
||||
aliases: [master_ssl_ca]
|
||||
primary_ssl_capath:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_SSL_CAPATH) mysql variable.
|
||||
- For details, refer to
|
||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||
type: str
|
||||
master_ssl_cert:
|
||||
aliases: [master_ssl_capath]
|
||||
primary_ssl_cert:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_SSL_CERT) mysql variable.
|
||||
- For details, refer to
|
||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||
type: str
|
||||
master_ssl_key:
|
||||
aliases: [master_ssl_cert]
|
||||
primary_ssl_key:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_SSL_KEY) mysql variable.
|
||||
- For details, refer to
|
||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||
type: str
|
||||
master_ssl_cipher:
|
||||
aliases: [master_ssl_key]
|
||||
primary_ssl_cipher:
|
||||
description:
|
||||
- Same as mysql variable.
|
||||
- Same as the C(MASTER_SSL_CIPHER) mysql variable.
|
||||
- Specifies a colon-separated list of one or more ciphers permitted by the replica for the replication connection.
|
||||
- For details, refer to
|
||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||
type: str
|
||||
master_auto_position:
|
||||
aliases: [master_ssl_cipher]
|
||||
primary_auto_position:
|
||||
description:
|
||||
- Whether the host uses GTID based replication or not.
|
||||
- Same as the C(MASTER_AUTO_POSITION) mysql variable.
|
||||
type: bool
|
||||
default: false
|
||||
master_use_gtid:
|
||||
aliases: [master_auto_position]
|
||||
primary_use_gtid:
|
||||
description:
|
||||
- Configures the slave to use the MariaDB Global Transaction ID.
|
||||
- Configures the replica to use the MariaDB Global Transaction ID.
|
||||
- C(disabled) equals MASTER_USE_GTID=no command.
|
||||
- To find information about available values see
|
||||
U(https://mariadb.com/kb/en/library/change-master-to/#master_use_gtid).
|
||||
- Available since MariaDB 10.0.2.
|
||||
choices: [current_pos, slave_pos, disabled]
|
||||
- C(replica_pos) has been introduced in MariaDB 10.5.1 and
|
||||
it is an alias for C(slave_pos).
|
||||
choices: [current_pos, replica_pos, slave_pos, disabled]
|
||||
type: str
|
||||
version_added: '0.1.0'
|
||||
master_delay:
|
||||
aliases: [master_use_gtid]
|
||||
primary_delay:
|
||||
description:
|
||||
- Time lag behind the master's state (in seconds).
|
||||
- Time lag behind the primary's state (in seconds).
|
||||
- Same as the C(MASTER_DELAY) mysql variable.
|
||||
- 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: '0.1.0'
|
||||
aliases: [master_delay]
|
||||
connection_name:
|
||||
description:
|
||||
- Name of the master connection.
|
||||
- Name of the primary connection.
|
||||
- Supported from MariaDB 10.0.1.
|
||||
- Mutually exclusive with I(channel).
|
||||
- For more information see U(https://mariadb.com/kb/en/library/multi-source-replication/).
|
||||
|
@ -160,69 +203,72 @@ seealso:
|
|||
- name: MySQL replication reference
|
||||
description: Complete reference of the MySQL replication documentation.
|
||||
link: https://dev.mysql.com/doc/refman/8.0/en/replication.html
|
||||
- name: MySQL encrypted replication reference.
|
||||
description: Setting up MySQL replication to use encrypted connection.
|
||||
link: https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html
|
||||
- name: MariaDB replication reference
|
||||
description: Complete reference of the MariaDB replication documentation.
|
||||
link: https://mariadb.com/kb/en/library/setting-up-replication/
|
||||
'''
|
||||
|
||||
EXAMPLES = r'''
|
||||
- name: Stop mysql slave thread
|
||||
- name: Stop mysql replica thread
|
||||
community.mysql.mysql_replication:
|
||||
mode: stopslave
|
||||
mode: stopreplica
|
||||
|
||||
- name: Get master binlog file name and binlog position
|
||||
- name: Get primary binlog file name and binlog position
|
||||
community.mysql.mysql_replication:
|
||||
mode: getmaster
|
||||
mode: getprimary
|
||||
|
||||
- name: Change master to master server 192.0.2.1 and use binary log 'mysql-bin.000009' with position 4578
|
||||
- name: Change primary to primary server 192.0.2.1 and use binary log 'mysql-bin.000009' with position 4578
|
||||
community.mysql.mysql_replication:
|
||||
mode: changemaster
|
||||
master_host: 192.0.2.1
|
||||
master_log_file: mysql-bin.000009
|
||||
master_log_pos: 4578
|
||||
mode: changeprimary
|
||||
primary_host: 192.0.2.1
|
||||
primary_log_file: mysql-bin.000009
|
||||
primary_log_pos: 4578
|
||||
|
||||
- name: Check slave status using port 3308
|
||||
- name: Check replica status using port 3308
|
||||
community.mysql.mysql_replication:
|
||||
mode: getslave
|
||||
mode: getreplica
|
||||
login_host: ansible.example.com
|
||||
login_port: 3308
|
||||
|
||||
- name: On MariaDB change master to use GTID current_pos
|
||||
- name: On MariaDB change primary to use GTID current_pos
|
||||
community.mysql.mysql_replication:
|
||||
mode: changemaster
|
||||
master_use_gtid: current_pos
|
||||
mode: changeprimary
|
||||
primary_use_gtid: current_pos
|
||||
|
||||
- name: Change master to use replication delay 3600 seconds
|
||||
- name: Change primary to use replication delay 3600 seconds
|
||||
community.mysql.mysql_replication:
|
||||
mode: changemaster
|
||||
master_host: 192.0.2.1
|
||||
master_delay: 3600
|
||||
mode: changeprimary
|
||||
primary_host: 192.0.2.1
|
||||
primary_delay: 3600
|
||||
|
||||
- name: Start MariaDB standby with connection name master-1
|
||||
- name: Start MariaDB replica with connection name primary-1
|
||||
community.mysql.mysql_replication:
|
||||
mode: startslave
|
||||
connection_name: master-1
|
||||
mode: startreplica
|
||||
connection_name: primary-1
|
||||
|
||||
- name: Stop replication in channel master-1
|
||||
- name: Stop replication in channel primary-1
|
||||
community.mysql.mysql_replication:
|
||||
mode: stopslave
|
||||
channel: master-1
|
||||
mode: stopreplica
|
||||
channel: primary-1
|
||||
|
||||
- name: >
|
||||
Run RESET MASTER command which will delete all existing binary log files
|
||||
and reset the binary log index file on the master
|
||||
and reset the binary log index file on the primary
|
||||
community.mysql.mysql_replication:
|
||||
mode: resetmaster
|
||||
mode: resetprimary
|
||||
|
||||
- name: Run start slave and fail the task on errors
|
||||
- name: Run start replica and fail the task on errors
|
||||
community.mysql.mysql_replication:
|
||||
mode: startslave
|
||||
connection_name: master-1
|
||||
mode: startreplica
|
||||
connection_name: primary-1
|
||||
fail_on_error: yes
|
||||
|
||||
- name: Change master and fail on error (like when slave thread is running)
|
||||
- name: Change primary and fail on error (like when replica thread is running)
|
||||
community.mysql.mysql_replication:
|
||||
mode: changemaster
|
||||
mode: changeprimary
|
||||
fail_on_error: yes
|
||||
|
||||
'''
|
||||
|
@ -232,7 +278,7 @@ queries:
|
|||
description: List of executed queries which modified DB's state.
|
||||
returned: always
|
||||
type: list
|
||||
sample: ["CHANGE MASTER TO MASTER_HOST='master2.example.com',MASTER_PORT=3306"]
|
||||
sample: ["CHANGE MASTER TO MASTER_HOST='primary2.example.com',MASTER_PORT=3306"]
|
||||
version_added: '0.1.0'
|
||||
'''
|
||||
|
||||
|
@ -240,37 +286,46 @@ import os
|
|||
import warnings
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible_collections.community.mysql.plugins.module_utils.mysql import mysql_connect, mysql_driver, mysql_driver_fail_msg
|
||||
from ansible_collections.community.mysql.plugins.module_utils.mysql import (
|
||||
mysql_connect,
|
||||
mysql_driver,
|
||||
mysql_driver_fail_msg,
|
||||
mysql_common_argument_spec,
|
||||
)
|
||||
from ansible.module_utils._text import to_native
|
||||
from distutils.version import LooseVersion
|
||||
|
||||
executed_queries = []
|
||||
|
||||
|
||||
def get_master_status(cursor):
|
||||
def get_primary_status(cursor):
|
||||
# TODO: when it's available to change on MySQL's side,
|
||||
# change MASTER to PRIMARY using the approach from
|
||||
# get_replica_status() function. Same for other functions.
|
||||
cursor.execute("SHOW MASTER STATUS")
|
||||
masterstatus = cursor.fetchone()
|
||||
return masterstatus
|
||||
primarystatus = cursor.fetchone()
|
||||
return primarystatus
|
||||
|
||||
|
||||
def get_slave_status(cursor, connection_name='', channel=''):
|
||||
def get_replica_status(cursor, connection_name='', channel='', term='REPLICA'):
|
||||
if connection_name:
|
||||
query = "SHOW SLAVE '%s' STATUS" % connection_name
|
||||
query = "SHOW %s '%s' STATUS" % (term, connection_name)
|
||||
else:
|
||||
query = "SHOW SLAVE STATUS"
|
||||
query = "SHOW %s STATUS" % term
|
||||
|
||||
if channel:
|
||||
query += " FOR CHANNEL '%s'" % channel
|
||||
|
||||
cursor.execute(query)
|
||||
slavestatus = cursor.fetchone()
|
||||
return slavestatus
|
||||
replica_status = cursor.fetchone()
|
||||
return replica_status
|
||||
|
||||
|
||||
def stop_slave(module, cursor, connection_name='', channel='', fail_on_error=False):
|
||||
def stop_replica(module, cursor, connection_name='', channel='', fail_on_error=False, term='REPLICA'):
|
||||
if connection_name:
|
||||
query = "STOP SLAVE '%s'" % connection_name
|
||||
query = "STOP %s '%s'" % (term, connection_name)
|
||||
else:
|
||||
query = 'STOP SLAVE'
|
||||
query = 'STOP %s' % term
|
||||
|
||||
if channel:
|
||||
query += " FOR CHANNEL '%s'" % channel
|
||||
|
@ -283,16 +338,16 @@ def stop_slave(module, cursor, connection_name='', channel='', fail_on_error=Fal
|
|||
stopped = False
|
||||
except Exception as e:
|
||||
if fail_on_error:
|
||||
module.fail_json(msg="STOP SLAVE failed: %s" % to_native(e))
|
||||
module.fail_json(msg="STOP REPLICA failed: %s" % to_native(e))
|
||||
stopped = False
|
||||
return stopped
|
||||
|
||||
|
||||
def reset_slave(module, cursor, connection_name='', channel='', fail_on_error=False):
|
||||
def reset_replica(module, cursor, connection_name='', channel='', fail_on_error=False, term='REPLICA'):
|
||||
if connection_name:
|
||||
query = "RESET SLAVE '%s'" % connection_name
|
||||
query = "RESET %s '%s'" % (term, connection_name)
|
||||
else:
|
||||
query = 'RESET SLAVE'
|
||||
query = 'RESET %s' % term
|
||||
|
||||
if channel:
|
||||
query += " FOR CHANNEL '%s'" % channel
|
||||
|
@ -305,16 +360,16 @@ def reset_slave(module, cursor, connection_name='', channel='', fail_on_error=Fa
|
|||
reset = False
|
||||
except Exception as e:
|
||||
if fail_on_error:
|
||||
module.fail_json(msg="RESET SLAVE failed: %s" % to_native(e))
|
||||
module.fail_json(msg="RESET REPLICA failed: %s" % to_native(e))
|
||||
reset = False
|
||||
return reset
|
||||
|
||||
|
||||
def reset_slave_all(module, cursor, connection_name='', channel='', fail_on_error=False):
|
||||
def reset_replica_all(module, cursor, connection_name='', channel='', fail_on_error=False, term='REPLICA'):
|
||||
if connection_name:
|
||||
query = "RESET SLAVE '%s' ALL" % connection_name
|
||||
query = "RESET %s '%s' ALL" % (term, connection_name)
|
||||
else:
|
||||
query = 'RESET SLAVE ALL'
|
||||
query = 'RESET %s ALL' % term
|
||||
|
||||
if channel:
|
||||
query += " FOR CHANNEL '%s'" % channel
|
||||
|
@ -327,12 +382,12 @@ def reset_slave_all(module, cursor, connection_name='', channel='', fail_on_erro
|
|||
reset = False
|
||||
except Exception as e:
|
||||
if fail_on_error:
|
||||
module.fail_json(msg="RESET SLAVE ALL failed: %s" % to_native(e))
|
||||
module.fail_json(msg="RESET REPLICA ALL failed: %s" % to_native(e))
|
||||
reset = False
|
||||
return reset
|
||||
|
||||
|
||||
def reset_master(module, cursor, fail_on_error=False):
|
||||
def reset_primary(module, cursor, fail_on_error=False):
|
||||
query = 'RESET MASTER'
|
||||
try:
|
||||
executed_queries.append(query)
|
||||
|
@ -347,11 +402,11 @@ def reset_master(module, cursor, fail_on_error=False):
|
|||
return reset
|
||||
|
||||
|
||||
def start_slave(module, cursor, connection_name='', channel='', fail_on_error=False):
|
||||
def start_replica(module, cursor, connection_name='', channel='', fail_on_error=False, term='REPLICA'):
|
||||
if connection_name:
|
||||
query = "START SLAVE '%s'" % connection_name
|
||||
query = "START %s '%s'" % (term, connection_name)
|
||||
else:
|
||||
query = 'START SLAVE'
|
||||
query = 'START %s' % term
|
||||
|
||||
if channel:
|
||||
query += " FOR CHANNEL '%s'" % channel
|
||||
|
@ -364,12 +419,12 @@ def start_slave(module, cursor, connection_name='', channel='', fail_on_error=Fa
|
|||
started = False
|
||||
except Exception as e:
|
||||
if fail_on_error:
|
||||
module.fail_json(msg="START SLAVE failed: %s" % to_native(e))
|
||||
module.fail_json(msg="START REPLICA failed: %s" % to_native(e))
|
||||
started = False
|
||||
return started
|
||||
|
||||
|
||||
def changemaster(cursor, chm, connection_name='', channel=''):
|
||||
def changeprimary(cursor, chm, connection_name='', channel=''):
|
||||
if connection_name:
|
||||
query = "CHANGE MASTER '%s' TO %s" % (connection_name, ','.join(chm))
|
||||
else:
|
||||
|
@ -383,74 +438,74 @@ def changemaster(cursor, chm, connection_name='', channel=''):
|
|||
|
||||
|
||||
def main():
|
||||
argument_spec = mysql_common_argument_spec()
|
||||
argument_spec.update(
|
||||
mode=dict(type='str', default='getreplica', choices=[
|
||||
'getprimary', 'getmaster',
|
||||
'getreplica', 'getslave',
|
||||
'changeprimary', 'changemaster',
|
||||
'stopreplica', 'stopslave',
|
||||
'startreplica', 'startslave',
|
||||
'resetprimary', 'resetmaster',
|
||||
'resetreplica', 'resetslave',
|
||||
'resetreplicaall', 'resetslaveall']),
|
||||
primary_auto_position=dict(type='bool', default=False, aliases=['master_auto_position']),
|
||||
primary_host=dict(type='str', aliases=['master_host']),
|
||||
primary_user=dict(type='str', aliases=['master_user']),
|
||||
primary_password=dict(type='str', no_log=True, aliases=['master_password']),
|
||||
primary_port=dict(type='int', aliases=['master_port']),
|
||||
primary_connect_retry=dict(type='int', aliases=['master_connect_retry']),
|
||||
primary_log_file=dict(type='str', aliases=['master_log_file']),
|
||||
primary_log_pos=dict(type='int', aliases=['master_log_pos']),
|
||||
relay_log_file=dict(type='str'),
|
||||
relay_log_pos=dict(type='int'),
|
||||
primary_ssl=dict(type='bool', default=False, aliases=['master_ssl']),
|
||||
primary_ssl_ca=dict(type='str', aliases=['master_ssl_ca']),
|
||||
primary_ssl_capath=dict(type='str', aliases=['master_ssl_capath']),
|
||||
primary_ssl_cert=dict(type='str', aliases=['master_ssl_cert']),
|
||||
primary_ssl_key=dict(type='str', no_log=False, aliases=['master_ssl_key']),
|
||||
primary_ssl_cipher=dict(type='str', aliases=['master_ssl_cipher']),
|
||||
primary_use_gtid=dict(type='str', choices=[
|
||||
'current_pos', 'replica_pos', 'slave_pos', 'disabled'], aliases=['master_use_gtid']),
|
||||
primary_delay=dict(type='int', aliases=['master_delay']),
|
||||
connection_name=dict(type='str'),
|
||||
channel=dict(type='str'),
|
||||
fail_on_error=dict(type='bool', default=False),
|
||||
)
|
||||
module = AnsibleModule(
|
||||
argument_spec=dict(
|
||||
login_user=dict(type='str'),
|
||||
login_password=dict(type='str', no_log=True),
|
||||
login_host=dict(type='str', default='localhost'),
|
||||
login_port=dict(type='int', default=3306),
|
||||
login_unix_socket=dict(type='str'),
|
||||
mode=dict(type='str', default='getslave', choices=[
|
||||
'getmaster', 'getslave', 'changemaster', 'stopslave',
|
||||
'startslave', 'resetmaster', 'resetslave', 'resetslaveall']),
|
||||
master_auto_position=dict(type='bool', default=False),
|
||||
master_host=dict(type='str'),
|
||||
master_user=dict(type='str'),
|
||||
master_password=dict(type='str', no_log=True),
|
||||
master_port=dict(type='int'),
|
||||
master_connect_retry=dict(type='int'),
|
||||
master_log_file=dict(type='str'),
|
||||
master_log_pos=dict(type='int'),
|
||||
relay_log_file=dict(type='str'),
|
||||
relay_log_pos=dict(type='int'),
|
||||
master_ssl=dict(type='bool', default=False),
|
||||
master_ssl_ca=dict(type='str'),
|
||||
master_ssl_capath=dict(type='str'),
|
||||
master_ssl_cert=dict(type='str'),
|
||||
master_ssl_key=dict(type='str'),
|
||||
master_ssl_cipher=dict(type='str'),
|
||||
connect_timeout=dict(type='int', default=30),
|
||||
config_file=dict(type='path', default='~/.my.cnf'),
|
||||
client_cert=dict(type='path', aliases=['ssl_cert']),
|
||||
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'),
|
||||
connection_name=dict(type='str'),
|
||||
channel=dict(type='str'),
|
||||
fail_on_error=dict(type='bool', default=False),
|
||||
),
|
||||
argument_spec=argument_spec,
|
||||
mutually_exclusive=[
|
||||
['connection_name', 'channel']
|
||||
],
|
||||
)
|
||||
mode = module.params["mode"]
|
||||
master_host = module.params["master_host"]
|
||||
master_user = module.params["master_user"]
|
||||
master_password = module.params["master_password"]
|
||||
master_port = module.params["master_port"]
|
||||
master_connect_retry = module.params["master_connect_retry"]
|
||||
master_log_file = module.params["master_log_file"]
|
||||
master_log_pos = module.params["master_log_pos"]
|
||||
primary_host = module.params["primary_host"]
|
||||
primary_user = module.params["primary_user"]
|
||||
primary_password = module.params["primary_password"]
|
||||
primary_port = module.params["primary_port"]
|
||||
primary_connect_retry = module.params["primary_connect_retry"]
|
||||
primary_log_file = module.params["primary_log_file"]
|
||||
primary_log_pos = module.params["primary_log_pos"]
|
||||
relay_log_file = module.params["relay_log_file"]
|
||||
relay_log_pos = module.params["relay_log_pos"]
|
||||
master_ssl = module.params["master_ssl"]
|
||||
master_ssl_ca = module.params["master_ssl_ca"]
|
||||
master_ssl_capath = module.params["master_ssl_capath"]
|
||||
master_ssl_cert = module.params["master_ssl_cert"]
|
||||
master_ssl_key = module.params["master_ssl_key"]
|
||||
master_ssl_cipher = module.params["master_ssl_cipher"]
|
||||
master_auto_position = module.params["master_auto_position"]
|
||||
primary_ssl = module.params["primary_ssl"]
|
||||
primary_ssl_ca = module.params["primary_ssl_ca"]
|
||||
primary_ssl_capath = module.params["primary_ssl_capath"]
|
||||
primary_ssl_cert = module.params["primary_ssl_cert"]
|
||||
primary_ssl_key = module.params["primary_ssl_key"]
|
||||
primary_ssl_cipher = module.params["primary_ssl_cipher"]
|
||||
primary_auto_position = module.params["primary_auto_position"]
|
||||
ssl_cert = module.params["client_cert"]
|
||||
ssl_key = module.params["client_key"]
|
||||
ssl_ca = module.params["ca_cert"]
|
||||
check_hostname = module.params["check_hostname"]
|
||||
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'
|
||||
primary_delay = module.params['primary_delay']
|
||||
if module.params.get("primary_use_gtid") == 'disabled':
|
||||
primary_use_gtid = 'no'
|
||||
else:
|
||||
master_use_gtid = module.params["master_use_gtid"]
|
||||
primary_use_gtid = module.params["primary_use_gtid"]
|
||||
connection_name = module.params["connection_name"]
|
||||
channel = module.params['channel']
|
||||
fail_on_error = module.params['fail_on_error']
|
||||
|
@ -466,107 +521,177 @@ def main():
|
|||
try:
|
||||
cursor, db_conn = mysql_connect(module, login_user, login_password, config_file,
|
||||
ssl_cert, ssl_key, ssl_ca, None, cursor_class='DictCursor',
|
||||
connect_timeout=connect_timeout)
|
||||
connect_timeout=connect_timeout, check_hostname=check_hostname)
|
||||
except Exception as e:
|
||||
if os.path.exists(config_file):
|
||||
module.fail_json(msg="unable to connect to database, check login_user and login_password are correct or %s has the credentials. "
|
||||
module.fail_json(msg="unable to connect to database, check login_user and "
|
||||
"login_password are correct or %s has the credentials. "
|
||||
"Exception message: %s" % (config_file, to_native(e)))
|
||||
else:
|
||||
module.fail_json(msg="unable to find %s. Exception message: %s" % (config_file, to_native(e)))
|
||||
|
||||
if mode in "getmaster":
|
||||
status = get_master_status(cursor)
|
||||
cursor.execute("SELECT VERSION()")
|
||||
if 'mariadb' in cursor.fetchone()["VERSION()"].lower():
|
||||
from ansible_collections.community.mysql.plugins.module_utils.implementations.mariadb import replication as impl
|
||||
else:
|
||||
from ansible_collections.community.mysql.plugins.module_utils.implementations.mysql import replication as impl
|
||||
|
||||
# Since MySQL 8.0.22 and MariaDB 10.5.1,
|
||||
# "REPLICA" must be used instead of "SLAVE"
|
||||
if impl.uses_replica_terminology(cursor):
|
||||
replica_term = 'REPLICA'
|
||||
if primary_use_gtid == 'slave_pos':
|
||||
module.deprecate('primary_use_gtid | master_use_gtid "slave_pos" value is '
|
||||
'deprecated, use "replica_pos" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
primary_use_gtid = 'replica_pos'
|
||||
else:
|
||||
replica_term = 'SLAVE'
|
||||
if primary_use_gtid == 'replica_pos':
|
||||
primary_use_gtid = 'slave_pos'
|
||||
|
||||
if mode in ('getprimary', 'getmaster'):
|
||||
if mode == 'getmaster':
|
||||
module.deprecate('"getmaster" option is deprecated, use "getprimary" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
|
||||
status = get_primary_status(cursor)
|
||||
if not isinstance(status, dict):
|
||||
status = dict(Is_Master=False, msg="Server is not configured as mysql master")
|
||||
# TODO: change the word master to primary in 3.0.0
|
||||
status = dict(Is_Master=False, Is_Primary=False,
|
||||
msg="Server is not configured as mysql master")
|
||||
else:
|
||||
status['Is_Master'] = True
|
||||
status['Is_Primary'] = True
|
||||
|
||||
module.deprecate('"Is_Master" and "Is_Slave" return values are deprecated '
|
||||
'and will be replaced with "Is_Primary" and "Is_Replica" '
|
||||
'in the next major release. Use "Is_Primary" and "Is_Replica" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
|
||||
module.exit_json(queries=executed_queries, **status)
|
||||
|
||||
elif mode in "getslave":
|
||||
status = get_slave_status(cursor, connection_name, channel)
|
||||
elif mode in ("getreplica", "getslave"):
|
||||
if mode == "getslave":
|
||||
module.deprecate('"getslave" option is deprecated, use "getreplica" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
|
||||
status = get_replica_status(cursor, connection_name, channel, replica_term)
|
||||
if not isinstance(status, dict):
|
||||
status = dict(Is_Slave=False, msg="Server is not configured as mysql slave")
|
||||
status = dict(Is_Slave=False, Is_Replica=False, msg="Server is not configured as mysql replica")
|
||||
else:
|
||||
status['Is_Slave'] = True
|
||||
status['Is_Replica'] = True
|
||||
|
||||
module.deprecate('"Is_Master" and "Is_Slave" return values are deprecated '
|
||||
'and will be replaced with "Is_Primary" and "Is_Replica" '
|
||||
'in the next major release. Use "Is_Primary" and "Is_Replica" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
|
||||
module.exit_json(queries=executed_queries, **status)
|
||||
|
||||
elif mode in "changemaster":
|
||||
elif mode in ('changeprimary', 'changemaster'):
|
||||
if mode == 'changemaster':
|
||||
module.deprecate('"changemaster" option is deprecated, use "changeprimary" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
chm = []
|
||||
result = {}
|
||||
if master_host is not None:
|
||||
chm.append("MASTER_HOST='%s'" % master_host)
|
||||
if master_user is not None:
|
||||
chm.append("MASTER_USER='%s'" % master_user)
|
||||
if master_password is not None:
|
||||
chm.append("MASTER_PASSWORD='%s'" % master_password)
|
||||
if master_port is not None:
|
||||
chm.append("MASTER_PORT=%s" % master_port)
|
||||
if master_connect_retry is not None:
|
||||
chm.append("MASTER_CONNECT_RETRY=%s" % master_connect_retry)
|
||||
if master_log_file is not None:
|
||||
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 is not None:
|
||||
chm.append("MASTER_DELAY=%s" % master_delay)
|
||||
if primary_host is not None:
|
||||
chm.append("MASTER_HOST='%s'" % primary_host)
|
||||
if primary_user is not None:
|
||||
chm.append("MASTER_USER='%s'" % primary_user)
|
||||
if primary_password is not None:
|
||||
chm.append("MASTER_PASSWORD='%s'" % primary_password)
|
||||
if primary_port is not None:
|
||||
chm.append("MASTER_PORT=%s" % primary_port)
|
||||
if primary_connect_retry is not None:
|
||||
chm.append("MASTER_CONNECT_RETRY=%s" % primary_connect_retry)
|
||||
if primary_log_file is not None:
|
||||
chm.append("MASTER_LOG_FILE='%s'" % primary_log_file)
|
||||
if primary_log_pos is not None:
|
||||
chm.append("MASTER_LOG_POS=%s" % primary_log_pos)
|
||||
if primary_delay is not None:
|
||||
chm.append("MASTER_DELAY=%s" % primary_delay)
|
||||
if relay_log_file is not None:
|
||||
chm.append("RELAY_LOG_FILE='%s'" % relay_log_file)
|
||||
if relay_log_pos is not None:
|
||||
chm.append("RELAY_LOG_POS=%s" % relay_log_pos)
|
||||
if master_ssl:
|
||||
if primary_ssl:
|
||||
chm.append("MASTER_SSL=1")
|
||||
if master_ssl_ca is not None:
|
||||
chm.append("MASTER_SSL_CA='%s'" % master_ssl_ca)
|
||||
if master_ssl_capath is not None:
|
||||
chm.append("MASTER_SSL_CAPATH='%s'" % master_ssl_capath)
|
||||
if master_ssl_cert is not None:
|
||||
chm.append("MASTER_SSL_CERT='%s'" % master_ssl_cert)
|
||||
if master_ssl_key is not None:
|
||||
chm.append("MASTER_SSL_KEY='%s'" % master_ssl_key)
|
||||
if master_ssl_cipher is not None:
|
||||
chm.append("MASTER_SSL_CIPHER='%s'" % master_ssl_cipher)
|
||||
if master_auto_position:
|
||||
if primary_ssl_ca is not None:
|
||||
chm.append("MASTER_SSL_CA='%s'" % primary_ssl_ca)
|
||||
if primary_ssl_capath is not None:
|
||||
chm.append("MASTER_SSL_CAPATH='%s'" % primary_ssl_capath)
|
||||
if primary_ssl_cert is not None:
|
||||
chm.append("MASTER_SSL_CERT='%s'" % primary_ssl_cert)
|
||||
if primary_ssl_key is not None:
|
||||
chm.append("MASTER_SSL_KEY='%s'" % primary_ssl_key)
|
||||
if primary_ssl_cipher is not None:
|
||||
chm.append("MASTER_SSL_CIPHER='%s'" % primary_ssl_cipher)
|
||||
if primary_auto_position:
|
||||
chm.append("MASTER_AUTO_POSITION=1")
|
||||
if master_use_gtid is not None:
|
||||
chm.append("MASTER_USE_GTID=%s" % master_use_gtid)
|
||||
if primary_use_gtid is not None:
|
||||
chm.append("MASTER_USE_GTID=%s" % primary_use_gtid)
|
||||
try:
|
||||
changemaster(cursor, chm, connection_name, channel)
|
||||
changeprimary(cursor, chm, connection_name, channel)
|
||||
except mysql_driver.Warning as e:
|
||||
result['warning'] = to_native(e)
|
||||
except Exception as e:
|
||||
module.fail_json(msg='%s. Query == CHANGE MASTER TO %s' % (to_native(e), chm))
|
||||
result['changed'] = True
|
||||
module.exit_json(queries=executed_queries, **result)
|
||||
elif mode in "startslave":
|
||||
started = start_slave(module, cursor, connection_name, channel, fail_on_error)
|
||||
elif mode in ("startreplica", "startslave"):
|
||||
if mode == "startslave":
|
||||
module.deprecate('"startslave" option is deprecated, use "startreplica" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
|
||||
started = start_replica(module, cursor, connection_name, channel, fail_on_error, replica_term)
|
||||
if started is True:
|
||||
module.exit_json(msg="Slave started ", changed=True, queries=executed_queries)
|
||||
module.exit_json(msg="Replica started ", changed=True, queries=executed_queries)
|
||||
else:
|
||||
module.exit_json(msg="Slave already started (Or cannot be started)", changed=False, queries=executed_queries)
|
||||
elif mode in "stopslave":
|
||||
stopped = stop_slave(module, cursor, connection_name, channel, fail_on_error)
|
||||
module.exit_json(msg="Replica already started (Or cannot be started)", changed=False, queries=executed_queries)
|
||||
elif mode in ("stopreplica", "stopslave"):
|
||||
if mode == "stopslave":
|
||||
module.deprecate('"stopslave" option is deprecated, use "stopreplica" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
|
||||
stopped = stop_replica(module, cursor, connection_name, channel, fail_on_error, replica_term)
|
||||
if stopped is True:
|
||||
module.exit_json(msg="Slave stopped", changed=True, queries=executed_queries)
|
||||
module.exit_json(msg="Replica stopped", changed=True, queries=executed_queries)
|
||||
else:
|
||||
module.exit_json(msg="Slave already stopped", changed=False, queries=executed_queries)
|
||||
elif mode in "resetmaster":
|
||||
reset = reset_master(module, cursor, fail_on_error)
|
||||
module.exit_json(msg="Replica already stopped", changed=False, queries=executed_queries)
|
||||
elif mode in ('resetprimary', 'resetmaster'):
|
||||
if mode == 'resetmaster':
|
||||
module.deprecate('"resetmaster" option is deprecated, use "resetprimary" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
|
||||
reset = reset_primary(module, cursor, fail_on_error)
|
||||
if reset is True:
|
||||
# TODO: Change "Master" to "Primary" in release 3.0.0
|
||||
module.exit_json(msg="Master reset", changed=True, queries=executed_queries)
|
||||
else:
|
||||
# TODO: Change "Master" to "Primary" in release 3.0.0
|
||||
module.exit_json(msg="Master already reset", changed=False, queries=executed_queries)
|
||||
elif mode in "resetslave":
|
||||
reset = reset_slave(module, cursor, connection_name, channel, fail_on_error)
|
||||
elif mode in ("resetreplica", "resetslave"):
|
||||
if mode == "resetslave":
|
||||
module.deprecate('"resetslave" option is deprecated, use "resetreplica" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
|
||||
reset = reset_replica(module, cursor, connection_name, channel, fail_on_error, replica_term)
|
||||
if reset is True:
|
||||
module.exit_json(msg="Slave reset", changed=True, queries=executed_queries)
|
||||
module.exit_json(msg="Replica reset", changed=True, queries=executed_queries)
|
||||
else:
|
||||
module.exit_json(msg="Slave already reset", changed=False, queries=executed_queries)
|
||||
elif mode in "resetslaveall":
|
||||
reset = reset_slave_all(module, cursor, connection_name, channel, fail_on_error)
|
||||
module.exit_json(msg="Replica already reset", changed=False, queries=executed_queries)
|
||||
elif mode in ("resetreplicaall", "resetslaveall"):
|
||||
if mode == "resetslaveall":
|
||||
module.deprecate('"resetslaveall" option is deprecated, use "resetreplicaall" instead.',
|
||||
version='3.0.0', collection_name='community.mysql')
|
||||
|
||||
reset = reset_replica_all(module, cursor, connection_name, channel, fail_on_error, replica_term)
|
||||
if reset is True:
|
||||
module.exit_json(msg="Slave reset", changed=True, queries=executed_queries)
|
||||
module.exit_json(msg="Replica reset", changed=True, queries=executed_queries)
|
||||
else:
|
||||
module.exit_json(msg="Slave already reset", changed=False, queries=executed_queries)
|
||||
module.exit_json(msg="Replica already reset", changed=False, queries=executed_queries)
|
||||
|
||||
warnings.simplefilter("ignore")
|
||||
|
||||
|
|
|
@ -4,5 +4,4 @@ plugins/modules/mysql_db.py validate-modules:use-run-command-not-popen
|
|||
plugins/modules/mysql_info.py validate-modules:doc-elements-mismatch
|
||||
plugins/modules/mysql_info.py validate-modules:parameter-list-no-elements
|
||||
plugins/modules/mysql_query.py validate-modules:parameter-list-no-elements
|
||||
plugins/modules/mysql_user.py validate-modules:undocumented-parameter
|
||||
plugins/modules/mysql_variables.py validate-modules:doc-required-mismatch
|
||||
|
|
Loading…
Add table
Reference in a new issue