mirror of
https://github.com/ansible-collections/community.mysql.git
synced 2025-08-04 05:04:23 -07:00
Compare commits
63 commits
Author | SHA1 | Date | |
---|---|---|---|
|
a4d3246b22 |
||
|
21a5a8bd01 |
||
|
011bdbc2ef |
||
|
3ff1f48c41 |
||
|
3e975ca7a1 |
||
|
54efe0bbb8 |
||
|
62e2ed5d36 |
||
|
8687e575d7 |
||
|
cf25d85e49 |
||
|
cb323da665 |
||
|
963e042edd |
||
|
a026d60f84 |
||
|
43a8037232 |
||
|
43e688a37a |
||
|
878dc5794a |
||
|
85a63511b6 |
||
|
fadbd30572 |
||
|
2020870155 |
||
|
40da237de7 |
||
|
786470058c |
||
|
d363315ecb |
||
|
275d85067a |
||
|
c199000eee |
||
|
108c4ae729 |
||
|
4cfdbe64a3 |
||
|
836a1ce048 |
||
|
41e7ce5aaa |
||
|
99548e10cb |
||
|
6ebf59e234 |
||
|
97be51ef45 |
||
|
d8ab933d79 |
||
|
949cb0c1dd |
||
|
89eb2d2fea |
||
|
4d4a5f2a02 |
||
|
f7677aa05b |
||
|
0921d4eef5 |
||
|
f4736770e3 |
||
|
3bb7b00497 |
||
|
393023eb07 |
||
|
256817ca32 |
||
|
a2a4a1ff61 |
||
|
b730cd6675 |
||
|
2a57a4d659 |
||
|
278337d34f |
||
|
d5a1e3639a |
||
|
bfcf89073a |
||
|
15ee80b57c |
||
|
59d411ac82 |
||
|
b0de252ce2 |
||
|
96a255c00a |
||
|
f46b84e670 |
||
|
9386045797 |
||
|
ace830ef56 |
||
|
e5919428f1 |
||
|
dbcc7e7e60 |
||
|
f49206d3b3 |
||
|
64b06aa543 |
||
|
9c17158802 |
||
|
d200481305 |
||
|
b3a83aa0a3 |
||
|
fe8f3662eb |
||
|
59cbe5ffe3 | ||
|
d517d658a1 |
155 changed files with 3717 additions and 11873 deletions
300
.github/workflows/ansible-test-plugins.yml
vendored
300
.github/workflows/ansible-test-plugins.yml
vendored
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
name: Plugins CI
|
name: Plugins CI
|
||||||
on: # yamllint disable-line rule:truthy
|
on:
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- 'plugins/**'
|
- 'plugins/**'
|
||||||
|
@ -13,21 +13,20 @@ on: # yamllint disable-line rule:truthy
|
||||||
- '.github/workflows/ansible-test-plugins.yml'
|
- '.github/workflows/ansible-test-plugins.yml'
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 6 * * *'
|
- cron: '0 6 * * *'
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
sanity:
|
sanity:
|
||||||
name: "Sanity (Ⓐ${{ matrix.ansible }})"
|
name: "Sanity (Ansible: ${{ matrix.ansible }})"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-20.04
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
ansible:
|
ansible:
|
||||||
- stable-2.17
|
- stable-2.12
|
||||||
- stable-2.18
|
- stable-2.13
|
||||||
- stable-2.19
|
- stable-2.14
|
||||||
- devel
|
- devel
|
||||||
steps:
|
steps:
|
||||||
# https://github.com/ansible-community/ansible-test-gh-action
|
|
||||||
- name: Perform sanity testing
|
- name: Perform sanity testing
|
||||||
uses: ansible-community/ansible-test-gh-action@release/v1
|
uses: ansible-community/ansible-test-gh-action@release/v1
|
||||||
with:
|
with:
|
||||||
|
@ -35,134 +34,162 @@ jobs:
|
||||||
testing-type: sanity
|
testing-type: sanity
|
||||||
pull-request-change-detection: true
|
pull-request-change-detection: true
|
||||||
|
|
||||||
# Use this to chose which version of Python vs Ansible to test:
|
|
||||||
# https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-control-node-python-support
|
|
||||||
integration:
|
integration:
|
||||||
name: "Integration (Ⓐ${{ matrix.ansible }}, DB: ${{ matrix.db_engine_name }} ${{ matrix.db_engine_version }}, connector: ${{ matrix.connector_name }} ${{ matrix.connector_version }})"
|
name: "Integration (Python: ${{ matrix.python }}, Ansible: ${{ matrix.ansible }}, DB: ${{ matrix.db_engine_name }} ${{ matrix.db_engine_version }}, connector: ${{ matrix.connector_name }} ${{ matrix.connector_version }})"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-20.04
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
ansible:
|
ansible:
|
||||||
- stable-2.17
|
- stable-2.12
|
||||||
- stable-2.18
|
- stable-2.13
|
||||||
- stable-2.19
|
- stable-2.14
|
||||||
- devel
|
- devel
|
||||||
db_engine_name:
|
db_engine_name:
|
||||||
- mysql
|
- mysql
|
||||||
- mariadb
|
- mariadb
|
||||||
db_engine_version:
|
db_engine_version:
|
||||||
- '8.0.38'
|
- 5.7.40
|
||||||
- '8.4.1'
|
- 8.0.31
|
||||||
- '10.11.8'
|
- 10.4.27
|
||||||
- '11.4.5'
|
# - 10.5.18
|
||||||
|
# - 10.6.11
|
||||||
|
python:
|
||||||
|
- '3.8'
|
||||||
|
- '3.9'
|
||||||
|
- '3.10'
|
||||||
connector_name:
|
connector_name:
|
||||||
- pymysql
|
- pymysql
|
||||||
- mysqlclient
|
- mysqlclient
|
||||||
connector_version:
|
connector_version:
|
||||||
- '0.9.3'
|
- 0.7.11
|
||||||
- '1.0.2'
|
- 0.9.3
|
||||||
- '1.1.1'
|
# Before we can activate test with pymysql 1.0.2 we should debug the
|
||||||
- '2.0.1'
|
# following plugins:
|
||||||
- '2.0.3'
|
#
|
||||||
- '2.1.1'
|
# mysql_query:
|
||||||
|
# test "Assert that create table IF NOT EXISTS is not changed with pymysql" failed
|
||||||
include:
|
#
|
||||||
|
# mysql_replication:
|
||||||
# RHEL8 context
|
# test "Assert that startreplica is not changed" failed
|
||||||
- connector_name: pymysql
|
# - 1.0.2
|
||||||
connector_version: '0.10.1'
|
- 2.0.1
|
||||||
ansible: stable-2.16
|
- 2.0.3
|
||||||
db_engine_name: mariadb
|
- 2.1.1
|
||||||
db_engine_version: '10.11.8'
|
|
||||||
|
|
||||||
# RHEL9 context
|
|
||||||
# - connector_name: pymysql
|
|
||||||
# connector_version: '1.1.1'
|
|
||||||
# ansible: stable-2.17
|
|
||||||
# db_engine_name: mariadb
|
|
||||||
# db_engine_version: '10.11.8'
|
|
||||||
# This tests is already included in the matrix, no need repeating
|
|
||||||
|
|
||||||
exclude:
|
exclude:
|
||||||
|
- db_engine_name: mysql
|
||||||
|
db_engine_version: 10.4.27
|
||||||
|
|
||||||
- db_engine_name: mysql
|
- db_engine_name: mysql
|
||||||
db_engine_version: '10.11.8'
|
db_engine_version: 10.5.18
|
||||||
|
|
||||||
- db_engine_name: mysql
|
- db_engine_name: mysql
|
||||||
db_engine_version: '11.4.5'
|
db_engine_version: 10.6.11
|
||||||
|
|
||||||
- db_engine_name: mariadb
|
- db_engine_name: mariadb
|
||||||
db_engine_version: '8.0.38'
|
db_engine_version: 5.7.40
|
||||||
|
|
||||||
- db_engine_name: mariadb
|
- db_engine_name: mariadb
|
||||||
db_engine_version: '8.4.1'
|
db_engine_version: 8.0.31
|
||||||
|
|
||||||
- connector_name: pymysql
|
- connector_name: pymysql
|
||||||
connector_version: '2.0.1'
|
connector_version: 2.0.1
|
||||||
|
|
||||||
- connector_name: pymysql
|
- connector_name: pymysql
|
||||||
connector_version: '2.0.3'
|
connector_version: 2.0.3
|
||||||
|
|
||||||
- connector_name: pymysql
|
- connector_name: pymysql
|
||||||
connector_version: '2.1.1'
|
connector_version: 2.1.1
|
||||||
|
|
||||||
- connector_name: mysqlclient
|
- connector_name: mysqlclient
|
||||||
connector_version: '0.9.3'
|
connector_version: 0.7.11
|
||||||
|
|
||||||
- connector_name: mysqlclient
|
- connector_name: mysqlclient
|
||||||
connector_version: '1.0.2'
|
connector_version: 0.9.3
|
||||||
|
|
||||||
- connector_name: mysqlclient
|
- connector_name: mysqlclient
|
||||||
connector_version: '1.1.1'
|
connector_version: 1.0.2
|
||||||
|
|
||||||
- db_engine_version: '8.0.38'
|
- db_engine_name: mariadb
|
||||||
ansible: stable-2.17
|
connector_version: 0.7.11
|
||||||
|
|
||||||
- db_engine_version: '10.11.8'
|
- db_engine_version: 5.7.40
|
||||||
ansible: stable-2.17
|
python: '3.9'
|
||||||
|
|
||||||
- db_engine_version: '8.0.38'
|
- db_engine_version: 5.7.40
|
||||||
|
python: '3.10'
|
||||||
|
|
||||||
|
- db_engine_version: 5.7.40
|
||||||
|
ansible: stable-2.13
|
||||||
|
|
||||||
|
- db_engine_version: 5.7.40
|
||||||
|
ansible: stable-2.14
|
||||||
|
|
||||||
|
- db_engine_version: 5.7.40
|
||||||
ansible: devel
|
ansible: devel
|
||||||
|
|
||||||
- db_engine_version: '10.11.8'
|
- db_engine_version: 8.0.31
|
||||||
|
python: '3.8'
|
||||||
|
|
||||||
|
- db_engine_version: 8.0.31
|
||||||
|
python: '3.8'
|
||||||
|
|
||||||
|
- db_engine_version: 10.4.27
|
||||||
|
python: '3.10'
|
||||||
|
|
||||||
|
- db_engine_version: 10.4.27
|
||||||
ansible: devel
|
ansible: devel
|
||||||
|
|
||||||
- db_engine_version: '8.4.1'
|
- db_engine_version: 10.6.11
|
||||||
connector_version: '0.9.3'
|
python: '3.8'
|
||||||
|
|
||||||
- db_engine_version: '8.4.1'
|
- db_engine_version: 10.6.11
|
||||||
connector_version: '1.0.2'
|
python: '3.9'
|
||||||
|
|
||||||
- db_engine_version: '8.4.1'
|
- python: '3.8'
|
||||||
connector_version: '2.0.1'
|
connector_version: 2.0.3
|
||||||
|
|
||||||
- db_engine_version: '8.4.1'
|
- python: '3.8'
|
||||||
connector_version: '2.0.3'
|
connector_version: 2.1.1
|
||||||
|
|
||||||
- db_engine_version: '10.11.8'
|
- python: '3.9'
|
||||||
connector_version: '0.9.3'
|
connector_version: 0.7.11
|
||||||
|
|
||||||
- db_engine_version: '10.11.8'
|
- python: '3.9'
|
||||||
connector_version: '1.0.2'
|
connector_version: 2.0.1
|
||||||
|
|
||||||
- db_engine_version: '10.11.8'
|
- python: '3.9'
|
||||||
connector_version: '2.0.1'
|
connector_version: 2.1.1
|
||||||
|
|
||||||
- db_engine_version: '10.11.8'
|
- python: '3.10'
|
||||||
connector_version: '2.0.1'
|
connector_version: 0.7.11
|
||||||
|
|
||||||
- db_engine_version: '10.11.8'
|
- python: '3.10'
|
||||||
ansible: stable-2.15
|
connector_version: 0.9.3
|
||||||
|
|
||||||
- db_engine_version: '8.4.1'
|
- python: '3.10'
|
||||||
ansible: stable-2.15
|
connector_version: 2.0.1
|
||||||
|
|
||||||
- connector_version: '1.1.1'
|
- python: '3.10'
|
||||||
db_engine_version: '8.0.38'
|
connector_version: 2.0.3
|
||||||
|
|
||||||
- connector_version: '1.1.1'
|
- python: '3.8'
|
||||||
db_engine_version: '10.11.8'
|
ansible: stable-2.13
|
||||||
|
|
||||||
|
- python: '3.8'
|
||||||
|
ansible: stable-2.14
|
||||||
|
|
||||||
|
- python: '3.8'
|
||||||
|
ansible: devel
|
||||||
|
|
||||||
|
- python: '3.9'
|
||||||
|
ansible: stable-2.12
|
||||||
|
|
||||||
|
- python: '3.9'
|
||||||
|
ansible: devel
|
||||||
|
|
||||||
|
- python: '3.10'
|
||||||
|
ansible: stable-2.12
|
||||||
|
|
||||||
services:
|
services:
|
||||||
db_primary:
|
db_primary:
|
||||||
|
@ -175,7 +202,7 @@ jobs:
|
||||||
# We write our own health-cmd because the mariadb container does not
|
# We write our own health-cmd because the mariadb container does not
|
||||||
# provide a healthcheck
|
# provide a healthcheck
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd "${{ matrix.db_engine_name == 'mysql' && 'mysqladmin' || 'mariadb-admin' }} ping -P 3306 -pmsandbox |grep alive || exit 1"
|
--health-cmd "mysqladmin ping -P 3306 -pmsandbox |grep alive || exit 1"
|
||||||
--health-start-period 10s
|
--health-start-period 10s
|
||||||
--health-interval 10s
|
--health-interval 10s
|
||||||
--health-timeout 5s
|
--health-timeout 5s
|
||||||
|
@ -189,7 +216,7 @@ jobs:
|
||||||
ports:
|
ports:
|
||||||
- 3308:3306
|
- 3308:3306
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd "${{ matrix.db_engine_name == 'mysql' && 'mysqladmin' || 'mariadb-admin' }} ping -P 3306 -pmsandbox |grep alive || exit 1"
|
--health-cmd "mysqladmin ping -P 3306 -pmsandbox |grep alive || exit 1"
|
||||||
--health-start-period 10s
|
--health-start-period 10s
|
||||||
--health-interval 10s
|
--health-interval 10s
|
||||||
--health-timeout 5s
|
--health-timeout 5s
|
||||||
|
@ -203,7 +230,7 @@ jobs:
|
||||||
ports:
|
ports:
|
||||||
- 3309:3306
|
- 3309:3306
|
||||||
options: >-
|
options: >-
|
||||||
--health-cmd "${{ matrix.db_engine_name == 'mysql' && 'mysqladmin' || 'mariadb-admin' }} ping -P 3306 -pmsandbox |grep alive || exit 1"
|
--health-cmd "mysqladmin ping -P 3306 -pmsandbox |grep alive || exit 1"
|
||||||
--health-start-period 10s
|
--health-start-period 10s
|
||||||
--health-interval 10s
|
--health-interval 10s
|
||||||
--health-timeout 5s
|
--health-timeout 5s
|
||||||
|
@ -215,22 +242,9 @@ jobs:
|
||||||
|
|
||||||
- name: Restart MySQL server with settings for replication
|
- name: Restart MySQL server with settings for replication
|
||||||
run: |
|
run: |
|
||||||
db_ver="${{ matrix.db_engine_version }}"
|
docker exec ${{ job.services.db_primary.id }} bash -c 'echo -e [mysqld]\\nserver-id=1\\nlog-bin=/var/lib/mysql/primary-bin > /etc/mysql/conf.d/replication.cnf'
|
||||||
maj="${db_ver%.*.*}"
|
docker exec ${{ job.services.db_replica1.id }} bash -c 'echo -e [mysqld]\\nserver-id=2\\nlog-bin=/var/lib/mysql/replica1-bin > /etc/mysql/conf.d/replication.cnf'
|
||||||
maj_min="${db_ver%.*}"
|
docker exec ${{ job.services.db_replica2.id }} bash -c 'echo -e [mysqld]\\nserver-id=3\\nlog-bin=/var/lib/mysql/replica2-bin > /etc/mysql/conf.d/replication.cnf'
|
||||||
min="${maj_min#*.}"
|
|
||||||
if [[ "${{ matrix.db_engine_name }}" == "mysql" && "$maj" -eq 8 && "$min" -ge 2 ]]; then
|
|
||||||
prima_conf='[mysqld]\\nserver-id=1\\nlog-bin=/var/lib/mysql/primary-bin\\nmysql-native-password=1'
|
|
||||||
repl1_conf='[mysqld]\\nserver-id=2\\nlog-bin=/var/lib/mysql/replica1-bin\\nmysql-native-password=1'
|
|
||||||
repl2_conf='[mysqld]\\nserver-id=3\\nlog-bin=/var/lib/mysql/replica2-bin\\nmysql-native-password=1'
|
|
||||||
else
|
|
||||||
prima_conf='[mysqld]\\nserver-id=1\\nlog-bin=/var/lib/mysql/primary-bin'
|
|
||||||
repl1_conf='[mysqld]\\nserver-id=2\\nlog-bin=/var/lib/mysql/replica1-bin'
|
|
||||||
repl2_conf='[mysqld]\\nserver-id=3\\nlog-bin=/var/lib/mysql/replica2-bin'
|
|
||||||
fi
|
|
||||||
docker exec -e cnf=$prima_conf ${{ job.services.db_primary.id }} bash -c 'echo -e ${cnf//\\n/\n} > /etc/mysql/conf.d/replication.cnf'
|
|
||||||
docker exec -e cnf=$repl1_conf ${{ job.services.db_replica1.id }} bash -c 'echo -e ${cnf//\\n/\n} > /etc/mysql/conf.d/replication.cnf'
|
|
||||||
docker exec -e cnf=$repl2_conf ${{ job.services.db_replica2.id }} bash -c 'echo -e ${cnf//\\n/\n} > /etc/mysql/conf.d/replication.cnf'
|
|
||||||
docker restart -t 30 ${{ job.services.db_primary.id }}
|
docker restart -t 30 ${{ job.services.db_primary.id }}
|
||||||
docker restart -t 30 ${{ job.services.db_replica1.id }}
|
docker restart -t 30 ${{ job.services.db_replica1.id }}
|
||||||
docker restart -t 30 ${{ job.services.db_replica2.id }}
|
docker restart -t 30 ${{ job.services.db_replica2.id }}
|
||||||
|
@ -242,13 +256,48 @@ jobs:
|
||||||
${{ job.services.db_primary.id }}
|
${{ job.services.db_primary.id }}
|
||||||
| grep healthy && [[ "$SECONDS" -lt 120 ]]; do sleep 1; done
|
| grep healthy && [[ "$SECONDS" -lt 120 ]]; do sleep 1; done
|
||||||
|
|
||||||
|
- name: Compute docker_image - Set python_version_flat
|
||||||
|
run: >
|
||||||
|
echo "python_version_flat=$(echo ${{ matrix.python }}
|
||||||
|
| tr -d '.')" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Compute docker_image - Set connector_version_flat
|
||||||
|
run: >
|
||||||
|
echo "connector_version_flat=$(echo ${{ matrix.connector_version }}
|
||||||
|
|tr -d .)" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Compute docker_image - Set db_engine_version_flat
|
||||||
|
run: >
|
||||||
|
echo "db_engine_version_flat=$(echo ${{ matrix.db_engine_version }}
|
||||||
|
| awk -F '.' '{print $1 $2}')" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Compute docker_image - Set db_client
|
||||||
|
run: >
|
||||||
|
if [[ ${{ env.db_engine_version_flat }} == 57 ]]; then
|
||||||
|
echo "db_client=my57" >> $GITHUB_ENV;
|
||||||
|
else
|
||||||
|
echo "db_client=$(echo ${{ matrix.db_engine_name }})" >> $GITHUB_ENV;
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Set docker_image
|
||||||
|
run: >
|
||||||
|
docker_image_multiline=("
|
||||||
|
ghcr.io/ansible-collections/community.mysql\
|
||||||
|
/test-container-${{ env.db_client }}\
|
||||||
|
-py${{ env.python_version_flat }}\
|
||||||
|
-${{ matrix.connector_name }}${{ env.connector_version_flat }}\
|
||||||
|
:latest")
|
||||||
|
|
||||||
|
echo "docker_image=$(printf '%s' $docker_image_multiline)"
|
||||||
|
>> $GITHUB_ENV
|
||||||
|
|
||||||
- name: >-
|
- name: >-
|
||||||
Perform integration testing against
|
Perform integration testing against
|
||||||
Ansible version ${{ matrix.ansible }}
|
Ansible version ${{ matrix.ansible }}
|
||||||
|
under Python ${{ matrix.python }}
|
||||||
uses: ansible-community/ansible-test-gh-action@release/v1
|
uses: ansible-community/ansible-test-gh-action@release/v1
|
||||||
with:
|
with:
|
||||||
ansible-core-version: ${{ matrix.ansible }}
|
ansible-core-version: ${{ matrix.ansible }}
|
||||||
docker-image: ubuntu2204
|
|
||||||
pre-test-cmd: >-
|
pre-test-cmd: >-
|
||||||
echo Setting db_engine_name to "${{ matrix.db_engine_name }}"...;
|
echo Setting db_engine_name to "${{ matrix.db_engine_name }}"...;
|
||||||
echo -n "${{ matrix.db_engine_name }}"
|
echo -n "${{ matrix.db_engine_name }}"
|
||||||
|
@ -267,56 +316,47 @@ jobs:
|
||||||
echo -n "${{ matrix.connector_version }}"
|
echo -n "${{ matrix.connector_version }}"
|
||||||
> tests/integration/connector_version;
|
> tests/integration/connector_version;
|
||||||
|
|
||||||
|
echo Setting Python version to "${{ matrix.python }}"...;
|
||||||
|
echo -n "${{ matrix.python }}"
|
||||||
|
> tests/integration/python;
|
||||||
|
|
||||||
echo Setting Ansible version to "${{ matrix.ansible }}"...;
|
echo Setting Ansible version to "${{ matrix.ansible }}"...;
|
||||||
echo -n "${{ matrix.ansible }}"
|
echo -n "${{ matrix.ansible }}"
|
||||||
> tests/integration/ansible
|
> tests/integration/ansible
|
||||||
|
docker-image: ${{ env.docker_image }}
|
||||||
|
target-python-version: ${{ matrix.python }}
|
||||||
testing-type: integration
|
testing-type: integration
|
||||||
integration-retry-on-error: false
|
|
||||||
|
|
||||||
units:
|
units:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-20.04
|
||||||
name: Units (Ⓐ${{ matrix.ansible }}, Python${{ matrix.python }})
|
name: Units (Ⓐ${{ matrix.ansible }})
|
||||||
strategy:
|
strategy:
|
||||||
# As soon as the first unit test fails,
|
# As soon as the first unit test fails,
|
||||||
# cancel the others to free up the CI queue
|
# cancel the others to free up the CI queue
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
ansible:
|
ansible:
|
||||||
- stable-2.17
|
- stable-2.12
|
||||||
- stable-2.18
|
- stable-2.13
|
||||||
- stable-2.19
|
- stable-2.14
|
||||||
- devel
|
- devel
|
||||||
python:
|
python:
|
||||||
- '3.8'
|
- 3.8
|
||||||
- '3.9'
|
- 3.9
|
||||||
- '3.10'
|
|
||||||
- '3.11'
|
|
||||||
exclude:
|
exclude:
|
||||||
- python: '3.8'
|
- python: '3.8'
|
||||||
ansible: stable-2.17
|
ansible: stable-2.13
|
||||||
|
- python: '3.8'
|
||||||
|
ansible: stable-2.14
|
||||||
- python: '3.8'
|
- python: '3.8'
|
||||||
ansible: devel
|
ansible: devel
|
||||||
|
|
||||||
- python: '3.8'
|
|
||||||
ansible: stable-2.19
|
|
||||||
|
|
||||||
- python: '3.9'
|
- python: '3.9'
|
||||||
ansible: stable-2.17
|
ansible: stable-2.12
|
||||||
|
|
||||||
- python: '3.9'
|
|
||||||
ansible: devel
|
|
||||||
|
|
||||||
- python: '3.10'
|
|
||||||
ansible: stable-2.17
|
|
||||||
|
|
||||||
- python: '3.11'
|
|
||||||
ansible: stable-2.17
|
|
||||||
steps:
|
steps:
|
||||||
- name: >-
|
- name: >-
|
||||||
Perform unit testing against
|
Perform unit testing against
|
||||||
Ansible version ${{ matrix.ansible }} and
|
Ansible version ${{ matrix.ansible }}
|
||||||
python version ${{ matrix.python }}
|
|
||||||
uses: ansible-community/ansible-test-gh-action@release/v1
|
uses: ansible-community/ansible-test-gh-action@release/v1
|
||||||
with:
|
with:
|
||||||
ansible-core-version: ${{ matrix.ansible }}
|
ansible-core-version: ${{ matrix.ansible }}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
name: Roles CI
|
name: Roles CI
|
||||||
on: # yamllint disable-line rule:truthy
|
on:
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- 'roles/**'
|
- 'roles/**'
|
||||||
|
@ -15,7 +15,7 @@ on: # yamllint disable-line rule:truthy
|
||||||
jobs:
|
jobs:
|
||||||
molecule:
|
molecule:
|
||||||
name: "Molecule (Python: ${{ matrix.python }}, Ansible: ${{ matrix.ansible }}, MySQL: ${{ matrix.mysql }})"
|
name: "Molecule (Python: ${{ matrix.python }}, Ansible: ${{ matrix.ansible }}, MySQL: ${{ matrix.mysql }})"
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
PY_COLORS: 1
|
PY_COLORS: 1
|
||||||
ANSIBLE_FORCE_COLOR: 1
|
ANSIBLE_FORCE_COLOR: 1
|
||||||
|
@ -24,36 +24,41 @@ jobs:
|
||||||
mysql:
|
mysql:
|
||||||
- 2.0.12
|
- 2.0.12
|
||||||
ansible:
|
ansible:
|
||||||
- stable-2.15
|
- stable-2.11
|
||||||
- stable-2.16
|
- stable-2.12
|
||||||
- stable-2.17
|
- stable-2.13
|
||||||
- devel
|
- devel
|
||||||
python:
|
python:
|
||||||
- '3.8'
|
- 3.6
|
||||||
- '3.9'
|
- 3.8
|
||||||
- '3.10'
|
- 3.9
|
||||||
exclude:
|
exclude:
|
||||||
|
- python: 3.6
|
||||||
|
ansible: stable-2.12
|
||||||
|
- python: 3.6
|
||||||
|
ansible: stable-2.13
|
||||||
|
- python: 3.6
|
||||||
|
ansible: devel
|
||||||
- python: 3.8
|
- python: 3.8
|
||||||
ansible: stable-2.17
|
ansible: stable-2.11
|
||||||
|
- python: 3.8
|
||||||
- python: 3.9
|
ansible: stable-2.13
|
||||||
ansible: stable-2.17
|
|
||||||
|
|
||||||
- python: 3.8
|
- python: 3.8
|
||||||
ansible: devel
|
ansible: devel
|
||||||
|
|
||||||
- python: 3.9
|
- python: 3.9
|
||||||
ansible: devel
|
ansible: stable-2.11
|
||||||
|
- python: 3.9
|
||||||
|
ansible: stable-2.12
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
path: ansible_collections/community/mysql
|
path: ansible_collections/community/mysql
|
||||||
|
|
||||||
- name: Set up Python ${{ matrix.python }}
|
- name: Set up Python ${{ matrix.python }}
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v2
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python }}
|
python-version: ${{ matrix.python }}
|
||||||
|
|
67
.github/workflows/build-docker-image.yml
vendored
Normal file
67
.github/workflows/build-docker-image.yml
vendored
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
---
|
||||||
|
name: Build Docker Image for ansible-test
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
registry:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
image_name:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
context:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# Requirement to use 'context' in docker/build-push-action@v3
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
# https://github.com/docker/login-action
|
||||||
|
- name: Log into registry ${{ inputs.registry }}
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ${{ inputs.registry }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# https://github.com/docker/metadata-action
|
||||||
|
- name: Extract Docker metadata (tags, labels)
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v4
|
||||||
|
with:
|
||||||
|
images:
|
||||||
|
"${{ inputs.registry }}\
|
||||||
|
/${{ github.repository }}\
|
||||||
|
/${{ inputs.image_name }}"
|
||||||
|
tags: latest
|
||||||
|
|
||||||
|
# Setting up Docker Buildx with docker-container driver is required
|
||||||
|
# at the moment to be able to use a subdirectory with Git context
|
||||||
|
#
|
||||||
|
# https://github.com/docker/setup-buildx-action
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
|
# https://github.com/docker/build-push-action
|
||||||
|
- name: Build and push Docker image with Buildx
|
||||||
|
id: build-and-push
|
||||||
|
uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: ${{ inputs.context }}
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=max
|
21
.github/workflows/docker-image-mariadb-py310-mysqlclient211.yml
vendored
Normal file
21
.github/workflows/docker-image-mariadb-py310-mysqlclient211.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mariadb-py310-mysqlclient211
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mariadb-py310-mysqlclient211/**'
|
||||||
|
- '.github/workflows/docker-image-mariadb-py310-mysqlclient211.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mariadb-py310-mysqlclient211
|
||||||
|
context: test-containers/mariadb-py310-mysqlclient211
|
21
.github/workflows/docker-image-mariadb-py310-pymysql102.yml
vendored
Normal file
21
.github/workflows/docker-image-mariadb-py310-pymysql102.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mariadb-py310-pymysql102
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mariadb-py310-pymysql102/**'
|
||||||
|
- '.github/workflows/docker-image-mariadb-py310-pymysql102.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mariadb-py310-pymysql102
|
||||||
|
context: test-containers/mariadb-py310-pymysql102
|
21
.github/workflows/docker-image-mariadb-py38-mysqlclient201.yml
vendored
Normal file
21
.github/workflows/docker-image-mariadb-py38-mysqlclient201.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mariadb-py38-mysqlclient201
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mariadb-py38-mysqlclient201/**'
|
||||||
|
- '.github/workflows/docker-image-mariadb-py38-mysqlclient201.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mariadb-py38-mysqlclient201
|
||||||
|
context: test-containers/mariadb-py38-mysqlclient201
|
21
.github/workflows/docker-image-mariadb-py38-pymysql093.yml
vendored
Normal file
21
.github/workflows/docker-image-mariadb-py38-pymysql093.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mariadb-py38-pymysql093
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mariadb-py38-pymysql093/**'
|
||||||
|
- '.github/workflows/docker-image-mariadb-py38-pymysql093.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mariadb-py38-pymysql093
|
||||||
|
context: test-containers/mariadb-py38-pymysql093
|
21
.github/workflows/docker-image-mariadb-py39-mysqlclient203.yml
vendored
Normal file
21
.github/workflows/docker-image-mariadb-py39-mysqlclient203.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mariadb-py39-mysqlclient203
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mariadb-py39-mysqlclient203/**'
|
||||||
|
- '.github/workflows/docker-image-mariadb-py39-mysqlclient203.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mariadb-py39-mysqlclient203
|
||||||
|
context: test-containers/mariadb-py39-mysqlclient203
|
21
.github/workflows/docker-image-mariadb-py39-pymysql093.yml
vendored
Normal file
21
.github/workflows/docker-image-mariadb-py39-pymysql093.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mariadb-py39-pymysql093
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mariadb-py39-pymysql093/**'
|
||||||
|
- '.github/workflows/docker-image-mariadb-py39-pymysql093.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mariadb-py39-pymysql093
|
||||||
|
context: test-containers/mariadb-py39-pymysql093
|
21
.github/workflows/docker-image-my57-py38-mysqlclient201.yml
vendored
Normal file
21
.github/workflows/docker-image-my57-py38-mysqlclient201.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI my57-py38-mysqlclient201
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/my57-py38-mysqlclient201/**'
|
||||||
|
- '.github/workflows/docker-image-my57-py38-mysqlclient201.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-my57-py38-mysqlclient201
|
||||||
|
context: test-containers/my57-py38-mysqlclient201
|
21
.github/workflows/docker-image-my57-py38-pymysql0711.yml
vendored
Normal file
21
.github/workflows/docker-image-my57-py38-pymysql0711.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI my57-py38-pymysql0711
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/my57-py38-pymysql0711/**'
|
||||||
|
- '.github/workflows/docker-image-my57-py38-pymysql0711.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-my57-py38-pymysql0711
|
||||||
|
context: test-containers/my57-py38-pymysql0711
|
21
.github/workflows/docker-image-my57-py38-pymysql093.yml
vendored
Normal file
21
.github/workflows/docker-image-my57-py38-pymysql093.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI my57-py38-pymysql093
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/my57-py38-pymysql093/**'
|
||||||
|
- '.github/workflows/docker-image-my57-py38-pymysql093.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-my57-py38-pymysql093
|
||||||
|
context: test-containers/my57-py38-pymysql093
|
21
.github/workflows/docker-image-mysql-py310-mysqlclient211.yml
vendored
Normal file
21
.github/workflows/docker-image-mysql-py310-mysqlclient211.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mysql-py310-mysqlclient211
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mysql-py310-mysqlclient211/**'
|
||||||
|
- '.github/workflows/docker-image-mysql-py310-mysqlclient211.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mysql-py310-mysqlclient211
|
||||||
|
context: test-containers/mysql-py310-mysqlclient211
|
21
.github/workflows/docker-image-mysql-py310-pymysql102.yml
vendored
Normal file
21
.github/workflows/docker-image-mysql-py310-pymysql102.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mysql-py310-pymysql102
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mysql-py310-pymysql102/**'
|
||||||
|
- '.github/workflows/docker-image-mysql-py310-pymysql102.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mysql-py310-pymysql102
|
||||||
|
context: test-containers/mysql-py310-pymysql102
|
21
.github/workflows/docker-image-mysql-py38-mysqlclient201.yml
vendored
Normal file
21
.github/workflows/docker-image-mysql-py38-mysqlclient201.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mysql-py38-mysqlclient201
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mysql-py38-mysqlclient201/**'
|
||||||
|
- '.github/workflows/docker-image-mysql-py38-mysqlclient201.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mysql-py38-mysqlclient201
|
||||||
|
context: test-containers/mysql-py38-mysqlclient201
|
21
.github/workflows/docker-image-mysql-py38-pymysql093.yml
vendored
Normal file
21
.github/workflows/docker-image-mysql-py38-pymysql093.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mysql-py38-pymysql093
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mysql-py38-pymysql093/**'
|
||||||
|
- '.github/workflows/docker-image-mysql-py38-pymysql093.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mysql-py38-pymysql093
|
||||||
|
context: test-containers/mysql-py38-pymysql093
|
21
.github/workflows/docker-image-mysql-py39-mysqlclient203.yml
vendored
Normal file
21
.github/workflows/docker-image-mysql-py39-mysqlclient203.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mysql-py39-mysqlclient203
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mysql-py39-mysqlclient203/**'
|
||||||
|
- '.github/workflows/docker-image-mysql-py39-mysqlclient203.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mysql-py39-mysqlclient203
|
||||||
|
context: test-containers/mysql-py39-mysqlclient203
|
21
.github/workflows/docker-image-mysql-py39-pymysql093.yml
vendored
Normal file
21
.github/workflows/docker-image-mysql-py39-pymysql093.yml
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
name: Docker Image CI mysql-py39-pymysql093
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'test-containers/mysql-py39-pymysql093/*'
|
||||||
|
- '.github/workflows/docker-image-mysql-py39-pymysql093.yml'
|
||||||
|
- '.github/workflows/build-docker-image.yml'
|
||||||
|
branches-ignore:
|
||||||
|
- stable-*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
call-workflow-passing-data:
|
||||||
|
uses: ./.github/workflows/build-docker-image.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
image_name: test-container-mysql-py39-pymysql093
|
||||||
|
context: test-containers/mysql-py39-pymysql093
|
712
CHANGELOG.rst
712
CHANGELOG.rst
|
@ -1,300 +1,31 @@
|
||||||
====================================================
|
========================================
|
||||||
Community MySQL and MariaDB Collection Release Notes
|
Community MySQL Collection Release Notes
|
||||||
====================================================
|
========================================
|
||||||
|
|
||||||
.. contents:: Topics
|
.. contents:: Topics
|
||||||
|
|
||||||
This changelog describes changes after version 2.0.0.
|
|
||||||
|
|
||||||
v3.15.0
|
v1.5.1
|
||||||
=======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
that have been made after the previous release.'
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_db - Add support for ``sql_log_bin`` option (https://github.com/ansible-collections/community.mysql/issues/700).
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_query - fix a Python 2 compatibility issue caused by the addition of ``execution_time_ms`` in version 3.12 (see https://github.com/ansible-collections/community.mysql/issues/716).
|
|
||||||
- mysql_user - fix a crash (unable to parse the MySQL grant string: SET DEFAULT ROLE `somerole` FOR `someuser`@`%`) when using the ``mysql_user`` module with a DEFAULT role present in MariaDB. The DEFAULT role is now ignored by the parser (https://github.com/ansible-collections/community.mysql/issues/710).
|
|
||||||
|
|
||||||
v3.14.0
|
|
||||||
=======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
that have been made after the previous release.'
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_replication - change default value for ``primary_ssl_verify_server_cert`` from False to None. This should not affect existing playbooks (https://github.com/ansible-collections/community.mysql/pull/707).
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_info - fix a crash (ERROR 1141, There is no such grant defined for user 'PUBLIC' on host '%') when using the ``users_info`` filter with a PUBLIC role present in MariaDB 10.11+. Do note that the fix doesn't change the fact that the module won't return the privileges from the PUBLIC role in the users privileges list. It can't do that because you have to login as the particular user and use `SHOW GRANTS FOR CURRENT_USER`. We considered using an aggregation with the `SHOW GRANTS FOR PUBLIC` command. However, this approach would make copying users from one server to another transform the privileges inherited from the role as if they were direct privileges on the user.
|
|
||||||
- mysql_replication - fixed an issue where setting ``primary_ssl_verify_server_cert`` to false had no effect (https://github.com/ansible-collections/community.mysql/issues/689).
|
|
||||||
|
|
||||||
v3.13.0
|
|
||||||
=======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
collection that have been made after the previous release.
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- Integration tests for MariaDB 11.4 have replaced those for 10.5. The previous version is now 10.11.
|
|
||||||
- mysql_user - add ``locked`` option to lock/unlock users, this is mainly used to have users that will act as definers on stored procedures.
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_db - fix dump and import to find MariaDB binaries (mariadb and mariadb-dump) when MariaDB 11+ is used and symbolic links to MySQL binaries are absent.
|
|
||||||
|
|
||||||
v3.12.0
|
|
||||||
=======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
collection that have been made after the previous release.
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_db - added ``zstd`` (de)compression support for ``import``/``dump`` states (https://github.com/ansible-collections/community.mysql/issues/696).
|
|
||||||
- mysql_query - returns the ``execution_time_ms`` list containing execution time per query in milliseconds.
|
|
||||||
|
|
||||||
v3.11.0
|
|
||||||
=======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
collection that have been made after the previous release.
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_info - adds the count of tables for each database to the returned values. It is possible to exclude this new field using the ``db_table_count`` exclusion filter. (https://github.com/ansible-collections/community.mysql/pull/691)
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_user,mysql_role - The sql_mode ANSI_QUOTES affects how the modules mysql_user and mysql_role compare the existing privileges with the configured privileges, as well as decide whether double quotes or backticks should be used in the GRANT statements. Pointing out in issue 671, the modules mysql_user and mysql_role allow users to enable/disable ANSI_QUOTES in session variable (within a DB session, the session variable always overwrites the global one). But due to the issue, the modules do not check for ANSI_MODE in the session variable, instead, they only check in the GLOBAL one.That behavior is not only limiting the users' flexibility, but also not allowing users to explicitly disable ANSI_MODE to work around such bugs like https://bugs.mysql.com/bug.php?id=115953. (https://github.com/ansible-collections/community.mysql/issues/671)
|
|
||||||
|
|
||||||
v3.10.3
|
|
||||||
=======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a bugfix release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
collection that have been made after the previous release.
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_user - add correct ``ed25519`` auth plugin handling when creating a user (https://github.com/ansible-collections/community.mysql/pull/676).
|
|
||||||
|
|
||||||
v3.10.2
|
|
||||||
=======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a bugfix release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
collection that have been made after the previous release.
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_user - add correct ``ed25519`` auth plugin handling when creating a user (https://github.com/ansible-collections/community.mysql/issues/672).
|
|
||||||
|
|
||||||
v3.10.1
|
|
||||||
=======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a patch release of the ``community.mysql`` collection.
|
|
||||||
Besides a bugfix, it contains an important upcoming breaking-change information.
|
|
||||||
|
|
||||||
Deprecated Features
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
- mysql_user - the ``user`` alias of the ``name`` argument has been deprecated and will be removed in collection version 5.0.0. Use the ``name`` argument instead.
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_user - module makes changes when is executed with ``plugin_auth_string`` parameter and check mode.
|
|
||||||
|
|
||||||
v3.10.0
|
|
||||||
=======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
collection that have been made after the previous release.
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_info - Add ``tls_requires`` returned value for the ``users_info`` filter (https://github.com/ansible-collections/community.mysql/pull/628).
|
|
||||||
- mysql_info - return a database server engine used (https://github.com/ansible-collections/community.mysql/issues/644).
|
|
||||||
- mysql_replication - Adds support for `CHANGE REPLICATION SOURCE TO` statement (https://github.com/ansible-collections/community.mysql/issues/635).
|
|
||||||
- mysql_replication - Adds support for `SHOW BINARY LOG STATUS` and `SHOW BINLOG STATUS` on getprimary mode.
|
|
||||||
- mysql_replication - Improve detection of IsReplica and IsPrimary by inspecting the dictionary returned from the SQL query instead of relying on variable types. This ensures compatibility with changes in the connector or the output of SHOW REPLICA STATUS and SHOW MASTER STATUS, allowing for easier maintenance if these change in the future.
|
|
||||||
- mysql_user - Add salt parameter to generate static hash for `caching_sha2_password` and `sha256_password` plugins.
|
|
||||||
|
|
||||||
Deprecated Features
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
- collection - support of mysqlclient connector is deprecated - use PyMySQL connector instead! We will stop testing against it in collection version 4.0.0 and remove the related code in 5.0.0 (https://github.com/ansible-collections/community.mysql/issues/654).
|
|
||||||
- mysql_info - The ``users_info`` filter returned variable ``plugin_auth_string`` contains the hashed password and it's misleading, it will be removed from community.mysql 4.0.0. Use the `plugin_hash_string` return value instead (https://github.com/ansible-collections/community.mysql/pull/629).
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_info - Add ``plugin_hash_string`` to ``users_info`` filter's output. The existing ``plugin_auth_string`` contained the hashed password and thus is missleading, it will be removed from community.mysql 4.0.0. (https://github.com/ansible-collections/community.mysql/pull/629).
|
|
||||||
- mysql_user - Added a warning to update_password's on_new_username option if multiple accounts with the same username but different passwords exist (https://github.com/ansible-collections/community.mysql/pull/642).
|
|
||||||
- mysql_user - Fix ``tls_requires`` not removing ``SSL`` and ``X509`` when sets as empty (https://github.com/ansible-collections/community.mysql/pull/628).
|
|
||||||
- mysql_user - Fix idempotence when using variables from the ``users_info`` filter of ``mysql_info`` as an input (https://github.com/ansible-collections/community.mysql/pull/628).
|
|
||||||
- mysql_user - Fixed an IndexError in the update_password functionality introduced in PR https://github.com/ansible-collections/community.mysql/pull/580 and released in community.mysql 3.8.0. If you used this functionality, please avoid versions 3.8.0 to 3.9.0 (https://github.com/ansible-collections/community.mysql/pull/642).
|
|
||||||
- mysql_user - add correct ``ed25519`` auth plugin handling (https://github.com/ansible-collections/community.mysql/issues/6).
|
|
||||||
- mysql_variables - fix the module always changes on boolean values (https://github.com/ansible-collections/community.mysql/issues/652).
|
|
||||||
|
|
||||||
v3.9.0
|
|
||||||
======
|
======
|
||||||
|
|
||||||
Release Summary
|
Release Summary
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
This is a minor release of the ``community.mysql`` collection.
|
Final maintenance release of ``community.mysql`` major version 1.
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
collection that have been made after the previous release.
|
|
||||||
|
|
||||||
Major Changes
|
Major Changes
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
- Collection version 2.*.* is EOL, no more bugfixes will be backported. Please consider upgrading to the latest version.
|
- The ``community.mysql`` 1.x.y release stream is now effectively End of Life. No more releases will be made. This follows the decision to support each major release for two years. This decision stems from this discussion (https://github.com/ansible-collections/community.mysql/discussions/537)
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_user - add the ``password_expire`` and ``password_expire_interval`` arguments to implement the password expiration management for mysql user (https://github.com/ansible-collections/community.mysql/pull/598).
|
v1.5.0
|
||||||
- mysql_user - add user attribute support via the ``attributes`` parameter and return value (https://github.com/ansible-collections/community.mysql/pull/604).
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_info - the ``slave_status`` filter was returning an empty list on MariaDB with multiple replication channels. It now returns all channels by running ``SHOW ALL SLAVES STATUS`` for MariaDB servers (https://github.com/ansible-collections/community.mysql/issues/603).
|
|
||||||
|
|
||||||
v3.8.0
|
|
||||||
======
|
======
|
||||||
|
|
||||||
Release Summary
|
Release Summary
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
This is the minor release of the ``community.mysql`` collection.
|
This is a minor release of the ``community.mysql`` collection.
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
collection that have been made after the previous release.
|
|
||||||
|
|
||||||
Major Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- The community.mysql collection no longer supports ``ansible-core 2.12`` and ``ansible-core 2.13``. While we take no active measures to prevent usage and there are no plans to introduce incompatible code to the modules, we will stop testing those versions. Both are or will soon be End of Life and if you are still using them, you should consider upgrading to the ``latest Ansible / ansible-core 2.15 or later`` as soon as possible (https://github.com/ansible-collections/community.mysql/pull/574).
|
|
||||||
- mysql_role - the ``column_case_sensitive`` argument's default value will be changed to ``true`` in community.mysql 4.0.0. If your playbook expected the column to be automatically uppercased for your roles privileges, you should set this to false explicitly (https://github.com/ansible-collections/community.mysql/issues/578).
|
|
||||||
- mysql_user - the ``column_case_sensitive`` argument's default value will be changed to ``true`` in community.mysql 4.0.0. If your playbook expected the column to be automatically uppercased for your users privileges, you should set this to false explicitly (https://github.com/ansible-collections/community.mysql/issues/577).
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_info - add filter ``users_info`` (https://github.com/ansible-collections/community.mysql/pull/580).
|
|
||||||
- mysql_role - add ``column_case_sensitive`` option to prevent field names from being uppercased (https://github.com/ansible-collections/community.mysql/pull/569).
|
|
||||||
- mysql_user - add ``column_case_sensitive`` option to prevent field names from being uppercased (https://github.com/ansible-collections/community.mysql/pull/569).
|
|
||||||
|
|
||||||
v3.7.2
|
|
||||||
======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a patch release of the community.mysql collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
that have been made after the previous release.
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql module utils - use the connection arguments ``db`` instead of ``database`` and ``passwd`` instead of ``password`` when running with MySQLdb < 2.0.0 (https://github.com/ansible-collections/community.mysql/pull/553).
|
|
||||||
|
|
||||||
v3.7.1
|
|
||||||
======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is a patch release of the community.mysql collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
that have been made after the previous release.
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql module utils - use the connection arguments ``db`` instead of ``database`` and ``passwd`` instead of ``password`` when running with older mysql drivers (MySQLdb < 2.1.0 or PyMySQL < 1.0.0) (https://github.com/ansible-collections/community.mysql/pull/551).
|
|
||||||
|
|
||||||
v3.7.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is the minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
that have been made after the previous release.
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql module utils - change deprecated connection parameters ``passwd`` and ``db`` to ``password`` and ``database`` (https://github.com/ansible-collections/community.mysql/pull/177).
|
|
||||||
- mysql_user - add ``MAX_STATEMENT_TIME`` support for mariadb to the ``resource_limits`` argument (https://github.com/ansible-collections/community.mysql/issues/211).
|
|
||||||
|
|
||||||
v3.6.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is the minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
This changelog contains all changes to the modules and plugins in this collection
|
||||||
that have been made after the previous release.
|
that have been made after the previous release.
|
||||||
|
|
||||||
|
@ -302,166 +33,121 @@ Minor Changes
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
- mysql_info - add ``connector_name`` and ``connector_version`` to returned values (https://github.com/ansible-collections/community.mysql/pull/497).
|
- mysql_info - add ``connector_name`` and ``connector_version`` to returned values (https://github.com/ansible-collections/community.mysql/pull/497).
|
||||||
- mysql_role - enable auto_commit to avoid MySQL metadata table lock (https://github.com/ansible-collections/community.mysql/issues/479).
|
|
||||||
- mysql_user - add plugin_auth_string as optional parameter to use a specific pam service if pam/auth_pam plugin is used (https://github.com/ansible-collections/community.mysql/pull/445).
|
|
||||||
- mysql_user - add the ``session_vars`` argument to set session variables at the beginning of module execution (https://github.com/ansible-collections/community.mysql/issues/478).
|
|
||||||
- mysql_user - display a more informative invalid privilege exception. Changes the exception handling of the granting permission logic to show the query executed , params and the exception message granting privileges fails` (https://github.com/ansible-collections/community.mysql/issues/465).
|
|
||||||
- mysql_user - enable auto_commit to avoid MySQL metadata table lock (https://github.com/ansible-collections/community.mysql/issues/479).
|
|
||||||
- setup_mysql - update MySQL tarball URL (https://github.com/ansible-collections/community.mysql/pull/491).
|
|
||||||
|
|
||||||
Bugfixes
|
v1.4.8
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_user - when revoke privs consists only of ``GRANT``, a 2nd revoke query is executed with empty privs to revoke that ended in an SQL exception (https://github.com/ansible-collections/community.mysql/pull/503).
|
|
||||||
- mysql_variables - add uppercase character pattern to regex to allow GLOBAL variables containing uppercase characters. This recognizes variable names used in Galera, for example, ``wsrep_OSU_method``, which breaks the normal pattern of all lowercase characters (https://github.com/ansible-collections/community.mysql/pull/501).
|
|
||||||
|
|
||||||
v3.5.1
|
|
||||||
======
|
======
|
||||||
|
|
||||||
Release Summary
|
Release Summary
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
This is the patch release of the ``community.mysql`` collection.
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
This changelog contains all changes to the modules in this collection that
|
||||||
that have been made after the previous release.
|
have been added after the release of ``community.mysql`` 1.4.7.
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_user, mysql_role - mysql/mariadb recent versions translate 'ALL PRIVILEGES' to a list of specific privileges. That caused a change every time we modified user privileges. This fix compares privs before and after user modification to avoid this infinite change (https://github.com/ansible-collections/community.mysql/issues/77).
|
|
||||||
|
|
||||||
v3.5.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is the minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
that have been added after the release of ``community.mysql`` 3.4.0.
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_replication - add a new option: ``primary_ssl_verify_server_cert`` (https://github.com//pull/435).
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_user - grant option was revoked accidentally when modifying users. This fix revokes grant option only when privs are setup to do that (https://github.com/ansible-collections/community.mysql/issues/77#issuecomment-1209693807).
|
|
||||||
|
|
||||||
v3.4.0
|
|
||||||
======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is the minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
that have been added after the release of ``community.mysql`` 3.3.0.
|
|
||||||
|
|
||||||
Major Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_db - the ``pipefail`` argument's default value will be changed to ``true`` in community.mysql 4.0.0. If your target machines do not use ``bash`` as a default interpreter, set ``pipefail`` to ``false`` explicitly. However, we strongly recommend setting up ``bash`` as a default and ``pipefail=true`` as it will protect you from getting broken dumps you don't know about (https://github.com/ansible-collections/community.mysql/issues/407).
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_db - add the ``chdir`` argument to avoid failings when a dump file contains relative paths (https://github.com/ansible-collections/community.mysql/issues/395).
|
|
||||||
- mysql_db - add the ``pipefail`` argument to avoid broken dumps when ``state`` is ``dump`` and compression is used (https://github.com/ansible-collections/community.mysql/issues/256).
|
|
||||||
|
|
||||||
Bugfixes
|
Bugfixes
|
||||||
--------
|
--------
|
||||||
|
|
||||||
- Include ``simplified_bsd.txt`` license file for various module utils.
|
- Include ``simplified_bsd.txt`` license file for various module utils.
|
||||||
- mysql_db - Using compression masks errors messages from mysql_dump. By default the fix is inactive to ensure retro-compatibility with system without bash. To activate the fix, use the module option ``pipefail=true`` (https://github.com/ansible-collections/community.mysql/issues/256).
|
|
||||||
- mysql_replication - when the ``primary_ssl`` argument is set to ``no``, the module will turn off SSL (https://github.com/ansible-collections/community.mysql/issues/393).
|
|
||||||
|
|
||||||
v3.3.0
|
v1.4.7
|
||||||
======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is the minor release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
that have been added after the release of ``community.mysql`` 3.2.1.
|
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_role - add the argument ``members_must_exist`` (boolean, default true). The assertion that the users supplied in the ``members`` argument exist is only executed when the new argument ``members_must_exist`` is ``true``, to allow opt-out (https://github.com/ansible-collections/community.mysql/pull/369).
|
|
||||||
- mysql_user - Add the option ``on_new_username`` to argument ``update_password`` to reuse the password (plugin and authentication_string) when creating a new user if some user with the same name already exists. If the existing user with the same name have varying passwords, the password from the arguments is used like with ``update_password: always`` (https://github.com/ansible-collections/community.mysql/pull/365).
|
|
||||||
- mysql_user - Add the result field ``password_changed`` (boolean). It is true, when the user got a new password. When the user was created with ``update_password: on_new_username`` and an existing password was reused, ``password_changed`` is false (https://github.com/ansible-collections/community.mysql/pull/365).
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_query - fix false change reports when ``IF EXISTS/IF NOT EXISTS`` clause is used (https://github.com/ansible-collections/community.mysql/issues/268).
|
|
||||||
- mysql_role - don't add members to a role when creating the role and ``detach_members: true`` is set (https://github.com/ansible-collections/community.mysql/pull/367).
|
|
||||||
- mysql_role - in some cases (when "SHOW GRANTS" did not use backticks for quotes), no unwanted members were detached from the role (and redundant "GRANT" statements were executed for wanted members). This is fixed by querying the existing role members from the mysql.role_edges (MySQL) or mysql.roles_mapping (MariaDB) tables instead of parsing the "SHOW GRANTS" output (https://github.com/ansible-collections/community.mysql/pull/368).
|
|
||||||
- mysql_user - fix logic when ``update_password`` is set to ``on_create`` for users using ``plugin*`` arguments (https://github.com/ansible-collections/community.mysql/issues/334). The ``on_create`` sets ``password`` to None for old mysql_native_authentication but not for authentiation methods which uses the ``plugin*`` arguments. This PR changes this so ``on_create`` also exchange ``plugin``, ``plugin_hash_string``, ``plugin_auth_string`` to None in the list of arguments to change
|
|
||||||
|
|
||||||
v3.2.1
|
|
||||||
======
|
======
|
||||||
|
|
||||||
Release Summary
|
Release Summary
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
This is the patch release of the ``community.mysql`` collection.
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
This changelog contains all changes to the modules in this collection
|
This changelog contains all changes to the modules in this collection that
|
||||||
that have been added after the release of ``community.mysql`` 3.2.0.
|
have been added after the release of ``community.mysql`` 1.4.6.
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql_query - fix false change reports when ``IF EXISTS/IF NOT EXISTS`` clause is used (https://github.com/ansible-collections/community.mysql/issues/268).
|
||||||
|
- mysql_user - fix logic when ``update_password`` is set to ``on_create`` for users using ``plugin*`` arguments (https://github.com/ansible-collections/community.mysql/issues/334). The ``on_create`` sets ``password`` to None for old mysql_native_authentication but not for authentiation methods which uses the ``plugin*`` arguments. This PR changes this so ``on_create`` also exchange ``plugin``, ``plugin_hash_string``, ``plugin_auth_string`` to None in the list of arguments to change
|
||||||
|
|
||||||
|
v1.4.6
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
have been added after the release of ``community.mysql`` 1.4.5.
|
||||||
|
|
||||||
Bugfixes
|
Bugfixes
|
||||||
--------
|
--------
|
||||||
|
|
||||||
- Include ``PSF-license.txt`` file for ``plugins/module_utils/_version.py``.
|
- Include ``PSF-license.txt`` file for ``plugins/module_utils/_version.py``.
|
||||||
|
|
||||||
v3.2.0
|
v1.4.5
|
||||||
======
|
======
|
||||||
|
|
||||||
Release Summary
|
Release Summary
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
This is the minor release of the ``community.mysql`` collection.
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
This changelog contains all changes to the modules in this collection
|
This changelog contains all changes to the modules in this collection that
|
||||||
that have been added after the release of ``community.mysql`` 3.1.3.
|
have been added after the release of ``community.mysql`` 1.4.4.
|
||||||
|
|
||||||
Major Changes
|
Major Changes
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
- The community.mysql collection no longer supports ``Ansible 2.9`` and ``ansible-base 2.10``. While we take no active measures to prevent usage and there are no plans to introduce incompatible code to the modules, we will stop testing against ``Ansible 2.9`` and ``ansible-base 2.10``. Both will very soon be End of Life and if you are still using them, you should consider upgrading to the ``latest Ansible / ansible-core 2.11 or later`` as soon as possible (https://github.com/ansible-collections/community.mysql/pull/343).
|
- The community.mysql collection no longer supports ``Ansible 2.9`` and ``ansible-base 2.10``. While we take no active measures to prevent usage and there are no plans to introduce incompatible code to the modules, we will stop testing against ``Ansible 2.9`` and ``ansible-base 2.10``. Both will very soon be End of Life and if you are still using them, you should consider upgrading to the ``latest Ansible / ansible-core 2.11 or later`` as soon as possible (https://github.com/ansible-collections/community.mysql/pull/343).
|
||||||
|
|
||||||
Minor Changes
|
|
||||||
-------------
|
|
||||||
|
|
||||||
- mysql_user and mysql_role: Add the argument ``subtract_privs`` (boolean, default false, mutually exclusive with ``append_privs``). If set, the privileges given in ``priv`` are revoked and existing privileges are kept (https://github.com/ansible-collections/community.mysql/pull/333).
|
|
||||||
|
|
||||||
Bugfixes
|
Bugfixes
|
||||||
--------
|
--------
|
||||||
|
|
||||||
- mysql_user - fix missing dynamic privileges after revoke and grant privileges to user (https://github.com/ansible-collections/community.mysql/issues/120).
|
- mysql_user - fix missing dynamic privileges after revoke and grant privileges to user (https://github.com/ansible-collections/community.mysql/issues/120).
|
||||||
- mysql_user - fix parsing privs when a user has roles assigned (https://github.com/ansible-collections/community.mysql/issues/231).
|
- mysql_user - fix parsing privs when a user has roles assigned (https://github.com/ansible-collections/community.mysql/issues/231).
|
||||||
|
|
||||||
v3.1.3
|
|
||||||
======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is the patch release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
that have been added after the release of ``community.mysql`` 3.1.2.
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_replication - fails when using the `primary_use_gtid` option with `slave_pos` or `replica_pos` (https://github.com/ansible-collections/community.mysql/issues/335).
|
|
||||||
- mysql_role - remove redundant connection closing (https://github.com/ansible-collections/community.mysql/pull/330).
|
|
||||||
- mysql_user - fix the possibility for a race condition that breaks certain (circular) replication configurations when ``DROP USER`` is executed on multiple nodes in the replica set. Adding ``IF EXISTS`` avoids the need to use ``sql_log_bin: no`` making the statement always replication safe (https://github.com/ansible-collections/community.mysql/pull/287).
|
- mysql_user - fix the possibility for a race condition that breaks certain (circular) replication configurations when ``DROP USER`` is executed on multiple nodes in the replica set. Adding ``IF EXISTS`` avoids the need to use ``sql_log_bin: no`` making the statement always replication safe (https://github.com/ansible-collections/community.mysql/pull/287).
|
||||||
|
|
||||||
v3.1.2
|
v1.4.4
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
have been added after the release of ``community.mysql`` 1.4.3.
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- Collection core functions - use vendored version of ``distutils.version`` instead of the deprecated Python standard library ``distutils`` (https://github.com/ansible-collections/community.mysql/pull/269).
|
||||||
|
|
||||||
|
v1.4.3
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
have been added after the release of ``community.mysql`` 1.4.2.
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql_info - fix TypeError failure when there are databases that do not contain tables (https://github.com/ansible-collections/community.mysql/issues/204).
|
||||||
|
|
||||||
|
v1.4.2
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
have been added after the release of ``community.mysql`` 1.4.1.
|
||||||
|
|
||||||
|
Minor Changes
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- mysql_query - correctly reflect changed status in replace statements (https://github.com/ansible-collections/community.mysql/pull/193).
|
||||||
|
|
||||||
|
v1.4.1
|
||||||
======
|
======
|
||||||
|
|
||||||
Release Summary
|
Release Summary
|
||||||
|
@ -469,29 +155,14 @@ Release Summary
|
||||||
|
|
||||||
This is the patch release of the ``community.mysql`` collection.
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
This changelog contains all changes to the modules in this collection
|
This changelog contains all changes to the modules in this collection
|
||||||
that have been added after the release of ``community.mysql`` 3.1.1.
|
that have been added after the release of ``community.mysql`` 1.4.0.
|
||||||
|
|
||||||
Bugfixes
|
Bugfixes
|
||||||
--------
|
--------
|
||||||
|
|
||||||
- Collection core functions - fixes related to the mysqlclient Python connector (https://github.com/ansible-collections/community.mysql/issues/292).
|
- mysql - revert changes of connector arguments made in pull request 116 causing the invalid keyword argument error (https://github.com/ansible-collections/community.mysql/pull/116).
|
||||||
|
|
||||||
v3.1.1
|
v1.4.0
|
||||||
======
|
|
||||||
|
|
||||||
Release Summary
|
|
||||||
---------------
|
|
||||||
|
|
||||||
This is the patch release of the ``community.mysql`` collection.
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
that have been added after the release of ``community.mysql`` 3.1.0.
|
|
||||||
|
|
||||||
Bugfixes
|
|
||||||
--------
|
|
||||||
|
|
||||||
- mysql_role - make the ``set_default_role_all`` parameter actually working (https://github.com/ansible-collections/community.mysql/pull/282).
|
|
||||||
|
|
||||||
v3.1.0
|
|
||||||
======
|
======
|
||||||
|
|
||||||
Release Summary
|
Release Summary
|
||||||
|
@ -499,33 +170,222 @@ Release Summary
|
||||||
|
|
||||||
This is the minor release of the ``community.mysql`` collection.
|
This is the minor release of the ``community.mysql`` collection.
|
||||||
This changelog contains all changes to the modules in this collection
|
This changelog contains all changes to the modules in this collection
|
||||||
that have been added after the release of ``community.mysql`` 3.0.0.
|
that have been added after the release of ``community.mysql`` 1.3.0.'
|
||||||
|
|
||||||
|
Major Changes
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- mysql_user - the ``REQUIRESSL`` is an alias for the ``ssl`` key in the ``tls_requires`` option in ``community.mysql`` 2.0.0 and support will be dropped altogether in ``community.mysql`` 3.0.0 (https://github.com/ansible-collections/community.mysql/issues/121).
|
||||||
|
|
||||||
Minor Changes
|
Minor Changes
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
- Added explicit description of the supported versions of databases and connectors. Changes to the collection are **NOT** tested against database versions older than `mysql 5.7.31` and `mariadb 10.2.37` or connector versions older than `pymysql 0.7.10` and `mysqlclient 2.0.1`. (https://github.com/ansible-collections/community.mysql/discussions/141)
|
- mysql module utils - change deprecated connection parameters ``passwd`` and ``db`` to ``password`` and ``database`` (https://github.com/ansible-collections/community.mysql/pull/116).
|
||||||
- mysql_user - added the ``force_context`` boolean option to set the default database context for the queries to be the ``mysql`` database. This way replication/binlog filters can catch the statements (https://github.com/ansible-collections/community.mysql/issues/265).
|
- mysql_collection - introduce codebabse split to handle divergences between MySQL and MariaDB (https://github.com/ansible-collections/community.mysql/pull/103).
|
||||||
|
- mysql_info - add `version.full` and `version.suffix` return values (https://github.com/ansible-collections/community.mysql/issues/114).
|
||||||
|
- mysql_user - deprecate the ``REQUIRESSL`` privilege (https://github.com/ansible-collections/community.mysql/issues/101).
|
||||||
|
|
||||||
Bugfixes
|
Bugfixes
|
||||||
--------
|
--------
|
||||||
|
|
||||||
- Collection core functions - use vendored version of ``distutils.version`` instead of the deprecated Python standard library ``distutils`` (https://github.com/ansible-collections/community.mysql/pull/269).
|
- mysql_user - add support for ``REPLICA MONITOR`` privilege (https://github.com/ansible-collections/community.mysql/issues/105).
|
||||||
|
|
||||||
v3.0.0
|
v1.3.0
|
||||||
======
|
======
|
||||||
|
|
||||||
Release Summary
|
Release Summary
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
This is the major release of the ``community.mysql`` collection.
|
This is the minor release of the ``community.mysql`` collection.
|
||||||
This changelog contains all breaking changes to the modules in this collection
|
This changelog contains all changes to the modules in this collection
|
||||||
that have been added after the release of ``community.mysql`` 2.3.2.
|
that have been added after the release of ``community.mysql`` 1.2.0.
|
||||||
|
|
||||||
Breaking Changes / Porting Guide
|
Major Changes
|
||||||
--------------------------------
|
-------------
|
||||||
|
|
||||||
- mysql_replication - remove ``Is_Slave`` and ``Is_Master`` return values (were replaced with ``Is_Primary`` and ``Is_Replica`` (https://github.com/ansible-collections/community.mysql/issues/145).
|
- mysql_replication - the mode options values ``getslave``, ``startslave``, ``stopslave``, ``resetslave``, ``resetslaveall` and the master_use_gtid option ``slave_pos`` are deprecated (see the alternative values) and will be removed in ``community.mysql`` 3.0.0 (https://github.com/ansible-collections/community.mysql/pull/97).
|
||||||
- mysql_replication - remove the mode options values containing ``master``/``slave`` and the master_use_gtid option ``slave_pos`` (were replaced with corresponding ``primary``/``replica`` values) (https://github.com/ansible-collections/community.mysql/issues/145).
|
- mysql_replication - the word ``SLAVE`` in messages returned by the module will be changed to ``REPLICA`` in ``community.mysql`` 2.0.0 (https://github.com/ansible-collections/community.mysql/issues/98).
|
||||||
- mysql_user - remove support for the `REQUIRESSL` special privilege as it has ben superseded by the `tls_requires` option (https://github.com/ansible-collections/community.mysql/discussions/121).
|
|
||||||
- mysql_user - validate privileges using database engine directly (https://github.com/ansible-collections/community.mysql/issues/234 https://github.com/ansible-collections/community.mysql/pull/243). Do not validate privileges in this module anymore.
|
Minor Changes
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- mysql_replication - deprecate offending terminology, add alternative choices to the ``mode`` option (https://github.com/ansible-collections/community.mysql/issues/78).
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql_user - fix handling of INSERT, UPDATE, REFERENCES on columns (https://github.com/ansible-collections/community.mysql/issues/106).
|
||||||
|
- mysql_user - the module is not idempotent when SELECT on columns granted (https://github.com/ansible-collections/community.mysql/issues/99).
|
||||||
|
|
||||||
|
v1.2.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the minor release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection
|
||||||
|
that have been added after the release of ``community.mysql`` 1.1.2.
|
||||||
|
|
||||||
|
Minor Changes
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- mysql_user - refactor to reduce cursor.execute() calls in preparation for adding query logging (https://github.com/ansible-collections/community.mysql/pull/76).
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql_user - add ``SHOW_ROUTINE`` privilege support (https://github.com/ansible-collections/community.mysql/issues/86).
|
||||||
|
- mysql_user - fixed creating user with encrypted password in MySQL 8.0 (https://github.com/ansible-collections/community.mysql/pull/79).
|
||||||
|
|
||||||
|
v1.1.2
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
have been added after the release of ``community.mysql`` 1.1.1.
|
||||||
|
|
||||||
|
Minor Changes
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- mysql_query - simple refactoring of query type check (https://github.com/ansible-collections/community.mysql/pull/58).
|
||||||
|
- mysql_user - simple refactoring of priv type check (https://github.com/ansible-collections/community.mysql/pull/58).
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql_db - fix false warning related to ``unsafe_login_password`` option (https://github.com/ansible-collections/community.mysql/issues/33).
|
||||||
|
- mysql_replication - fix crashes of mariadb >= 10.5.1 and mysql >= 8.0.22 caused by using deprecated terminology (https://github.com/ansible-collections/community.mysql/issues/70).
|
||||||
|
- mysql_user - fixed change detection when using append_privs (https://github.com/ansible-collections/community.mysql/pull/72).
|
||||||
|
|
||||||
|
v1.1.1
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
have been added after the release of ``community.mysql`` 1.1.0.
|
||||||
|
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql_query - fix failing when single-row query contains commas (https://github.com/ansible-collections/community.mysql/issues/51).
|
||||||
|
|
||||||
|
v1.1.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the minor release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that have been added after the release of ``community.mysql`` 1.0.2.
|
||||||
|
|
||||||
|
|
||||||
|
Minor Changes
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- mysql modules - add the ``check_hostname`` option (https://github.com/ansible-collections/community.mysql/issues/28).
|
||||||
|
- mysql modules - patch the ``Connection`` class to add a destructor that ensures connections to the server are explicitly closed (https://github.com/ansible-collections/community.mysql/pull/44).
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql modules - fix crash when ``!includedir`` option is in config file (https://github.com/ansible-collections/community.mysql/issues/46).
|
||||||
|
|
||||||
|
v1.0.2
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that have been added after the release of ``community.mysql`` 1.0.1.
|
||||||
|
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql_user - fix module's crash when modifying a user with ``host_all`` (https://github.com/ansible-collections/community.mysql/issues/39).
|
||||||
|
|
||||||
|
v1.0.1
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the patch release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that have been added after the release of ``community.mysql`` 1.0.0.
|
||||||
|
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql_db - fix false warning related to ``unsafe_login_password`` option (https://github.com/ansible-collections/community.mysql/issues/33).
|
||||||
|
- mysql_user - added tests to verify that TLS requirements are removed with an empty ``tls_requires`` option (https://github.com/ansible-collections/community.mysql/issues/20).
|
||||||
|
- mysql_user - correct procedure to check existing TLS requirements (https://github.com/ansible-collections/community.mysql/pull/26).
|
||||||
|
- mysql_user - minor syntax fixes (https://github.com/ansible-collections/community.mysql/pull/26).
|
||||||
|
|
||||||
|
v1.0.0
|
||||||
|
======
|
||||||
|
|
||||||
|
Release Summary
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This is the first proper release of the ``community.mysql`` collection.
|
||||||
|
This changelog contains all changes to the modules in this collection that were added after the release of Ansible 2.9.0.
|
||||||
|
|
||||||
|
|
||||||
|
Minor Changes
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- mysql_db - add ``master_data`` parameter (https://github.com/ansible/ansible/pull/66048).
|
||||||
|
- mysql_db - add ``skip_lock_tables`` option (https://github.com/ansible/ansible/pull/66688).
|
||||||
|
- mysql_db - add the ``check_implicit_admin`` parameter (https://github.com/ansible/ansible/issues/24418).
|
||||||
|
- mysql_db - add the ``dump_extra_args`` parameter (https://github.com/ansible/ansible/pull/67747).
|
||||||
|
- mysql_db - add the ``executed_commands`` returned value (https://github.com/ansible/ansible/pull/65498).
|
||||||
|
- mysql_db - add the ``force`` parameter (https://github.com/ansible/ansible/pull/65547).
|
||||||
|
- mysql_db - add the ``restrict_config_file`` parameter (https://github.com/ansible/ansible/issues/34488).
|
||||||
|
- mysql_db - add the ``unsafe_login_password`` parameter (https://github.com/ansible/ansible/issues/63955).
|
||||||
|
- mysql_db - add the ``use_shell`` parameter (https://github.com/ansible/ansible/issues/20196).
|
||||||
|
- mysql_info - add ``exclude_fields`` parameter (https://github.com/ansible/ansible/issues/63319).
|
||||||
|
- mysql_info - add ``global_status`` filter parameter option and return (https://github.com/ansible/ansible/pull/63189).
|
||||||
|
- mysql_info - add ``return_empty_dbs`` parameter to list empty databases (https://github.com/ansible/ansible/issues/65727).
|
||||||
|
- mysql_replication - add ``channel`` parameter (https://github.com/ansible/ansible/issues/29311).
|
||||||
|
- mysql_replication - add ``connection_name`` parameter (https://github.com/ansible/ansible/issues/46243).
|
||||||
|
- mysql_replication - add ``fail_on_error`` parameter (https://github.com/ansible/ansible/pull/66252).
|
||||||
|
- mysql_replication - add ``master_delay`` parameter (https://github.com/ansible/ansible/issues/51326).
|
||||||
|
- mysql_replication - add ``master_use_gtid`` parameter (https://github.com/ansible/ansible/pull/62648).
|
||||||
|
- mysql_replication - add ``queries`` return value (https://github.com/ansible/ansible/pull/63036).
|
||||||
|
- mysql_replication - add support of ``resetmaster`` choice to ``mode`` parameter (https://github.com/ansible/ansible/issues/42870).
|
||||||
|
- mysql_user - ``priv`` parameter can be string or dictionary (https://github.com/ansible/ansible/issues/57533).
|
||||||
|
- mysql_user - add TLS REQUIRES parameters (https://github.com/ansible-collections/community.mysql/pull/9).
|
||||||
|
- mysql_user - add ``plugin_auth_string`` parameter (https://github.com/ansible/ansible/pull/44267).
|
||||||
|
- mysql_user - add ``plugin_hash_string`` parameter (https://github.com/ansible/ansible/pull/44267).
|
||||||
|
- mysql_user - add ``plugin`` parameter (https://github.com/ansible/ansible/pull/44267).
|
||||||
|
- mysql_user - add the resource_limits parameter (https://github.com/ansible-collections/community.general/issues/133).
|
||||||
|
- mysql_variables - add ``mode`` parameter (https://github.com/ansible/ansible/issues/60119).
|
||||||
|
|
||||||
|
Bugfixes
|
||||||
|
--------
|
||||||
|
|
||||||
|
- mysql - dont mask ``mysql_connect`` function errors from modules (https://github.com/ansible/ansible/issues/64560).
|
||||||
|
- mysql_db - fix Broken pipe error appearance when state is import and the target file is compressed (https://github.com/ansible/ansible/issues/20196).
|
||||||
|
- mysql_db - fix bug in the ``db_import`` function introduced by https://github.com/ansible/ansible/pull/56721 (https://github.com/ansible/ansible/issues/65351).
|
||||||
|
- mysql_info - add parameter for __collect to get only what are wanted (https://github.com/ansible-collections/community.general/pull/136).
|
||||||
|
- mysql_replication - allow to pass empty values to parameters (https://github.com/ansible/ansible/issues/23976).
|
||||||
|
- mysql_user - Fix idempotence when long grant lists are used (https://github.com/ansible/ansible/issues/68044)
|
||||||
|
- mysql_user - Remove false positive ``no_log`` warning for ``update_password`` option
|
||||||
|
- mysql_user - add ``INVOKE LAMBDA`` privilege support (https://github.com/ansible-collections/community.general/issues/283).
|
||||||
|
- mysql_user - add missed privileges to support (https://github.com/ansible-collections/community.general/issues/617).
|
||||||
|
- mysql_user - fix ``host_all`` arguments conversion string formatting error (https://github.com/ansible/ansible/issues/29644).
|
||||||
|
- mysql_user - fix overriding password to the same (https://github.com/ansible-collections/community.general/issues/543).
|
||||||
|
- mysql_user - fix support privileges with underscore (https://github.com/ansible/ansible/issues/66974).
|
||||||
|
- mysql_user - fix the error No database selected (https://github.com/ansible/ansible/issues/68070).
|
||||||
|
- mysql_user - make sure current_pass_hash is a string before using it in comparison (https://github.com/ansible/ansible/issues/60567).
|
||||||
|
- mysql_variable - fix the module doesn't support variables name with dot (https://github.com/ansible/ansible/issues/54239).
|
||||||
|
|
|
@ -1,80 +1,5 @@
|
||||||
# Contributing to this project
|
# Contributing
|
||||||
|
|
||||||
In this guide, you will find information relevant for code contributions, though any other kinds of contribution mentioned in the [Ansible Contributing guidelines](https://docs.ansible.com/ansible/devel/community/index.html) are equally appreciated and valuable.
|
Refer to the [Ansible Contributing guidelines](https://docs.ansible.com/ansible/devel/community/index.html) to learn how to contribute to this collection.
|
||||||
|
|
||||||
If you have any questions after reading, please contact the community via one or more of the [available channels](https://github.com/ansible-collections/community.mysql#communication). Any feedback on this guide is very welcome.
|
Refer to the [review checklist](https://docs.ansible.com/ansible/devel/community/collection_contributors/collection_reviewing.html) when triaging issues or reviewing PRs.
|
||||||
|
|
||||||
## Reviewing open issue and pull requests
|
|
||||||
|
|
||||||
Refer to the [review checklist](https://docs.ansible.com/ansible/devel/community/collection_contributors/collection_reviewing.html) when triaging issues or reviewing pull requests (hereinafter PRs).
|
|
||||||
|
|
||||||
Most important things to pay attention to:
|
|
||||||
|
|
||||||
- Do not let major/breaking changes sneak into a minor/bugfix release! All such changes should be discussed in a dedicated issue, added to a corresponding milestone (which can be found or created in the project's Issues), and merged right before the major release. Take a look at similar issues to see what needs to be done and reflect on the steps you did/need to do in the issue.
|
|
||||||
- Every PR (except doc, refactoring, test-related, or a PR containing a new module/plugin) contains a [changelog fragment](https://docs.ansible.com/ansible/latest/community/development_process.html#creating-a-changelog-fragment). Let's give users a chance to know about the changes.
|
|
||||||
- Every new module `DOCUMENTATION` section contains the `version_added: 'x.y.z'` field. Besides the informative purpose, it is used by the changelog-generating tool to add a corresponding entry to the changelog. As the project follows SemVer, it is typically a next minor (x.y.0) version.
|
|
||||||
- Every new module argument contains the `version_added: 'x.y.z'` field. As the project follows SemVer, it is typically a next minor (x.y.0) version.
|
|
||||||
- Non-refactoring code changes (bugfixes, new features) are covered with, at least, integration tests! There can be exceptions but generally it is a requirement.
|
|
||||||
|
|
||||||
## Code contributions
|
|
||||||
|
|
||||||
If you want to submit a bugfix or new feature, refer to the [Quick-start development guide](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html) first.
|
|
||||||
|
|
||||||
## Project-specific info
|
|
||||||
|
|
||||||
We assume you have read the [Quick-start development guide](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html).
|
|
||||||
|
|
||||||
In order for any submitted PR to get merged, this project requires sanity, unit, and integration tests to pass.
|
|
||||||
Codecov job is there but not required.
|
|
||||||
We use the GitHub Actions platform to run the tests.
|
|
||||||
You can see the result in the bottom of every PR in the box listing the jobs and their results:
|
|
||||||
|
|
||||||
- Green checkmark: the test has been passed, no more action is needed.
|
|
||||||
- Red cross: the test has failed. You can see the reason by clicking the ``Details`` link. Fix them locally and push the commit.
|
|
||||||
|
|
||||||
Generally, all jobs must be green.
|
|
||||||
Sometimes, there can be failures unrelated to a PR, for example, when a test container is unavailable or there is another part of the code that does not satisfy recently introduced additional sanity checks.
|
|
||||||
If you think the failure does not relate to your changes, put a comment about it.
|
|
||||||
|
|
||||||
## CI testing
|
|
||||||
|
|
||||||
The jobs are launched automatically by GitHub Actions in every PR based on the [matrix](https://github.com/ansible-collections/community.mysql/blob/main/.github/workflows/ansible-test-plugins.yml).
|
|
||||||
|
|
||||||
As the project is included in `ansible` community package, it is a requirement for us to test against all supported `ansible-core` versions and corresponding Python versions.
|
|
||||||
To keep the matrix relevant, we are subscribed to the [news-for-maintainers](https://github.com/ansible-collections/news-for-maintainers) repository and the [Collection maintainers & contributors](https://forum.ansible.com/g/CollectionMaintainer) forum group to track announcements affecting CI.
|
|
||||||
|
|
||||||
If our matrix is permanently outdated, for example, when supported `ansible-core` versions are missed, the collections can get excluded from the package, so keep it updated!
|
|
||||||
|
|
||||||
Read more about our CI implementation in the [TESTING.md](https://github.com/ansible-collections/community.mysql/blob/main/TESTING.md) file.
|
|
||||||
|
|
||||||
## Adding tests
|
|
||||||
|
|
||||||
If you are new here, read the [Quick-start development guide](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html) first.
|
|
||||||
|
|
||||||
When fixing a bug, first reproduce it by adding a task as reported to a suitable file under the ``tests/integration/targets/<module_name>/tasks/`` directory and run the integration tests as described below. The same is relevant for new features.
|
|
||||||
|
|
||||||
It is not necessary but if you want you can also add unit tests to a suitable file under the ``tests/units/`` directory and run them as described below.
|
|
||||||
|
|
||||||
## Checking your code locally
|
|
||||||
|
|
||||||
It will make your and other people's life a bit easier if you run the tests locally and fix all failures before pushing. If you're unable to run the tests locally, please create your PR as a **draft** to avoid reviewers being added automatically.
|
|
||||||
|
|
||||||
If you are new here, read the [Quick-start development guide](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html) first.
|
|
||||||
|
|
||||||
We assume you [prepared your local environment](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html#prepare-your-environment) as described in the guide before running the following commands. Otherwise, the command will fail.
|
|
||||||
|
|
||||||
### Sanity tests
|
|
||||||
|
|
||||||
``` console
|
|
||||||
$ ansible-test sanity path/to/changed_file.py --docker -v
|
|
||||||
```
|
|
||||||
|
|
||||||
### Integration tests
|
|
||||||
|
|
||||||
See the [TESTING.md](https://github.com/ansible-collections/community.mysql/blob/main/TESTING.md) file to learn how to run integration tests against different server/connector versions.
|
|
||||||
|
|
||||||
### Unit tests
|
|
||||||
|
|
||||||
``` console
|
|
||||||
$ ansible-test units tests/unit/plugins/unit_test_file.py --docker
|
|
||||||
```
|
|
||||||
|
|
46
CONTRIBUTORS
46
CONTRIBUTORS
|
@ -17,11 +17,9 @@ amitk79
|
||||||
amree
|
amree
|
||||||
Andersson007
|
Andersson007
|
||||||
andrewhowdencom
|
andrewhowdencom
|
||||||
aneustroev
|
|
||||||
ansibot
|
ansibot
|
||||||
anthonyxpalermo
|
anthonyxpalermo
|
||||||
antonioribeiro
|
antonioribeiro
|
||||||
Aohzan
|
|
||||||
apollo13
|
apollo13
|
||||||
aquach
|
aquach
|
||||||
arcmop
|
arcmop
|
||||||
|
@ -35,13 +33,9 @@ baldpale
|
||||||
banyek
|
banyek
|
||||||
BarbzYHOOL
|
BarbzYHOOL
|
||||||
Berbe
|
Berbe
|
||||||
betanummeric
|
|
||||||
bigo8525
|
|
||||||
bizmate
|
|
||||||
bjne
|
bjne
|
||||||
bmalynovytch
|
bmalynovytch
|
||||||
bmildren
|
bmildren
|
||||||
bmillemathias
|
|
||||||
boreal321
|
boreal321
|
||||||
brutus
|
brutus
|
||||||
burner1024
|
burner1024
|
||||||
|
@ -50,7 +44,6 @@ candeira
|
||||||
caphrim007
|
caphrim007
|
||||||
cdalbergue
|
cdalbergue
|
||||||
checkphi
|
checkphi
|
||||||
chriscroome
|
|
||||||
chrismeyersfsu
|
chrismeyersfsu
|
||||||
ChristopherGAndrews
|
ChristopherGAndrews
|
||||||
cmodijk
|
cmodijk
|
||||||
|
@ -61,14 +54,12 @@ CormacBracken
|
||||||
cosmix
|
cosmix
|
||||||
cptMikky
|
cptMikky
|
||||||
crashes
|
crashes
|
||||||
d-lee
|
|
||||||
d-rupp
|
|
||||||
dagwieers
|
dagwieers
|
||||||
damianmoore
|
damianmoore
|
||||||
Davidffry
|
Davidffry
|
||||||
denisemauldin
|
denisemauldin
|
||||||
dennisurtubia
|
|
||||||
diclophis
|
diclophis
|
||||||
|
d-lee
|
||||||
dmp1ce
|
dmp1ce
|
||||||
dnelson
|
dnelson
|
||||||
dramaley
|
dramaley
|
||||||
|
@ -78,11 +69,9 @@ DSpeichert
|
||||||
dungdm93
|
dungdm93
|
||||||
dwagelaar
|
dwagelaar
|
||||||
dylanjbarth
|
dylanjbarth
|
||||||
E-M
|
|
||||||
einarc
|
einarc
|
||||||
elpavel
|
E-M
|
||||||
eowin
|
eowin
|
||||||
eRadical
|
|
||||||
Ernest0x
|
Ernest0x
|
||||||
esamattis
|
esamattis
|
||||||
Everspace
|
Everspace
|
||||||
|
@ -90,34 +79,27 @@ F21
|
||||||
faitno
|
faitno
|
||||||
felixfontein
|
felixfontein
|
||||||
flatrocks
|
flatrocks
|
||||||
FlorianPerrot
|
|
||||||
fourjay
|
fourjay
|
||||||
fraff
|
fraff
|
||||||
francescsanjuanmrf
|
|
||||||
g00fy-
|
g00fy-
|
||||||
geerlingguy
|
geerlingguy
|
||||||
georgeOsdDev
|
georgeOsdDev
|
||||||
ghjm
|
ghjm
|
||||||
ghost
|
ghost
|
||||||
GhostLyrics
|
|
||||||
giacmir
|
giacmir
|
||||||
giorgio-v
|
giorgio-v
|
||||||
gkoller
|
gkoller
|
||||||
gotmax23
|
|
||||||
gottwald
|
gottwald
|
||||||
gstorme
|
gstorme
|
||||||
gundalow
|
gundalow
|
||||||
hansbaer
|
hansbaer
|
||||||
hchargois
|
hchargois
|
||||||
hluaces
|
hluaces
|
||||||
hubiongithub
|
|
||||||
hwali
|
hwali
|
||||||
hyperfocus1338
|
hyperfocus1338
|
||||||
IBims1NicerTobi
|
|
||||||
igormukhingmailcom
|
igormukhingmailcom
|
||||||
imjoseangel
|
imjoseangel
|
||||||
infigoKriti
|
infigoKriti
|
||||||
int32bit
|
|
||||||
ipergenitsa
|
ipergenitsa
|
||||||
iredmail
|
iredmail
|
||||||
ivandigiusto
|
ivandigiusto
|
||||||
|
@ -127,7 +109,6 @@ jamescassell
|
||||||
janosmiko
|
janosmiko
|
||||||
jarnold-timeout
|
jarnold-timeout
|
||||||
JaSafieddine
|
JaSafieddine
|
||||||
jb-2197
|
|
||||||
jborean93
|
jborean93
|
||||||
jctanner
|
jctanner
|
||||||
jean-christophe-manciot
|
jean-christophe-manciot
|
||||||
|
@ -155,18 +136,14 @@ kalaisubbiah
|
||||||
kenichi-ogawa-1988
|
kenichi-ogawa-1988
|
||||||
kkeane
|
kkeane
|
||||||
klingac
|
klingac
|
||||||
kmarse
|
|
||||||
koleo
|
|
||||||
kotso
|
kotso
|
||||||
kuntalFreshBooks
|
kuntalFreshBooks
|
||||||
kurtdavis
|
kurtdavis
|
||||||
larsks
|
larsks
|
||||||
laurent-indermuehle
|
|
||||||
ldesgrange
|
ldesgrange
|
||||||
leeadh
|
leeadh
|
||||||
LeonB
|
LeonB
|
||||||
leucos
|
leucos
|
||||||
lkthomas
|
|
||||||
loomsen
|
loomsen
|
||||||
lorin
|
lorin
|
||||||
lowwalker
|
lowwalker
|
||||||
|
@ -178,8 +155,8 @@ markdorison
|
||||||
markotitel
|
markotitel
|
||||||
marktheunissen
|
marktheunissen
|
||||||
markuman
|
markuman
|
||||||
matt-horwood-mayden
|
|
||||||
mattclay
|
mattclay
|
||||||
|
matt-horwood-mayden
|
||||||
mavimo
|
mavimo
|
||||||
maxamillion
|
maxamillion
|
||||||
maxbube
|
maxbube
|
||||||
|
@ -198,15 +175,11 @@ mkrizek
|
||||||
mmoya
|
mmoya
|
||||||
mohag
|
mohag
|
||||||
mohsenSy
|
mohsenSy
|
||||||
moledzki
|
|
||||||
mpdehaan
|
mpdehaan
|
||||||
MRMegaNova
|
|
||||||
MRwangyd
|
MRwangyd
|
||||||
mstinsky
|
|
||||||
mverwijs
|
mverwijs
|
||||||
mvgrimes
|
mvgrimes
|
||||||
mysqlbox
|
mysqlbox
|
||||||
n-cc
|
|
||||||
netmonk
|
netmonk
|
||||||
nhojpatrick
|
nhojpatrick
|
||||||
nicolas-g
|
nicolas-g
|
||||||
|
@ -220,9 +193,7 @@ organman91
|
||||||
p53
|
p53
|
||||||
pakal
|
pakal
|
||||||
paulbadcock
|
paulbadcock
|
||||||
paulcampbell-ayroc
|
|
||||||
pennycoders
|
pennycoders
|
||||||
perlun
|
|
||||||
petoju
|
petoju
|
||||||
petracvv
|
petracvv
|
||||||
pgrenaud
|
pgrenaud
|
||||||
|
@ -243,14 +214,11 @@ richlv
|
||||||
riupie
|
riupie
|
||||||
rndmh3ro
|
rndmh3ro
|
||||||
robertdebock
|
robertdebock
|
||||||
robertsilen
|
|
||||||
robpblake
|
robpblake
|
||||||
rokka-n
|
rokka-n
|
||||||
Roxyrob
|
Roxyrob
|
||||||
roysmith
|
roysmith
|
||||||
rsicart
|
|
||||||
rthouvenin
|
rthouvenin
|
||||||
rujschafer
|
|
||||||
ruudk
|
ruudk
|
||||||
samccann
|
samccann
|
||||||
samdoran
|
samdoran
|
||||||
|
@ -264,7 +232,6 @@ shrikeh
|
||||||
sivel
|
sivel
|
||||||
skalfyfan
|
skalfyfan
|
||||||
skoriy88
|
skoriy88
|
||||||
SoledaD208
|
|
||||||
sperantus
|
sperantus
|
||||||
spoyd
|
spoyd
|
||||||
steverweber
|
steverweber
|
||||||
|
@ -275,7 +242,6 @@ stoned
|
||||||
strixBE
|
strixBE
|
||||||
SWADESNA
|
SWADESNA
|
||||||
tapologo
|
tapologo
|
||||||
tarunm97
|
|
||||||
tejatsk14
|
tejatsk14
|
||||||
tersmitten
|
tersmitten
|
||||||
the
|
the
|
||||||
|
@ -285,22 +251,18 @@ time-palominodb
|
||||||
timorunge
|
timorunge
|
||||||
Tomasthanes
|
Tomasthanes
|
||||||
tomdymond
|
tomdymond
|
||||||
tompal3
|
|
||||||
Tronde
|
Tronde
|
||||||
tuhoanganh
|
|
||||||
tvlooy
|
tvlooy
|
||||||
tyll
|
tyll
|
||||||
UncertaintyP
|
UncertaintyP
|
||||||
unnecessary-username
|
unnecessary-username
|
||||||
v-zhuravlev
|
|
||||||
vamshi8
|
vamshi8
|
||||||
vanne
|
vanne
|
||||||
vdboor
|
vdboor
|
||||||
vmahadev
|
vmahadev
|
||||||
webknjaz
|
v-zhuravlev
|
||||||
webmat
|
webmat
|
||||||
wedi
|
wedi
|
||||||
wfelipew
|
|
||||||
whysthatso
|
whysthatso
|
||||||
willthames
|
willthames
|
||||||
windowsansiblernew
|
windowsansiblernew
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
betanummeric
|
bmalynovytch
|
||||||
|
Jorge-Rodriguez
|
||||||
|
rsicart
|
||||||
laurent-indermuehle
|
laurent-indermuehle
|
||||||
Andersson007
|
Andersson007 (andersson007_ in #ansible-community IRC/Matrix)
|
||||||
|
|
64
Makefile
64
Makefile
|
@ -8,26 +8,33 @@ endif
|
||||||
|
|
||||||
# This match what GitHub Action will do. Disabled by default.
|
# This match what GitHub Action will do. Disabled by default.
|
||||||
ifdef continue_on_errors
|
ifdef continue_on_errors
|
||||||
_continue_on_errors = --continue-on-error
|
_continue_on_errors = --retry-on-error --continue-on-error
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Set command variables based on database engine
|
|
||||||
# Required for MariaDB 11+ which no longer includes mysql named compatible
|
db_ver_tuple := $(subst ., , $(db_engine_version))
|
||||||
# executable symlinks
|
db_engine_version_flat := $(word 1, $(db_ver_tuple))$(word 2, $(db_ver_tuple))
|
||||||
ifeq ($(db_engine_name),mysql)
|
|
||||||
_command = mysqld
|
con_ver_tuple := $(subst ., , $(connector_version))
|
||||||
_health_cmd = mysqladmin
|
connector_version_flat := $(word 1, $(con_ver_tuple))$(word 2, $(con_ver_tuple))$(word 3, $(con_ver_tuple))
|
||||||
|
|
||||||
|
py_ver_tuple := $(subst ., , $(python))
|
||||||
|
python_version_flat := $(word 1, $(py_ver_tuple))$(word 2, $(py_ver_tuple))
|
||||||
|
|
||||||
|
ifeq ($(db_engine_version_flat), 57)
|
||||||
|
db_client := my57
|
||||||
else
|
else
|
||||||
_command = mariadbd
|
db_client := $(db_engine_name)
|
||||||
_health_cmd = mariadb-admin
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
.PHONY: test-integration
|
.PHONY: test-integration
|
||||||
test-integration:
|
test-integration:
|
||||||
@echo -n $(db_engine_name) > tests/integration/db_engine_name
|
@echo -n $(db_engine_name) > tests/integration/db_engine_name
|
||||||
@echo -n $(db_engine_version) > tests/integration/db_engine_version
|
@echo -n $(db_engine_version) > tests/integration/db_engine_version
|
||||||
@echo -n $(connector_name) > tests/integration/connector_name
|
@echo -n $(connector_name) > tests/integration/connector_name
|
||||||
@echo -n $(connector_version) > tests/integration/connector_version
|
@echo -n $(connector_version) > tests/integration/connector_version
|
||||||
|
@echo -n $(python) > tests/integration/python
|
||||||
@echo -n $(ansible) > tests/integration/ansible
|
@echo -n $(ansible) > tests/integration/ansible
|
||||||
|
|
||||||
# Create podman network for systems missing it. Error can be ignored
|
# Create podman network for systems missing it. Error can be ignored
|
||||||
|
@ -40,9 +47,9 @@ test-integration:
|
||||||
--env MYSQL_ROOT_PASSWORD=msandbox \
|
--env MYSQL_ROOT_PASSWORD=msandbox \
|
||||||
--network podman \
|
--network podman \
|
||||||
--publish 3307:3306 \
|
--publish 3307:3306 \
|
||||||
--health-cmd '$(_health_cmd) ping -P 3306 -pmsandbox | grep alive || exit 1' \
|
--health-cmd 'mysqladmin ping -P 3306 -pmsandbox | grep alive || exit 1' \
|
||||||
docker.io/library/$(db_engine_name):$(db_engine_version) \
|
docker.io/library/$(db_engine_name):$(db_engine_version) \
|
||||||
$(_command)
|
mysqld
|
||||||
podman run \
|
podman run \
|
||||||
--detach \
|
--detach \
|
||||||
--replace \
|
--replace \
|
||||||
|
@ -51,9 +58,9 @@ test-integration:
|
||||||
--env MYSQL_ROOT_PASSWORD=msandbox \
|
--env MYSQL_ROOT_PASSWORD=msandbox \
|
||||||
--network podman \
|
--network podman \
|
||||||
--publish 3308:3306 \
|
--publish 3308:3306 \
|
||||||
--health-cmd '$(_health_cmd) ping -P 3306 -pmsandbox | grep alive || exit 1' \
|
--health-cmd 'mysqladmin ping -P 3306 -pmsandbox | grep alive || exit 1' \
|
||||||
docker.io/library/$(db_engine_name):$(db_engine_version) \
|
docker.io/library/$(db_engine_name):$(db_engine_version) \
|
||||||
$(_command)
|
mysqld
|
||||||
podman run \
|
podman run \
|
||||||
--detach \
|
--detach \
|
||||||
--replace \
|
--replace \
|
||||||
|
@ -62,26 +69,13 @@ test-integration:
|
||||||
--env MYSQL_ROOT_PASSWORD=msandbox \
|
--env MYSQL_ROOT_PASSWORD=msandbox \
|
||||||
--network podman \
|
--network podman \
|
||||||
--publish 3309:3306 \
|
--publish 3309:3306 \
|
||||||
--health-cmd '$(_health_cmd) ping -P 3306 -pmsandbox | grep alive || exit 1' \
|
--health-cmd 'mysqladmin ping -P 3306 -pmsandbox | grep alive || exit 1' \
|
||||||
docker.io/library/$(db_engine_name):$(db_engine_version) \
|
docker.io/library/$(db_engine_name):$(db_engine_version) \
|
||||||
$(_command)
|
mysqld
|
||||||
# Setup replication and restart containers using the same subshell to keep variables alive
|
# Setup replication and restart containers
|
||||||
db_ver=$(db_engine_version); \
|
podman exec primary bash -c 'echo -e [mysqld]\\nserver-id=1\\nlog-bin=/var/lib/mysql/primary-bin > /etc/mysql/conf.d/replication.cnf'
|
||||||
maj="$${db_ver%.*.*}"; \
|
podman exec replica1 bash -c 'echo -e [mysqld]\\nserver-id=2\\nlog-bin=/var/lib/mysql/replica1-bin > /etc/mysql/conf.d/replication.cnf'
|
||||||
maj_min="$${db_ver%.*}"; \
|
podman exec replica2 bash -c 'echo -e [mysqld]\\nserver-id=3\\nlog-bin=/var/lib/mysql/replica2-bin > /etc/mysql/conf.d/replication.cnf'
|
||||||
min="$${maj_min#*.}"; \
|
|
||||||
if [[ "$(db_engine_name)" == "mysql" && "$$maj" -eq 8 && "$$min" -ge 2 ]]; then \
|
|
||||||
prima_conf='[mysqld]\\nserver-id=1\\nlog-bin=/var/lib/mysql/primary-bin\\nmysql-native-password=1'; \
|
|
||||||
repl1_conf='[mysqld]\\nserver-id=2\\nlog-bin=/var/lib/mysql/replica1-bin\\nmysql-native-password=1'; \
|
|
||||||
repl2_conf='[mysqld]\\nserver-id=3\\nlog-bin=/var/lib/mysql/replica2-bin\\nmysql-native-password=1'; \
|
|
||||||
else \
|
|
||||||
prima_conf='[mysqld]\\nserver-id=1\\nlog-bin=/var/lib/mysql/primary-bin'; \
|
|
||||||
repl1_conf='[mysqld]\\nserver-id=2\\nlog-bin=/var/lib/mysql/replica1-bin'; \
|
|
||||||
repl2_conf='[mysqld]\\nserver-id=3\\nlog-bin=/var/lib/mysql/replica2-bin'; \
|
|
||||||
fi; \
|
|
||||||
podman exec -e cnf="$$prima_conf" primary bash -c 'echo -e "$${cnf//\\n/\n}" > /etc/mysql/conf.d/replication.cnf'; \
|
|
||||||
podman exec -e cnf="$$repl1_conf" replica1 bash -c 'echo -e "$${cnf//\\n/\n}" > /etc/mysql/conf.d/replication.cnf'; \
|
|
||||||
podman exec -e cnf="$$repl2_conf" replica2 bash -c 'echo -e "$${cnf//\\n/\n}" > /etc/mysql/conf.d/replication.cnf'
|
|
||||||
# Don't restart a container unless it is healthy
|
# Don't restart a container unless it is healthy
|
||||||
while ! podman healthcheck run primary && [[ "$$SECONDS" -lt 120 ]]; do sleep 1; done
|
while ! podman healthcheck run primary && [[ "$$SECONDS" -lt 120 ]]; do sleep 1; done
|
||||||
podman restart -t 30 primary
|
podman restart -t 30 primary
|
||||||
|
@ -100,8 +94,9 @@ test-integration:
|
||||||
https://github.com/ansible/ansible/archive/$(ansible).tar.gz; \
|
https://github.com/ansible/ansible/archive/$(ansible).tar.gz; \
|
||||||
set -x; \
|
set -x; \
|
||||||
ansible-test integration $(target) -v --color --coverage --diff \
|
ansible-test integration $(target) -v --color --coverage --diff \
|
||||||
--docker ubuntu2204 \
|
--docker ghcr.io/ansible-collections/community.mysql/test-container\
|
||||||
--docker-network podman $(_continue_on_errors) $(_keep_containers_alive); \
|
-$(db_client)-py$(python_version_flat)-$(connector_name)$(connector_version_flat):latest \
|
||||||
|
--docker-network podman $(_continue_on_errors) $(_keep_containers_alive) --python $(python); \
|
||||||
set +x
|
set +x
|
||||||
# End of venv
|
# End of venv
|
||||||
|
|
||||||
|
@ -109,6 +104,7 @@ test-integration:
|
||||||
rm tests/integration/db_engine_version
|
rm tests/integration/db_engine_version
|
||||||
rm tests/integration/connector_name
|
rm tests/integration/connector_name
|
||||||
rm tests/integration/connector_version
|
rm tests/integration/connector_version
|
||||||
|
rm tests/integration/python
|
||||||
rm tests/integration/ansible
|
rm tests/integration/ansible
|
||||||
ifndef keep_containers_alive
|
ifndef keep_containers_alive
|
||||||
podman stop --time 0 --ignore primary replica1 replica2
|
podman stop --time 0 --ignore primary replica1 replica2
|
||||||
|
|
104
README.md
104
README.md
|
@ -1,36 +1,14 @@
|
||||||
# MySQL and MariaDB collection for Ansible
|
# MySQL collection for Ansible
|
||||||
[](https://github.com/ansible-collections/community.mysql/actions?query=workflow%3A"Plugins+CI") [](https://codecov.io/gh/ansible-collections/community.mysql) [](https://matrix.to/#/#mysql:ansible.com)
|
[](https://github.com/ansible-collections/community.mysql/actions?query=workflow%3A"Plugins+CI") [](https://github.com/ansible-collections/community.mysql/actions?query=workflow%3A"Roles+CI") [](https://codecov.io/gh/ansible-collections/community.mysql) [](https://matrix.to/#/#mysql:ansible.com)
|
||||||
|
|
||||||
This collection is a part of the Ansible package.
|
This collection is a part of the Ansible package.
|
||||||
|
|
||||||
## Our mission
|
|
||||||
|
|
||||||
The Ansible `community.mysql` collection goals are to produce and maintain simple,
|
|
||||||
flexible, and powerful open-source software for automating MySQL and MariaDB related tasks
|
|
||||||
providing good documentation for easy deployment and use.
|
|
||||||
|
|
||||||
## Code of Conduct
|
## Code of Conduct
|
||||||
|
|
||||||
We follow the [Ansible Code of Conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html) in all our interactions within this project.
|
We follow the [Ansible Code of Conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html) in all our interactions within this project.
|
||||||
|
|
||||||
If you encounter abusive behavior violating the [Ansible Code of Conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html), please refer to the [policy violations](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html#policy-violations) section of the Code of Conduct for information on how to raise a complaint.
|
If you encounter abusive behavior violating the [Ansible Code of Conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html), please refer to the [policy violations](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html#policy-violations) section of the Code of Conduct for information on how to raise a complaint.
|
||||||
|
|
||||||
## Communication
|
|
||||||
|
|
||||||
* Join the Ansible forum:
|
|
||||||
* [Get Help](https://forum.ansible.com/c/help/6): get help or help others.
|
|
||||||
* [Posts tagged with 'mysql'](https://forum.ansible.com/tag/mysql): leverage tags to narrow the scope.
|
|
||||||
* [MySQL Team](https://forum.ansible.com/g/MySQLTeam): by joining the team you will automatically get subscribed to the posts tagged with [mysql](https://forum.ansible.com/tag/mysql).
|
|
||||||
* [Social Spaces](https://forum.ansible.com/c/chat/4): gather and interact with fellow enthusiasts.
|
|
||||||
* [News & Announcements](https://forum.ansible.com/c/news/5): track project-wide announcements including social events.
|
|
||||||
|
|
||||||
* The Ansible [Bullhorn newsletter](https://docs.ansible.com/ansible/devel/community/communication.html#the-bullhorn): used to announce releases and important changes.
|
|
||||||
|
|
||||||
* Matrix chat:
|
|
||||||
* [#mysql:ansible.com](https://matrix.to/#/#mysql:ansible.com) room: questions on how to contribute to this collection.
|
|
||||||
|
|
||||||
For more information about communication, see the [Ansible communication guide](https://docs.ansible.com/ansible/devel/community/communication.html).
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
The content of this collection is made by [people](https://github.com/ansible-collections/community.mysql/blob/main/CONTRIBUTORS) just like you, a community of individuals collaborating on making the world better through developing automation software.
|
The content of this collection is made by [people](https://github.com/ansible-collections/community.mysql/blob/main/CONTRIBUTORS) just like you, a community of individuals collaborating on making the world better through developing automation software.
|
||||||
|
@ -39,7 +17,7 @@ We are actively accepting new contributors.
|
||||||
|
|
||||||
Any kind of contribution is very welcome.
|
Any kind of contribution is very welcome.
|
||||||
|
|
||||||
You don't know how to start? Refer to our [contribution guide](https://github.com/ansible-collections/community.mysql/blob/main/CONTRIBUTING.md) or ask us in the [#mysql:ansible.com room](https://matrix.to/#/#mysql:ansible.com) on [Matrix](https://docs.ansible.com/ansible/devel/community/communication.html#ansible-community-on-matrix)!
|
You don't know how to start? Refer to our [contribution guide](https://github.com/ansible-collections/community.mysql/blob/main/CONTRIBUTING.md)!
|
||||||
|
|
||||||
## Collection maintenance
|
## Collection maintenance
|
||||||
|
|
||||||
|
@ -54,13 +32,21 @@ It is necessary for maintainers of this collection to be subscribed to:
|
||||||
|
|
||||||
They also should be subscribed to Ansible's [The Bullhorn newsletter](https://docs.ansible.com/ansible/devel/community/communication.html#the-bullhorn).
|
They also should be subscribed to Ansible's [The Bullhorn newsletter](https://docs.ansible.com/ansible/devel/community/communication.html#the-bullhorn).
|
||||||
|
|
||||||
## Governance
|
## Communication
|
||||||
|
|
||||||
We, [the MySQL team](https://forum.ansible.com/g/MySQLTeam), use [the forum](https://forum.ansible.com/tag/mysql) posts tagged with `mysql` for general announcements and discussions.
|
We announce releases and important changes through Ansible's [The Bullhorn newsletter](https://eepurl.com/gZmiEP). Be sure you are subscribed.
|
||||||
|
|
||||||
|
Join us on Matrix in the `#mysql:ansible.com` [room](https://matrix.to/#/#mysql:ansible.com), the `#users:ansible.com` [room](https://matrix.to/#/#users:ansible.com) (general use questions and support), `#ansible-community:ansible.com` [room](https://matrix.to/#/#community:ansible.com) (community and collection development questions), and other Matrix rooms or corresponding bridged Libera.Chat channels. See the [Ansible Communication Guide](https://docs.ansible.com/ansible/devel/community/communication.html) for details.
|
||||||
|
|
||||||
|
We take part in the global quarterly [Ansible Contributor Summit](https://github.com/ansible/community/wiki/Contributor-Summit) virtually or in-person. Track [The Bullhorn newsletter](https://eepurl.com/gZmiEP) and join us.
|
||||||
|
|
||||||
|
For more information about communication, refer to the [Ansible Communication guide](https://docs.ansible.com/ansible/devel/community/communication.html).
|
||||||
|
|
||||||
|
## Governance
|
||||||
|
|
||||||
The process of decision making in this collection is based on discussing and finding consensus among participants.
|
The process of decision making in this collection is based on discussing and finding consensus among participants.
|
||||||
|
|
||||||
Every voice is important and every idea is valuable. If you have something on your mind, create an issue or dedicated forum [discussion](https://forum.ansible.com/new-topic?title=topic%20title&body=topic%20body&category=project&tags=mysql) and let's discuss it!
|
Every voice is important and every idea is valuable. If you have something on your mind, create an issue or dedicated discussion and let's discuss it!
|
||||||
|
|
||||||
## Included content
|
## Included content
|
||||||
|
|
||||||
|
@ -69,67 +55,47 @@ Every voice is important and every idea is valuable. If you have something on yo
|
||||||
- [mysql_info](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_info_module.html)
|
- [mysql_info](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_info_module.html)
|
||||||
- [mysql_query](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_query_module.html)
|
- [mysql_query](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_query_module.html)
|
||||||
- [mysql_replication](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_replication_module.html)
|
- [mysql_replication](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_replication_module.html)
|
||||||
- [mysql_role](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_role_module.html)
|
|
||||||
- [mysql_user](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_user_module.html)
|
- [mysql_user](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_user_module.html)
|
||||||
- [mysql_variables](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_variables_module.html)
|
- [mysql_variables](https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_variables_module.html)
|
||||||
|
|
||||||
|
|
||||||
## Releases Support Timeline
|
|
||||||
|
|
||||||
We maintain each major release (1.x.y, 2.x.y, ...) for two years after the next major version is released.
|
|
||||||
|
|
||||||
Here is the table for the support timeline:
|
|
||||||
|
|
||||||
- 1.x.y: released 2020-08-17, EOL
|
|
||||||
- 2.x.y: released 2021-04-15, EOL
|
|
||||||
- 3.x.y: released 2021-12-01, current
|
|
||||||
- 4.x.y: To be released
|
|
||||||
|
|
||||||
|
|
||||||
## Tested with
|
## Tested with
|
||||||
|
|
||||||
### ansible-core
|
### ansible-core
|
||||||
|
|
||||||
- stable-2.17
|
- 2.12
|
||||||
- stable-2.18
|
- 2.13
|
||||||
- stable-2.19
|
- 2.14
|
||||||
- current development version
|
- current development version
|
||||||
|
|
||||||
### Python
|
|
||||||
|
|
||||||
- 3.8 (Unit tests only)
|
|
||||||
- 3.9 (Unit tests only)
|
|
||||||
- 3.10 (Sanity, Units and integrations tests)
|
|
||||||
- 3.11 (Unit tests only, collection version >= 3.10.0)
|
|
||||||
|
|
||||||
### Databases
|
### Databases
|
||||||
|
|
||||||
For MariaDB, only Long Term releases are tested. When multiple LTS are available, we test the oldest and the newest only. Usually breaking changes introduced in the versions in between are also present in the latest version.
|
For MariaDB, only Long Term releases are tested.
|
||||||
|
|
||||||
|
- mysql 5.7.40
|
||||||
|
- mysql 8.0.31
|
||||||
|
- mariadb:10.3.34 (only collection version <= 3.5.1)
|
||||||
|
- mariadb:10.4.24 (only collection version >= 3.5.2)
|
||||||
|
- mariadb:10.5.18 (only collection version >= 3.5.2)
|
||||||
|
- mariadb:10.6.11 (only collection version >= 3.5.2)
|
||||||
|
- mariadb:10.11.?? (waiting for release)
|
||||||
|
|
||||||
- mysql 5.7.40 (collection version < 3.10.0)
|
|
||||||
- mysql 8.0.31 (collection version < 3.10.0)
|
|
||||||
- mysql 8.4.1 (collection version >= 3.10.0) !!! FAILING, no support yet !!!
|
|
||||||
- mariadb:10.3.34 (collection version < 3.5.1)
|
|
||||||
- mariadb:10.4.24 (collection version >= 3.5.2, < 3.10.0)
|
|
||||||
- mariadb:10.5.18 (collection version >= 3.5.2, < 3.10.0)
|
|
||||||
- mariadb:10.5.25 (collection version >= 3.10.0, <3.13.0)
|
|
||||||
- mariadb:10.6.11 (collection version >= 3.5.2, < 3.10.0)
|
|
||||||
- mariadb:10.11.8 (collection version >= 3.10.0)
|
|
||||||
- mariadb:11.4.5 (collection version >= 3.13.0)
|
|
||||||
|
|
||||||
### Database connectors
|
### Database connectors
|
||||||
|
|
||||||
- pymysql 0.7.11 (collection version < 3.10 and MySQL 5.7)
|
- pymysql 0.7.11 (Only tested with MySQL 5.7)
|
||||||
- pymysql 0.9.3
|
- pymysql 0.9.3
|
||||||
- pymysql 0.10.1 (for RHEL8 context)
|
- pymysql 1.0.2 (only collection version >= ???) !!! Unsuported until future release !!!
|
||||||
- pymysql 1.0.2 (collection version >= 3.6.1)
|
- mysqlclient 2.0.1
|
||||||
- pymysql 1.1.1 (collection version >= 3.10.0)
|
- mysqlclient 2.0.3 (only collection version >= 3.5.2)
|
||||||
|
- mysqlclient 2.1.1 (only collection version >= 3.5.2)
|
||||||
|
|
||||||
## External requirements
|
## External requirements
|
||||||
|
|
||||||
The MySQL modules rely on a [PyMySQL](https://github.com/PyMySQL/PyMySQL) connector.
|
The MySQL modules rely on a MySQL connector. The list of supported drivers is below:
|
||||||
|
|
||||||
The `mysqlclient` connector support has been [deprecated](https://github.com/ansible-collections/community.mysql/issues/654) - use `PyMySQL` connector instead! We will stop testing against it in collection version 4.0.0 and remove the related code in 5.0.0.
|
- [PyMySQL](https://github.com/PyMySQL/PyMySQL)
|
||||||
|
- [MySQLdb](https://github.com/PyMySQL/mysqlclient-python)
|
||||||
|
- Support for other Python MySQL connectors may be added in a future release.
|
||||||
|
|
||||||
## Using this collection
|
## Using this collection
|
||||||
|
|
||||||
|
|
73
TESTING.md
73
TESTING.md
|
@ -19,16 +19,19 @@ For now, the makefile only supports Podman.
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
|
|
||||||
- python >= 3.8
|
- python >= 3.8 and <= 3.10
|
||||||
- make
|
- make
|
||||||
- podman
|
- podman
|
||||||
- Minimum 15GB of free space on the device storing containers images and volumes. You can use this command to check: `podman system info --format='{{.Store.GraphRoot}}'|xargs findmnt --noheadings --nofsroot --output SOURCE --target|xargs df -h --output=size,used,avail,pcent,target`
|
- Minimum 15GB of free space on the device storing containers images and volumes. You can use this command to check: `podman system info --format='{{.Store.GraphRoot}}'|xargs findmnt --noheadings --nofsroot --output SOURCE --target|xargs df -h --output=size,used,avail,pcent,target`
|
||||||
- Minimum 2GB of RAM
|
- Minimum 2GB of RAM
|
||||||
|
|
||||||
|
|
||||||
### ansible-test environment
|
### Custom ansible-test containers
|
||||||
|
|
||||||
Integration tests use the default container from ansible-test. Then required packages for the tests are installed from the `setup_controller` target located in the `tests/integration/targets` folder.
|
Our integrations tests use custom containers for ansible-test. Those images have their definition file stored in the directory [test-containers](test-containers/). We build and publish the images on ghcr.io under the ansible-collection namespace: E.G.:
|
||||||
|
`ghcr.io/ansible-collections/community.mysql/test-container-mariadb106-py310-mysqlclient211:latest`.
|
||||||
|
|
||||||
|
Availables images are listed [here](https://github.com/orgs/ansible-collections/packages).
|
||||||
|
|
||||||
|
|
||||||
### Makefile options
|
### Makefile options
|
||||||
|
@ -41,15 +44,14 @@ The Makefile accept the following options
|
||||||
- "3.8"
|
- "3.8"
|
||||||
- "3.9"
|
- "3.9"
|
||||||
- "3.10"
|
- "3.10"
|
||||||
- "3.11" (for stable-2.15+)
|
- Description: If `Python -V` shows an unsupported version, use this option and choose one of the version available on your system. Use `ls /usr/bin/python3*|grep -v config` to list them.
|
||||||
- Description: If `Python -V` shows an unsupported version, use this option to select a compatible Python version available on your system. Use `ls /usr/bin/python3*|grep -v config` to list the available versions (You may have to install one). Unsupported versions are those that are too recent for the Ansible version you are using. In such cases, you will see an error message similar to: 'This version of ansible-test cannot be executed with Python version 3.12.3. Supported Python versions are: 3.9, 3.10, 3.11'.
|
|
||||||
|
|
||||||
- `ansible`
|
- `ansible`
|
||||||
- Mandatory: true
|
- Mandatory: true
|
||||||
- Choices:
|
- Choices:
|
||||||
- "stable-2.15"
|
- "stable-2.12"
|
||||||
- "stable-2.16"
|
- "stable-2.13"
|
||||||
- "stable-2.17"
|
- "stable-2.14"
|
||||||
- "devel"
|
- "devel"
|
||||||
- Description: Version of ansible to install in a venv to run ansible-test
|
- Description: Version of ansible to install in a venv to run ansible-test
|
||||||
|
|
||||||
|
@ -63,28 +65,39 @@ The Makefile accept the following options
|
||||||
- `db_engine_version`
|
- `db_engine_version`
|
||||||
- Mandatory: true
|
- Mandatory: true
|
||||||
- Choices:
|
- Choices:
|
||||||
- "8.0.38" <- mysql
|
- "5.7.40" <- mysql
|
||||||
- "8.4.1" <- mysql (NOT WORKING YET, ansible-test uses Ubuntu 20.04 which is too old to install mysql-community-client 8.4)
|
- "8.0.31" <- mysql
|
||||||
- "10.11.8" <- mariadb
|
- "10.4.24" <- mariadb
|
||||||
- "11.4.5" <- mariadb
|
- "10.5.18" <- mariadb
|
||||||
|
- "10.6.11" <- mariadb
|
||||||
- Description: The tag of the container to use for the service containers that will host a primary database and two replicas. Do not use short version, like `mysql:8` (don't do that) because our tests expect a full version to filter tests precisely. For instance: `when: db_version is version ('8.0.22', '>')`. You can use any tag available on [hub.docker.com/_/mysql](https://hub.docker.com/_/mysql) and [hub.docker.com/_/mariadb](https://hub.docker.com/_/mariadb) but GitHub Action will only use the versions listed above.
|
- Description: The tag of the container to use for the service containers that will host a primary database and two replicas. Do not use short version, like `mysql:8` (don't do that) because our tests expect a full version to filter tests precisely. For instance: `when: db_version is version ('8.0.22', '>')`. You can use any tag available on [hub.docker.com/_/mysql](https://hub.docker.com/_/mysql) and [hub.docker.com/_/mariadb](https://hub.docker.com/_/mariadb) but GitHub Action will only use the versions listed above.
|
||||||
|
|
||||||
- `connector_name`
|
- `connector_name`
|
||||||
- Mandatory: true
|
- Mandatory: true
|
||||||
- Choices:
|
- Choices:
|
||||||
- "pymysql"
|
- "pymysql
|
||||||
- "mysqlclient"
|
- "mysqlclient"
|
||||||
- Description: The python package of the connector to use. In addition to selecting the test container, this value is also used for tests filtering: `when: connector_name == 'pymysql'`.
|
- Description: The python package of the connector to use. In addition to selecting the test container, this value is also used for tests filtering: `when: connector_name == 'pymysql'`.
|
||||||
|
|
||||||
- `connector_version`
|
- `connector_version`
|
||||||
- Mandatory: true
|
- Mandatory: true
|
||||||
- Choices:
|
- Choices:
|
||||||
|
- "0.7.11" <- pymysql (Only for MySQL 5.7)
|
||||||
- "0.9.3" <- pymysql
|
- "0.9.3" <- pymysql
|
||||||
- "0.10.1" <- pymysql
|
- "1.0.2" <- pymysql (Not working, need fix)
|
||||||
- "1.0.2" <- pymysql
|
- "2.0.1" <- mysqlclient
|
||||||
- "1.1.1" <- pymysql
|
- "2.0.3" <- mysqlclient
|
||||||
|
- "2.1.1" <- mysqlclient
|
||||||
- Description: The version of the python package of the connector to use. This value is used to filter tests meant for other connectors.
|
- Description: The version of the python package of the connector to use. This value is used to filter tests meant for other connectors.
|
||||||
|
|
||||||
|
- `python`
|
||||||
|
- Mandatory: true
|
||||||
|
- Choices:
|
||||||
|
- "3.8"
|
||||||
|
- "3.9"
|
||||||
|
- "3.10"
|
||||||
|
- Description: The python version to use in the controller (ansible-test container).
|
||||||
|
|
||||||
- `target`
|
- `target`
|
||||||
- Mandatory: false
|
- Mandatory: false
|
||||||
- Choices:
|
- Choices:
|
||||||
|
@ -104,30 +117,30 @@ tests will overwrite the 3 databases containers so no need to kill them in advan
|
||||||
|
|
||||||
- `continue_on_errors`
|
- `continue_on_errors`
|
||||||
- Mandatory: false
|
- Mandatory: false
|
||||||
- Description: Tells ansible-test to continue on errors. This is the way the GitHub Action's workflow runs the tests. This can be used to catch all errors in a single run, but you'll need to scroll up to find them. Add any value to activate this option: `continue_on_errors=1`
|
- Description: Tells ansible-test to retry on errors and also continue on errors. This is the way the GitHub Action's workflow runs the tests. This can be used to catch all errors in a single run, but you'll need to scroll up to find them. Add any value to activate this option: `continue_on_errors=1`
|
||||||
|
|
||||||
|
|
||||||
#### Makefile usage examples:
|
#### Makefile usage examples:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Run all targets
|
# Run all targets
|
||||||
make ansible="stable-2.16" db_engine_name="mysql" db_engine_version="8.0.31" connector_name="pymysql" connector_version="1.0.2"
|
make ansible="stable-2.12" db_engine_name="mysql" db_engine_version="5.7.40" python="3.8" connector_name="pymysql" connector_version="0.7.11"
|
||||||
|
|
||||||
# A single target
|
# A single target
|
||||||
make ansible="stable-2.16" db_engine_name="mysql" db_engine_version="8.0.31" connector_name="pymysql" connector_version="1.0.2" target="test_mysql_info"
|
make ansible="stable-2.14" db_engine_name="mysql" db_engine_version="5.7.40" python="3.8" connector_name="pymysql" connector_version="0.7.11" target="test_mysql_info"
|
||||||
|
|
||||||
# Keep databases and ansible tests containers alives
|
# Keep databases and ansible tests containers alives
|
||||||
# A single target and continue on errors
|
# A single target and continue on errors
|
||||||
make ansible="stable-2.17" db_engine_name="mysql" db_engine_version="8.0.31" connector_name="mysqlclient" connector_version="2.0.3" target="test_mysql_query" keep_containers_alive=1 continue_on_errors=1
|
make ansible="stable-2.14" db_engine_name="mysql" db_engine_version="8.0.31" python="3.9" connector_name="mysqlclient" connector_version="2.0.3" target="test_mysql_query" keep_containers_alive=1 continue_on_errors=1
|
||||||
|
|
||||||
# If your system has an usupported version of Python:
|
# If your system has an usupported version of Python:
|
||||||
make local_python_version="3.10" ansible="stable-2.17" db_engine_name="mariadb" db_engine_version="11.4.5" connector_name="pymysql" connector_version="1.0.2"
|
make local_python_version="3.8" ansible="stable-2.14" db_engine_name="mariadb" db_engine_version="10.6.11" python="3.9" connector_name="pymysql" connector_version="0.9.3"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Run all tests
|
### Run all tests
|
||||||
|
|
||||||
GitHub Action offer a test matrix that run every combination of MySQL, MariaDB and Connector against each other. To reproduce this, this repo provides a script called *run_all_tests.py*.
|
GitHub Action offer a test matrix that run every combination of Python, MySQL, MariaDB and Connector against each other. To reproduce this, this repo provides a script called *run_all_tests.py*.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
|
@ -136,8 +149,18 @@ python run_all_tests.py
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### Add a new Connector or Database version
|
### Add a new Python, Connector or Database version
|
||||||
|
|
||||||
New components version should be added to this file: [.github/workflows/ansible-test-plugins.yml](https://github.com/ansible-collections/community.mysql/tree/main/.github/workflows)
|
You can look into `[.github/workflows/ansible-test-plugins.yml](https://github.com/ansible-collections/community.mysql/tree/main/.github/workflows)` to see how those containers are built using [build-docker-image.yml](https://github.com/ansible-collections/community.mysql/blob/main/.github/workflows/build-docker-image.yml) and all [docker-image-xxx.yml](https://github.com/ansible-collections/community.mysql/blob/main/.github/workflows/docker-image-mariadb103-py38-mysqlclient201.yml) files.
|
||||||
|
|
||||||
Be careful to not add too much tests. The matrix creates an exponential number of virtual machines!
|
1. Add a workflow in [.github/workflows/](.github/workflows)
|
||||||
|
1. Add a new folder in [test-containers](test-containers) containing a new Dockerfile. Your container must contains 3 things:
|
||||||
|
- Python
|
||||||
|
- A connector: The python package to connect to the database (pymysql, mysqlclient, ...)
|
||||||
|
- A mysql client to prepare databases before our tests starts. This client must provide both `mysql` and `mysqldump` commands.
|
||||||
|
1. Add your version in the matrix of *.github/workflows/ansible-test-plugins.yml*. You can use [run_all_tests.py](run_all_tests.py) to help you see what the matrix will be. Simply comment out the line `os.system(make_cmd)` before runing the script. You can also add `print(len(matrix))` to display how many tests there will be on GitHub Action.
|
||||||
|
1. Ask the lead maintainer to mark your new image(s) as `public` under [https://github.com/orgs/ansible-collections/packages](https://github.com/orgs/ansible-collections/packages)
|
||||||
|
|
||||||
|
After pushing your commit to the remote, the container will be built and published on ghcr.io. Have a look in the "Action" tab to see if it worked. In case of error `failed to copy: io: read/write on closed pipe` re-run the workflow, this append unfortunately a lot.
|
||||||
|
|
||||||
|
To see the docker image produced, go to the package page in the ansible-collection namespace [https://github.com/orgs/ansible-collections/packages](https://github.com/orgs/ansible-collections/packages). This page indicate a "Published x days ago" that is updated infrequently. To see the last time the container has been updated you must click on its title and look in the right hands side bellow the title "Last published".
|
||||||
|
|
|
@ -1,327 +1,333 @@
|
||||||
ancestor: 2.0.0
|
ancestor: null
|
||||||
releases:
|
releases:
|
||||||
3.0.0:
|
1.0.0:
|
||||||
changes:
|
|
||||||
breaking_changes:
|
|
||||||
- mysql_replication - remove ``Is_Slave`` and ``Is_Master`` return values (were
|
|
||||||
replaced with ``Is_Primary`` and ``Is_Replica`` (https://github.com/ansible-collections/community.mysql/issues/145).
|
|
||||||
- mysql_replication - remove the mode options values containing ``master``/``slave``
|
|
||||||
and the master_use_gtid option ``slave_pos`` (were replaced with corresponding
|
|
||||||
``primary``/``replica`` values) (https://github.com/ansible-collections/community.mysql/issues/145).
|
|
||||||
- mysql_user - remove support for the `REQUIRESSL` special privilege as it has
|
|
||||||
ben superseded by the `tls_requires` option (https://github.com/ansible-collections/community.mysql/discussions/121).
|
|
||||||
- mysql_user - validate privileges using database engine directly (https://github.com/ansible-collections/community.mysql/issues/234
|
|
||||||
https://github.com/ansible-collections/community.mysql/pull/243). Do not validate
|
|
||||||
privileges in this module anymore.
|
|
||||||
release_summary: 'This is the major release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all breaking changes to the modules in this collection
|
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 2.3.2.'
|
|
||||||
fragments:
|
|
||||||
- 243-get-rid-of-privs-comparison.yml
|
|
||||||
- 244-remove-requiressl-privilege.yaml
|
|
||||||
- 3.0.0.yml
|
|
||||||
- 300-mysql_replication_remove_master_slave.yml
|
|
||||||
release_date: '2021-12-01'
|
|
||||||
3.1.0:
|
|
||||||
changes:
|
changes:
|
||||||
bugfixes:
|
bugfixes:
|
||||||
- Collection core functions - use vendored version of ``distutils.version``
|
- mysql - dont mask ``mysql_connect`` function errors from modules (https://github.com/ansible/ansible/issues/64560).
|
||||||
instead of the deprecated Python standard library ``distutils`` (https://github.com/ansible-collections/community.mysql/pull/269).
|
- mysql_db - fix Broken pipe error appearance when state is import and the target
|
||||||
|
file is compressed (https://github.com/ansible/ansible/issues/20196).
|
||||||
|
- mysql_db - fix bug in the ``db_import`` function introduced by https://github.com/ansible/ansible/pull/56721
|
||||||
|
(https://github.com/ansible/ansible/issues/65351).
|
||||||
|
- mysql_info - add parameter for __collect to get only what are wanted (https://github.com/ansible-collections/community.general/pull/136).
|
||||||
|
- mysql_replication - allow to pass empty values to parameters (https://github.com/ansible/ansible/issues/23976).
|
||||||
|
- mysql_user - Fix idempotence when long grant lists are used (https://github.com/ansible/ansible/issues/68044)
|
||||||
|
- mysql_user - Remove false positive ``no_log`` warning for ``update_password``
|
||||||
|
option
|
||||||
|
- mysql_user - add ``INVOKE LAMBDA`` privilege support (https://github.com/ansible-collections/community.general/issues/283).
|
||||||
|
- mysql_user - add missed privileges to support (https://github.com/ansible-collections/community.general/issues/617).
|
||||||
|
- mysql_user - fix ``host_all`` arguments conversion string formatting error
|
||||||
|
(https://github.com/ansible/ansible/issues/29644).
|
||||||
|
- mysql_user - fix overriding password to the same (https://github.com/ansible-collections/community.general/issues/543).
|
||||||
|
- mysql_user - fix support privileges with underscore (https://github.com/ansible/ansible/issues/66974).
|
||||||
|
- mysql_user - fix the error No database selected (https://github.com/ansible/ansible/issues/68070).
|
||||||
|
- mysql_user - make sure current_pass_hash is a string before using it in comparison
|
||||||
|
(https://github.com/ansible/ansible/issues/60567).
|
||||||
|
- mysql_variable - fix the module doesn't support variables name with dot (https://github.com/ansible/ansible/issues/54239).
|
||||||
minor_changes:
|
minor_changes:
|
||||||
- Added explicit description of the supported versions of databases and connectors.
|
- mysql_db - add ``master_data`` parameter (https://github.com/ansible/ansible/pull/66048).
|
||||||
Changes to the collection are **NOT** tested against database versions older
|
- mysql_db - add ``skip_lock_tables`` option (https://github.com/ansible/ansible/pull/66688).
|
||||||
than `mysql 5.7.31` and `mariadb 10.2.37` or connector versions older than
|
- mysql_db - add the ``check_implicit_admin`` parameter (https://github.com/ansible/ansible/issues/24418).
|
||||||
`pymysql 0.7.10` and `mysqlclient 2.0.1`. (https://github.com/ansible-collections/community.mysql/discussions/141)
|
- mysql_db - add the ``dump_extra_args`` parameter (https://github.com/ansible/ansible/pull/67747).
|
||||||
- mysql_user - added the ``force_context`` boolean option to set the default
|
- mysql_db - add the ``executed_commands`` returned value (https://github.com/ansible/ansible/pull/65498).
|
||||||
database context for the queries to be the ``mysql`` database. This way replication/binlog
|
- mysql_db - add the ``force`` parameter (https://github.com/ansible/ansible/pull/65547).
|
||||||
filters can catch the statements (https://github.com/ansible-collections/community.mysql/issues/265).
|
- mysql_db - add the ``restrict_config_file`` parameter (https://github.com/ansible/ansible/issues/34488).
|
||||||
|
- mysql_db - add the ``unsafe_login_password`` parameter (https://github.com/ansible/ansible/issues/63955).
|
||||||
|
- mysql_db - add the ``use_shell`` parameter (https://github.com/ansible/ansible/issues/20196).
|
||||||
|
- mysql_info - add ``exclude_fields`` parameter (https://github.com/ansible/ansible/issues/63319).
|
||||||
|
- mysql_info - add ``global_status`` filter parameter option and return (https://github.com/ansible/ansible/pull/63189).
|
||||||
|
- mysql_info - add ``return_empty_dbs`` parameter to list empty databases (https://github.com/ansible/ansible/issues/65727).
|
||||||
|
- mysql_replication - add ``channel`` parameter (https://github.com/ansible/ansible/issues/29311).
|
||||||
|
- mysql_replication - add ``connection_name`` parameter (https://github.com/ansible/ansible/issues/46243).
|
||||||
|
- mysql_replication - add ``fail_on_error`` parameter (https://github.com/ansible/ansible/pull/66252).
|
||||||
|
- mysql_replication - add ``master_delay`` parameter (https://github.com/ansible/ansible/issues/51326).
|
||||||
|
- mysql_replication - add ``master_use_gtid`` parameter (https://github.com/ansible/ansible/pull/62648).
|
||||||
|
- mysql_replication - add ``queries`` return value (https://github.com/ansible/ansible/pull/63036).
|
||||||
|
- mysql_replication - add support of ``resetmaster`` choice to ``mode`` parameter
|
||||||
|
(https://github.com/ansible/ansible/issues/42870).
|
||||||
|
- mysql_user - ``priv`` parameter can be string or dictionary (https://github.com/ansible/ansible/issues/57533).
|
||||||
|
- mysql_user - add TLS REQUIRES parameters (https://github.com/ansible-collections/community.mysql/pull/9).
|
||||||
|
- mysql_user - add ``plugin_auth_string`` parameter (https://github.com/ansible/ansible/pull/44267).
|
||||||
|
- mysql_user - add ``plugin_hash_string`` parameter (https://github.com/ansible/ansible/pull/44267).
|
||||||
|
- mysql_user - add ``plugin`` parameter (https://github.com/ansible/ansible/pull/44267).
|
||||||
|
- mysql_user - add the resource_limits parameter (https://github.com/ansible-collections/community.general/issues/133).
|
||||||
|
- mysql_variables - add ``mode`` parameter (https://github.com/ansible/ansible/issues/60119).
|
||||||
|
release_summary: 'This is the first proper release of the ``community.mysql``
|
||||||
|
collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
were added after the release of Ansible 2.9.0.
|
||||||
|
|
||||||
|
'
|
||||||
|
fragments:
|
||||||
|
- 1.0.0.yml
|
||||||
|
- 142-mysql_user_add_resource_limit_parameter.yml
|
||||||
|
- 151-mysql_db_add_use_shell_parameter.yml
|
||||||
|
- 18-mysql_user-update_password-no_log.yml
|
||||||
|
- 225-mysql_user_fix_no_database_selected.yml
|
||||||
|
- 285-mysql_user_invoke_lambda_support.yml
|
||||||
|
- 369-mysql_user_add_tls_requires.yml
|
||||||
|
- 428-mysql_db_add_unsafe_login_password_param.yml
|
||||||
|
- 468-mysql_db_add_restrict_config_file_param.yml
|
||||||
|
- 486-mysql_db_add_check_implicit_admin_parameter.yml
|
||||||
|
- 490-mysql_user_fix_cursor_errors.yml
|
||||||
|
- 609-mysql_user_fix_overriding_password_to_the_same.yml
|
||||||
|
- 618-mysql_user_add_missed_privileges.yml
|
||||||
|
- 62648-mysql_replication_add_master_use_gtid_param.yml
|
||||||
|
- 63036-mysql_replication_add_return_value.yml
|
||||||
|
- 63130-mysql_replication_add_master_delay_parameter.yml
|
||||||
|
- 63189-mysql_info-global-status.yml
|
||||||
|
- 63229-mysql_replication_add_connection_name_parameter.yml
|
||||||
|
- 63271-mysql_replication_add_channel_parameter.yml
|
||||||
|
- 63321-mysql_replication_add_resetmaster_to_mode.yml
|
||||||
|
- 63371-mysql_info_add_exclude_fields_parameter.yml
|
||||||
|
- 63546-mysql_replication_allow_to_pass_empty_values.yml
|
||||||
|
- 63547-mysql_variables_add_mode_param.yml
|
||||||
|
- 64059-mysql_user_fix_password_comparison.yaml
|
||||||
|
- 64585-mysql_dont_mask_mysql_connect_errors_from_modules.yml
|
||||||
|
- 65498-mysql_db_add_executed_commands_return_val.yml
|
||||||
|
- 65547-mysql_db_add_force_param.yml
|
||||||
|
- 65755-mysql_info_doesnt_list_empty_dbs.yml
|
||||||
|
- 65789-mysql_user_add_plugin_authentication_parameters.yml
|
||||||
|
- 66048-mysql_add_master_data_parameter.yml
|
||||||
|
- 66252-mysql_replication_fail_on_error.yml
|
||||||
|
- 66688-mysql_db_add_skip_lock_tables_option.yml
|
||||||
|
- 66801-mysql_user_priv_can_be_dict.yml
|
||||||
|
- 66806-mysql_variables_not_support_variables_with_dot.yml
|
||||||
|
- 66974-mysql_user_doesnt_support_privs_with_underscore.yml
|
||||||
|
- 67337-fix-proxysql-mysql-cursor.yaml
|
||||||
|
- 67747-mysql_db_add_dump_extra_args_param.yml
|
||||||
|
- 67767-mysql_db_fix_bug_introduced_by_56721.yml
|
||||||
|
- mysql_info_add_parameter.yml
|
||||||
|
- mysql_user_idempotency.yml
|
||||||
|
release_date: '2020-08-17'
|
||||||
|
1.0.1:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql_db - fix false warning related to ``unsafe_login_password`` option (https://github.com/ansible-collections/community.mysql/issues/33).
|
||||||
|
- mysql_user - added tests to verify that TLS requirements are removed with
|
||||||
|
an empty ``tls_requires`` option (https://github.com/ansible-collections/community.mysql/issues/20).
|
||||||
|
- mysql_user - correct procedure to check existing TLS requirements (https://github.com/ansible-collections/community.mysql/pull/26).
|
||||||
|
- mysql_user - minor syntax fixes (https://github.com/ansible-collections/community.mysql/pull/26).
|
||||||
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
have been added after the release of ``community.mysql`` 1.0.0.
|
||||||
|
|
||||||
|
'
|
||||||
|
fragments:
|
||||||
|
- 1.0.1.yml
|
||||||
|
- 26-remove_tls_requirements.yml
|
||||||
|
- 34-mysql_db_fix_false_warning.yml
|
||||||
|
release_date: '2020-09-29'
|
||||||
|
1.0.2:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql_user - fix module's crash when modifying a user with ``host_all`` (https://github.com/ansible-collections/community.mysql/issues/39).
|
||||||
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
have been added after the release of ``community.mysql`` 1.0.1.
|
||||||
|
|
||||||
|
'
|
||||||
|
fragments:
|
||||||
|
- 1.0.2.yml
|
||||||
|
- 40-mysql_user_fix_error_when_host_all_used.yml
|
||||||
|
release_date: '2020-10-01'
|
||||||
|
1.1.0:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql modules - fix crash when ``!includedir`` option is in config file (https://github.com/ansible-collections/community.mysql/issues/46).
|
||||||
|
minor_changes:
|
||||||
|
- mysql modules - add the ``check_hostname`` option (https://github.com/ansible-collections/community.mysql/issues/28).
|
||||||
|
- mysql modules - patch the ``Connection`` class to add a destructor that ensures
|
||||||
|
connections to the server are explicitly closed (https://github.com/ansible-collections/community.mysql/pull/44).
|
||||||
|
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
have been added after the release of ``community.mysql`` 1.0.2.
|
||||||
|
|
||||||
|
'
|
||||||
|
fragments:
|
||||||
|
- 1.1.0.yml
|
||||||
|
- 35-disable-hostname-check.yml
|
||||||
|
- 44-close-connection.yml
|
||||||
|
- 47-mysql_modules_fix_failings_when_include_dir_in_config_file.yml
|
||||||
|
release_date: '2020-10-13'
|
||||||
|
1.1.1:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql_query - fix failing when single-row query contains commas (https://github.com/ansible-collections/community.mysql/issues/51).
|
||||||
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
|
||||||
|
have been added after the release of ``community.mysql`` 1.1.0.
|
||||||
|
|
||||||
|
'
|
||||||
|
fragments:
|
||||||
|
- 1.1.1.yml
|
||||||
|
- 53-mysql_query_fix_single_query_with_commas.yml
|
||||||
|
release_date: '2020-11-03'
|
||||||
|
1.1.2:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql_db - fix false warning related to ``unsafe_login_password`` option (https://github.com/ansible-collections/community.mysql/issues/33).
|
||||||
|
- mysql_replication - fix crashes of mariadb >= 10.5.1 and mysql >= 8.0.22 caused
|
||||||
|
by using deprecated terminology (https://github.com/ansible-collections/community.mysql/issues/70).
|
||||||
|
- mysql_user - fixed change detection when using append_privs (https://github.com/ansible-collections/community.mysql/pull/72).
|
||||||
|
minor_changes:
|
||||||
|
- mysql_query - simple refactoring of query type check (https://github.com/ansible-collections/community.mysql/pull/58).
|
||||||
|
- mysql_user - simple refactoring of priv type check (https://github.com/ansible-collections/community.mysql/pull/58).
|
||||||
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
|
||||||
|
have been added after the release of ``community.mysql`` 1.1.1.'
|
||||||
|
fragments:
|
||||||
|
- 1.1.2.yml
|
||||||
|
- 58-mysql_query_refactoring.yml
|
||||||
|
- 71-mysql_replication_add_replica_keyword_support.yml
|
||||||
|
- 72-mysql_db_fix_false_warning.yml
|
||||||
|
- 72-mysql_user_change_detection.yml
|
||||||
|
release_date: '2020-12-18'
|
||||||
|
1.2.0:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql_user - add ``SHOW_ROUTINE`` privilege support (https://github.com/ansible-collections/community.mysql/issues/86).
|
||||||
|
- mysql_user - fixed creating user with encrypted password in MySQL 8.0 (https://github.com/ansible-collections/community.mysql/pull/79).
|
||||||
|
minor_changes:
|
||||||
|
- mysql_user - refactor to reduce cursor.execute() calls in preparation for
|
||||||
|
adding query logging (https://github.com/ansible-collections/community.mysql/pull/76).
|
||||||
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
This changelog contains all changes to the modules in this collection
|
This changelog contains all changes to the modules in this collection
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 3.0.0.'
|
that have been added after the release of ``community.mysql`` 1.1.2.'
|
||||||
fragments:
|
fragments:
|
||||||
- 141-supported-database-and-connector-versions.yaml
|
- 1.2.0.yml
|
||||||
- 266-default-database-for-mysql-user.yml
|
- 76-mysql-user-query-refact.yaml
|
||||||
|
- 79-mysql-user-tests-and-fixes.yml
|
||||||
|
- 87-mysql_user_show_routine_support.yml
|
||||||
|
release_date: '2021-01-18'
|
||||||
|
1.3.0:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql_user - fix handling of INSERT, UPDATE, REFERENCES on columns (https://github.com/ansible-collections/community.mysql/issues/106).
|
||||||
|
- mysql_user - the module is not idempotent when SELECT on columns granted (https://github.com/ansible-collections/community.mysql/issues/99).
|
||||||
|
major_changes:
|
||||||
|
- mysql_replication - the mode options values ``getslave``, ``startslave``,
|
||||||
|
``stopslave``, ``resetslave``, ``resetslaveall` and the master_use_gtid option
|
||||||
|
``slave_pos`` are deprecated (see the alternative values) and will be removed
|
||||||
|
in ``community.mysql`` 3.0.0 (https://github.com/ansible-collections/community.mysql/pull/97).
|
||||||
|
- mysql_replication - the word ``SLAVE`` in messages returned by the module
|
||||||
|
will be changed to ``REPLICA`` in ``community.mysql`` 2.0.0 (https://github.com/ansible-collections/community.mysql/issues/98).
|
||||||
|
minor_changes:
|
||||||
|
- mysql_replication - deprecate offending terminology, add alternative choices
|
||||||
|
to the ``mode`` option (https://github.com/ansible-collections/community.mysql/issues/78).
|
||||||
|
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection
|
||||||
|
|
||||||
|
that have been added after the release of ``community.mysql`` 1.2.0.'
|
||||||
|
fragments:
|
||||||
|
- 1.3.0.yml
|
||||||
|
- 100-mysql_user_not_idemponent_when_select_on_columns_granted.yml
|
||||||
|
- 107-mysql_user_fix_grant_on_col_handling.yml
|
||||||
|
- 97-mysql_replication_deprecate_offending_terminology.yml
|
||||||
|
release_date: '2021-03-08'
|
||||||
|
1.4.0:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql_user - add support for ``REPLICA MONITOR`` privilege (https://github.com/ansible-collections/community.mysql/issues/105).
|
||||||
|
major_changes:
|
||||||
|
- mysql_user - the ``REQUIRESSL`` is an alias for the ``ssl`` key in the ``tls_requires``
|
||||||
|
option in ``community.mysql`` 2.0.0 and support will be dropped altogether
|
||||||
|
in ``community.mysql`` 3.0.0 (https://github.com/ansible-collections/community.mysql/issues/121).
|
||||||
|
minor_changes:
|
||||||
|
- mysql module utils - change deprecated connection parameters ``passwd`` and
|
||||||
|
``db`` to ``password`` and ``database`` (https://github.com/ansible-collections/community.mysql/pull/116).
|
||||||
|
- mysql_collection - introduce codebabse split to handle divergences between
|
||||||
|
MySQL and MariaDB (https://github.com/ansible-collections/community.mysql/pull/103).
|
||||||
|
- mysql_info - add `version.full` and `version.suffix` return values (https://github.com/ansible-collections/community.mysql/issues/114).
|
||||||
|
- mysql_user - deprecate the ``REQUIRESSL`` privilege (https://github.com/ansible-collections/community.mysql/issues/101).
|
||||||
|
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection
|
||||||
|
|
||||||
|
that have been added after the release of ``community.mysql`` 1.3.0.'''
|
||||||
|
fragments:
|
||||||
|
- 1.4.0.yml
|
||||||
|
- 101-drop-requiressl-support.yml
|
||||||
|
- 103-mysql_and_mariadb_divergence.yml
|
||||||
|
- 108-mysql_priv_add_grant.yml
|
||||||
|
- 115-add_mysql_full_version_suffix_return_var.yml
|
||||||
|
- 116-change_deprecated_connection_ parameters.yml
|
||||||
|
release_date: '2021-04-16'
|
||||||
|
1.4.1:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql - revert changes of connector arguments made in pull request 116 causing
|
||||||
|
the invalid keyword argument error (https://github.com/ansible-collections/community.mysql/pull/116).
|
||||||
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection
|
||||||
|
|
||||||
|
that have been added after the release of ``community.mysql`` 1.4.0.'
|
||||||
|
fragments:
|
||||||
|
- 1.4.1.yml
|
||||||
|
- 153-mysql_revert_connector_changes.yml
|
||||||
|
release_date: '2021-04-23'
|
||||||
|
1.4.2:
|
||||||
|
changes:
|
||||||
|
minor_changes:
|
||||||
|
- mysql_query - correctly reflect changed status in replace statements (https://github.com/ansible-collections/community.mysql/pull/193).
|
||||||
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
|
||||||
|
have been added after the release of ``community.mysql`` 1.4.1.'
|
||||||
|
fragments:
|
||||||
|
- 1.4.2.yml
|
||||||
|
- 193-reflect_changed_status_in_replace_statements.yml
|
||||||
|
release_date: '2021-08-11'
|
||||||
|
1.4.3:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- mysql_info - fix TypeError failure when there are databases that do not contain
|
||||||
|
tables (https://github.com/ansible-collections/community.mysql/issues/204).
|
||||||
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
|
||||||
|
have been added after the release of ``community.mysql`` 1.4.2.'
|
||||||
|
fragments:
|
||||||
|
- 1.4.3.yml
|
||||||
|
- 205-mysql_info_fix_failure_when_no_tables_in_db.yml
|
||||||
|
release_date: '2021-09-23'
|
||||||
|
1.4.4:
|
||||||
|
changes:
|
||||||
|
bugfixes:
|
||||||
|
- Collection core functions - use vendored version of ``distutils.version``
|
||||||
|
instead of the deprecated Python standard library ``distutils`` (https://github.com/ansible-collections/community.mysql/pull/269).
|
||||||
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
|
||||||
|
have been added after the release of ``community.mysql`` 1.4.3.'
|
||||||
|
fragments:
|
||||||
|
- 1.4.4.yml
|
||||||
- 267-prepare_for_distutils_be_removed.yml
|
- 267-prepare_for_distutils_be_removed.yml
|
||||||
- 3.1.0.yml
|
|
||||||
release_date: '2022-01-18'
|
release_date: '2022-01-18'
|
||||||
3.1.1:
|
1.4.5:
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_role - make the ``set_default_role_all`` parameter actually working
|
|
||||||
(https://github.com/ansible-collections/community.mysql/pull/282).
|
|
||||||
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 3.1.0.'
|
|
||||||
fragments:
|
|
||||||
- 282-mysql_role_fix_set_default_role_all_argument.yml
|
|
||||||
- 3.1.1.yml
|
|
||||||
release_date: '2022-02-16'
|
|
||||||
3.1.2:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- Collection core functions - fixes related to the mysqlclient Python connector
|
|
||||||
(https://github.com/ansible-collections/community.mysql/issues/292).
|
|
||||||
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 3.1.1.'
|
|
||||||
fragments:
|
|
||||||
- 0-mysqlclient.yml
|
|
||||||
- 3.1.2.yml
|
|
||||||
release_date: '2022-03-14'
|
|
||||||
3.1.3:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_replication - fails when using the `primary_use_gtid` option with `slave_pos`
|
|
||||||
or `replica_pos` (https://github.com/ansible-collections/community.mysql/issues/335).
|
|
||||||
- mysql_role - remove redundant connection closing (https://github.com/ansible-collections/community.mysql/pull/330).
|
|
||||||
- 'mysql_user - fix the possibility for a race condition that breaks certain
|
|
||||||
(circular) replication configurations when ``DROP USER`` is executed on multiple
|
|
||||||
nodes in the replica set. Adding ``IF EXISTS`` avoids the need to use ``sql_log_bin:
|
|
||||||
no`` making the statement always replication safe (https://github.com/ansible-collections/community.mysql/pull/287).'
|
|
||||||
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 3.1.2.'
|
|
||||||
fragments:
|
|
||||||
- 0-mysql_replication_replica_pos.yml
|
|
||||||
- 3.1.3.yml
|
|
||||||
- 307-mysql_user_add_if_exists_to_drop.yml
|
|
||||||
- 329-mysql_role-remove-redudant-connection-closing.yml
|
|
||||||
release_date: '2022-04-26'
|
|
||||||
3.10.0:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_info - Add ``plugin_hash_string`` to ``users_info`` filter's output.
|
|
||||||
The existing ``plugin_auth_string`` contained the hashed password and thus
|
|
||||||
is missleading, it will be removed from community.mysql 4.0.0. (https://github.com/ansible-collections/community.mysql/pull/629).
|
|
||||||
- mysql_user - Added a warning to update_password's on_new_username option if
|
|
||||||
multiple accounts with the same username but different passwords exist (https://github.com/ansible-collections/community.mysql/pull/642).
|
|
||||||
- mysql_user - Fix ``tls_requires`` not removing ``SSL`` and ``X509`` when sets
|
|
||||||
as empty (https://github.com/ansible-collections/community.mysql/pull/628).
|
|
||||||
- mysql_user - Fix idempotence when using variables from the ``users_info``
|
|
||||||
filter of ``mysql_info`` as an input (https://github.com/ansible-collections/community.mysql/pull/628).
|
|
||||||
- mysql_user - Fixed an IndexError in the update_password functionality introduced
|
|
||||||
in PR https://github.com/ansible-collections/community.mysql/pull/580 and
|
|
||||||
released in community.mysql 3.8.0. If you used this functionality, please
|
|
||||||
avoid versions 3.8.0 to 3.9.0 (https://github.com/ansible-collections/community.mysql/pull/642).
|
|
||||||
- mysql_user - add correct ``ed25519`` auth plugin handling (https://github.com/ansible-collections/community.mysql/issues/6).
|
|
||||||
- mysql_variables - fix the module always changes on boolean values (https://github.com/ansible-collections/community.mysql/issues/652).
|
|
||||||
deprecated_features:
|
|
||||||
- collection - support of mysqlclient connector is deprecated - use PyMySQL
|
|
||||||
connector instead! We will stop testing against it in collection version 4.0.0
|
|
||||||
and remove the related code in 5.0.0 (https://github.com/ansible-collections/community.mysql/issues/654).
|
|
||||||
- mysql_info - The ``users_info`` filter returned variable ``plugin_auth_string``
|
|
||||||
contains the hashed password and it's misleading, it will be removed from
|
|
||||||
community.mysql 4.0.0. Use the `plugin_hash_string` return value instead (https://github.com/ansible-collections/community.mysql/pull/629).
|
|
||||||
minor_changes:
|
|
||||||
- mysql_info - Add ``tls_requires`` returned value for the ``users_info`` filter
|
|
||||||
(https://github.com/ansible-collections/community.mysql/pull/628).
|
|
||||||
- mysql_info - return a database server engine used (https://github.com/ansible-collections/community.mysql/issues/644).
|
|
||||||
- mysql_replication - Adds support for `CHANGE REPLICATION SOURCE TO` statement
|
|
||||||
(https://github.com/ansible-collections/community.mysql/issues/635).
|
|
||||||
- mysql_replication - Adds support for `SHOW BINARY LOG STATUS` and `SHOW BINLOG
|
|
||||||
STATUS` on getprimary mode.
|
|
||||||
- mysql_replication - Improve detection of IsReplica and IsPrimary by inspecting
|
|
||||||
the dictionary returned from the SQL query instead of relying on variable
|
|
||||||
types. This ensures compatibility with changes in the connector or the output
|
|
||||||
of SHOW REPLICA STATUS and SHOW MASTER STATUS, allowing for easier maintenance
|
|
||||||
if these change in the future.
|
|
||||||
- mysql_user - Add salt parameter to generate static hash for `caching_sha2_password`
|
|
||||||
and `sha256_password` plugins.
|
|
||||||
release_summary: 'This is a minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
|
|
||||||
collection that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 0-mysql_user.yml
|
|
||||||
- 1-mysql_info.yml
|
|
||||||
- 2-mysql_variables.yml
|
|
||||||
- 3-deprecate_mysqlclient.yml
|
|
||||||
- 3.10.0.yml
|
|
||||||
- add_salt_param_to_gen_sha256_hash.yml
|
|
||||||
- get_primary_show_binary_log_status.yml
|
|
||||||
- improve_get_replica_primary_status.yml
|
|
||||||
- lie_fix_mysql_user_on_new_username.yml
|
|
||||||
- lie_fix_plugin_hash_string_return.yml
|
|
||||||
- mysql_user_tls_requires.yml
|
|
||||||
- supports_mysql_change_replication_source_to.yml
|
|
||||||
release_date: '2024-08-22'
|
|
||||||
3.10.1:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_user - module makes changes when is executed with ``plugin_auth_string``
|
|
||||||
parameter and check mode.
|
|
||||||
deprecated_features:
|
|
||||||
- mysql_user - the ``user`` alias of the ``name`` argument has been deprecated
|
|
||||||
and will be removed in collection version 5.0.0. Use the ``name`` argument
|
|
||||||
instead.
|
|
||||||
release_summary: 'This is a patch release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
Besides a bugfix, it contains an important upcoming breaking-change information.'
|
|
||||||
fragments:
|
|
||||||
- 0-mysql_user.yml
|
|
||||||
- 3.10.1.yml
|
|
||||||
- 596-fix-check-changes.yaml
|
|
||||||
release_date: '2024-09-04'
|
|
||||||
3.10.2:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_user - add correct ``ed25519`` auth plugin handling when creating a
|
|
||||||
user (https://github.com/ansible-collections/community.mysql/issues/672).
|
|
||||||
release_summary: 'This is a bugfix release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
|
|
||||||
collection that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 0-mysql_user.yml
|
|
||||||
- 3.10.2.yml
|
|
||||||
release_date: '2024-09-06'
|
|
||||||
3.10.3:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_user - add correct ``ed25519`` auth plugin handling when creating a
|
|
||||||
user (https://github.com/ansible-collections/community.mysql/pull/676).
|
|
||||||
release_summary: 'This is a bugfix release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
|
|
||||||
collection that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 0-mysql_user.yml
|
|
||||||
- 3.10.3.yml
|
|
||||||
release_date: '2024-09-09'
|
|
||||||
3.11.0:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_user,mysql_role - The sql_mode ANSI_QUOTES affects how the modules mysql_user
|
|
||||||
and mysql_role compare the existing privileges with the configured privileges,
|
|
||||||
as well as decide whether double quotes or backticks should be used in the
|
|
||||||
GRANT statements. Pointing out in issue 671, the modules mysql_user and mysql_role
|
|
||||||
allow users to enable/disable ANSI_QUOTES in session variable (within a DB
|
|
||||||
session, the session variable always overwrites the global one). But due to
|
|
||||||
the issue, the modules do not check for ANSI_MODE in the session variable,
|
|
||||||
instead, they only check in the GLOBAL one.That behavior is not only limiting
|
|
||||||
the users' flexibility, but also not allowing users to explicitly disable
|
|
||||||
ANSI_MODE to work around such bugs like https://bugs.mysql.com/bug.php?id=115953.
|
|
||||||
(https://github.com/ansible-collections/community.mysql/issues/671)
|
|
||||||
minor_changes:
|
|
||||||
- mysql_info - adds the count of tables for each database to the returned values.
|
|
||||||
It is possible to exclude this new field using the ``db_table_count`` exclusion
|
|
||||||
filter. (https://github.com/ansible-collections/community.mysql/pull/691)
|
|
||||||
release_summary: 'This is a minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
|
|
||||||
collection that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 3.11.0.yml
|
|
||||||
- 591-mysql_info-db_tables_count.yml
|
|
||||||
- 671-modules_util_user.yml
|
|
||||||
release_date: '2024-11-19'
|
|
||||||
3.12.0:
|
|
||||||
changes:
|
|
||||||
minor_changes:
|
|
||||||
- mysql_db - added ``zstd`` (de)compression support for ``import``/``dump``
|
|
||||||
states (https://github.com/ansible-collections/community.mysql/issues/696).
|
|
||||||
- mysql_query - returns the ``execution_time_ms`` list containing execution
|
|
||||||
time per query in milliseconds.
|
|
||||||
release_summary: 'This is a minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
|
|
||||||
collection that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 0-mysql_query-returns-exec-time-ms.yml
|
|
||||||
- 3.12.0.yml
|
|
||||||
- 696-mysql-db-add-zstd-support.yml
|
|
||||||
release_date: '2025-01-17'
|
|
||||||
3.13.0:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_db - fix dump and import to find MariaDB binaries (mariadb and mariadb-dump)
|
|
||||||
when MariaDB 11+ is used and symbolic links to MySQL binaries are absent.
|
|
||||||
minor_changes:
|
|
||||||
- Integration tests for MariaDB 11.4 have replaced those for 10.5. The previous
|
|
||||||
version is now 10.11.
|
|
||||||
- mysql_user - add ``locked`` option to lock/unlock users, this is mainly used
|
|
||||||
to have users that will act as definers on stored procedures.
|
|
||||||
release_summary: 'This is a minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
|
|
||||||
collection that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 3.13.0.yml
|
|
||||||
- 702-user_locking.yaml
|
|
||||||
- tests_mariadb_11_4.yml
|
|
||||||
release_date: '2025-03-21'
|
|
||||||
3.14.0:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_info - fix a crash (ERROR 1141, There is no such grant defined for user
|
|
||||||
'PUBLIC' on host '%') when using the ``users_info`` filter with a PUBLIC role
|
|
||||||
present in MariaDB 10.11+. Do note that the fix doesn't change the fact that
|
|
||||||
the module won't return the privileges from the PUBLIC role in the users privileges
|
|
||||||
list. It can't do that because you have to login as the particular user and
|
|
||||||
use `SHOW GRANTS FOR CURRENT_USER`. We considered using an aggregation with
|
|
||||||
the `SHOW GRANTS FOR PUBLIC` command. However, this approach would make copying
|
|
||||||
users from one server to another transform the privileges inherited from the
|
|
||||||
role as if they were direct privileges on the user.
|
|
||||||
- mysql_replication - fixed an issue where setting ``primary_ssl_verify_server_cert``
|
|
||||||
to false had no effect (https://github.com/ansible-collections/community.mysql/issues/689).
|
|
||||||
minor_changes:
|
|
||||||
- mysql_replication - change default value for ``primary_ssl_verify_server_cert``
|
|
||||||
from False to None. This should not affect existing playbooks (https://github.com/ansible-collections/community.mysql/pull/707).
|
|
||||||
release_summary: 'This is a minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
|
|
||||||
that have been made after the previous release.'''
|
|
||||||
fragments:
|
|
||||||
- 707-source_ssl_verify_server_cert.yml
|
|
||||||
- grant_to_public.yml
|
|
||||||
- release_3_14_0.yml
|
|
||||||
release_date: '2025-05-23'
|
|
||||||
3.15.0:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_query - fix a Python 2 compatibility issue caused by the addition of
|
|
||||||
``execution_time_ms`` in version 3.12 (see https://github.com/ansible-collections/community.mysql/issues/716).
|
|
||||||
- 'mysql_user - fix a crash (unable to parse the MySQL grant string: SET DEFAULT
|
|
||||||
ROLE `somerole` FOR `someuser`@`%`) when using the ``mysql_user`` module with
|
|
||||||
a DEFAULT role present in MariaDB. The DEFAULT role is now ignored by the
|
|
||||||
parser (https://github.com/ansible-collections/community.mysql/issues/710).'
|
|
||||||
minor_changes:
|
|
||||||
- mysql_db - Add support for ``sql_log_bin`` option (https://github.com/ansible-collections/community.mysql/issues/700).
|
|
||||||
release_summary: 'This is a minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
|
|
||||||
that have been made after the previous release.'''
|
|
||||||
fragments:
|
|
||||||
- 3.15.0.yml
|
|
||||||
- 723-myqsl_db_supports_sql_log_bin.yaml
|
|
||||||
- fix_python2_compatibility.yml
|
|
||||||
- fix_user_module_for_default_roles.yml
|
|
||||||
release_date: '2025-07-24'
|
|
||||||
3.2.0:
|
|
||||||
changes:
|
changes:
|
||||||
bugfixes:
|
bugfixes:
|
||||||
- mysql_user - fix missing dynamic privileges after revoke and grant privileges
|
- mysql_user - fix missing dynamic privileges after revoke and grant privileges
|
||||||
to user (https://github.com/ansible-collections/community.mysql/issues/120).
|
to user (https://github.com/ansible-collections/community.mysql/issues/120).
|
||||||
- mysql_user - fix parsing privs when a user has roles assigned (https://github.com/ansible-collections/community.mysql/issues/231).
|
- mysql_user - fix parsing privs when a user has roles assigned (https://github.com/ansible-collections/community.mysql/issues/231).
|
||||||
|
- 'mysql_user - fix the possibility for a race condition that breaks certain
|
||||||
|
(circular) replication configurations when ``DROP USER`` is executed on multiple
|
||||||
|
nodes in the replica set. Adding ``IF EXISTS`` avoids the need to use ``sql_log_bin:
|
||||||
|
no`` making the statement always replication safe (https://github.com/ansible-collections/community.mysql/pull/287).'
|
||||||
major_changes:
|
major_changes:
|
||||||
- The community.mysql collection no longer supports ``Ansible 2.9`` and ``ansible-base
|
- The community.mysql collection no longer supports ``Ansible 2.9`` and ``ansible-base
|
||||||
2.10``. While we take no active measures to prevent usage and there are no
|
2.10``. While we take no active measures to prevent usage and there are no
|
||||||
|
@ -330,298 +336,90 @@ releases:
|
||||||
End of Life and if you are still using them, you should consider upgrading
|
End of Life and if you are still using them, you should consider upgrading
|
||||||
to the ``latest Ansible / ansible-core 2.11 or later`` as soon as possible
|
to the ``latest Ansible / ansible-core 2.11 or later`` as soon as possible
|
||||||
(https://github.com/ansible-collections/community.mysql/pull/343).
|
(https://github.com/ansible-collections/community.mysql/pull/343).
|
||||||
minor_changes:
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
- 'mysql_user and mysql_role: Add the argument ``subtract_privs`` (boolean,
|
|
||||||
default false, mutually exclusive with ``append_privs``). If set, the privileges
|
|
||||||
given in ``priv`` are revoked and existing privileges are kept (https://github.com/ansible-collections/community.mysql/pull/333).'
|
|
||||||
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules in this collection
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 3.1.3.'
|
have been added after the release of ``community.mysql`` 1.4.4.'
|
||||||
fragments:
|
fragments:
|
||||||
- 001-mysql_user_fix_pars_users_with_roles_assigned.yml
|
- 001-mysql_user_fix_pars_users_with_roles_assigned.yml
|
||||||
- 3.2.0.yml
|
- 1.4.5.yml
|
||||||
- 333-mysql_user-mysql_role-add-subtract_privileges-argument.yml
|
- 307-mysql_user_add_if_exists_to_drop.yml
|
||||||
- 338-mysql_user_fix_missing_dynamic_privileges.yml
|
- 338-mysql_user_fix.yml
|
||||||
- drop_support_of_2.9-2.10.yml
|
- drop_support_of_2.9-2.10.yml
|
||||||
release_date: '2022-05-13'
|
release_date: '2022-05-13'
|
||||||
3.2.1:
|
1.4.6:
|
||||||
changes:
|
changes:
|
||||||
bugfixes:
|
bugfixes:
|
||||||
- Include ``PSF-license.txt`` file for ``plugins/module_utils/_version.py``.
|
- Include ``PSF-license.txt`` file for ``plugins/module_utils/_version.py``.
|
||||||
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
This changelog contains all changes to the modules in this collection
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 3.2.0.'
|
have been added after the release of ``community.mysql`` 1.4.5.'
|
||||||
fragments:
|
fragments:
|
||||||
- 3.2.1.yml
|
- 1.4.6.yml
|
||||||
- psf-license.yml
|
- psf-license.yml
|
||||||
release_date: '2022-05-17'
|
release_date: '2022-05-17'
|
||||||
3.3.0:
|
1.4.7:
|
||||||
changes:
|
changes:
|
||||||
bugfixes:
|
bugfixes:
|
||||||
- mysql_query - fix false change reports when ``IF EXISTS/IF NOT EXISTS`` clause
|
- mysql_query - fix false change reports when ``IF EXISTS/IF NOT EXISTS`` clause
|
||||||
is used (https://github.com/ansible-collections/community.mysql/issues/268).
|
is used (https://github.com/ansible-collections/community.mysql/issues/268).
|
||||||
- 'mysql_role - don''t add members to a role when creating the role and ``detach_members:
|
|
||||||
true`` is set (https://github.com/ansible-collections/community.mysql/pull/367).'
|
|
||||||
- 'mysql_role - in some cases (when "SHOW GRANTS" did not use backticks for
|
|
||||||
quotes), no unwanted members were detached from the role (and redundant "GRANT"
|
|
||||||
statements were executed for wanted members). This is fixed by querying the
|
|
||||||
existing role members from the mysql.role_edges (MySQL) or mysql.roles_mapping
|
|
||||||
(MariaDB) tables instead of parsing the "SHOW GRANTS" output (https://github.com/ansible-collections/community.mysql/pull/368).
|
|
||||||
|
|
||||||
'
|
|
||||||
- mysql_user - fix logic when ``update_password`` is set to ``on_create`` for
|
- mysql_user - fix logic when ``update_password`` is set to ``on_create`` for
|
||||||
users using ``plugin*`` arguments (https://github.com/ansible-collections/community.mysql/issues/334).
|
users using ``plugin*`` arguments (https://github.com/ansible-collections/community.mysql/issues/334).
|
||||||
The ``on_create`` sets ``password`` to None for old mysql_native_authentication
|
The ``on_create`` sets ``password`` to None for old mysql_native_authentication
|
||||||
but not for authentiation methods which uses the ``plugin*`` arguments. This
|
but not for authentiation methods which uses the ``plugin*`` arguments. This
|
||||||
PR changes this so ``on_create`` also exchange ``plugin``, ``plugin_hash_string``,
|
PR changes this so ``on_create`` also exchange ``plugin``, ``plugin_hash_string``,
|
||||||
``plugin_auth_string`` to None in the list of arguments to change
|
``plugin_auth_string`` to None in the list of arguments to change
|
||||||
minor_changes:
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
- 'mysql_role - add the argument ``members_must_exist`` (boolean, default true).
|
|
||||||
The assertion that the users supplied in the ``members`` argument exist is
|
|
||||||
only executed when the new argument ``members_must_exist`` is ``true``, to
|
|
||||||
allow opt-out (https://github.com/ansible-collections/community.mysql/pull/369).
|
|
||||||
|
|
||||||
'
|
This changelog contains all changes to the modules in this collection that
|
||||||
- 'mysql_user - Add the option ``on_new_username`` to argument ``update_password``
|
|
||||||
to reuse the password (plugin and authentication_string) when creating a new
|
|
||||||
user if some user with the same name already exists. If the existing user
|
|
||||||
with the same name have varying passwords, the password from the arguments
|
|
||||||
is used like with ``update_password: always`` (https://github.com/ansible-collections/community.mysql/pull/365).
|
|
||||||
|
|
||||||
'
|
have been added after the release of ``community.mysql`` 1.4.6.'
|
||||||
- 'mysql_user - Add the result field ``password_changed`` (boolean). It is true,
|
|
||||||
when the user got a new password. When the user was created with ``update_password:
|
|
||||||
on_new_username`` and an existing password was reused, ``password_changed``
|
|
||||||
is false (https://github.com/ansible-collections/community.mysql/pull/365).
|
|
||||||
|
|
||||||
'
|
|
||||||
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 3.2.1.'
|
|
||||||
fragments:
|
fragments:
|
||||||
- 3.3.0.yml
|
- 1.4.7.yml
|
||||||
- 322-mysql_query_fix_false_change_report.yml
|
- 322-mysql_query_fix_false_change_report.yml
|
||||||
- 334-mysql_user_fix_logic_on_oncreate.yml
|
- 334-mysql_user_fix_logic_on_oncreate.yml
|
||||||
- 365-mysql_user-add-on_new_username-and-password_changed.yml
|
|
||||||
- 367-mysql_role-fix-deatch-members.yml
|
|
||||||
- 368-mysql_role-fix-member-detection.yml
|
|
||||||
- 369_mysql_role-add-members_must_exist.yml
|
|
||||||
release_date: '2022-06-02'
|
release_date: '2022-06-02'
|
||||||
3.4.0:
|
1.4.8:
|
||||||
changes:
|
changes:
|
||||||
bugfixes:
|
bugfixes:
|
||||||
- Include ``simplified_bsd.txt`` license file for various module utils.
|
- Include ``simplified_bsd.txt`` license file for various module utils.
|
||||||
- mysql_db - Using compression masks errors messages from mysql_dump. By default
|
|
||||||
the fix is inactive to ensure retro-compatibility with system without bash.
|
|
||||||
To activate the fix, use the module option ``pipefail=true`` (https://github.com/ansible-collections/community.mysql/issues/256).
|
|
||||||
- mysql_replication - when the ``primary_ssl`` argument is set to ``no``, the
|
|
||||||
module will turn off SSL (https://github.com/ansible-collections/community.mysql/issues/393).
|
|
||||||
major_changes:
|
|
||||||
- mysql_db - the ``pipefail`` argument's default value will be changed to ``true``
|
|
||||||
in community.mysql 4.0.0. If your target machines do not use ``bash`` as a
|
|
||||||
default interpreter, set ``pipefail`` to ``false`` explicitly. However, we
|
|
||||||
strongly recommend setting up ``bash`` as a default and ``pipefail=true``
|
|
||||||
as it will protect you from getting broken dumps you don't know about (https://github.com/ansible-collections/community.mysql/issues/407).
|
|
||||||
minor_changes:
|
|
||||||
- mysql_db - add the ``chdir`` argument to avoid failings when a dump file contains
|
|
||||||
relative paths (https://github.com/ansible-collections/community.mysql/issues/395).
|
|
||||||
- mysql_db - add the ``pipefail`` argument to avoid broken dumps when ``state``
|
|
||||||
is ``dump`` and compression is used (https://github.com/ansible-collections/community.mysql/issues/256).
|
|
||||||
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 3.3.0.'
|
|
||||||
fragments:
|
|
||||||
- 0-mysql_db_add_chdir_argument.yml
|
|
||||||
- 1-mysql_replication_can_disable_master_ssl.yml
|
|
||||||
- 2-mysql_db_announce.yml
|
|
||||||
- 3.4.0.yml
|
|
||||||
- fix-256-mysql_dump-errors.yml
|
|
||||||
- simplified-bsd-license.yml
|
|
||||||
release_date: '2022-08-02'
|
|
||||||
3.5.0:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_user - grant option was revoked accidentally when modifying users. This
|
|
||||||
fix revokes grant option only when privs are setup to do that (https://github.com/ansible-collections/community.mysql/issues/77#issuecomment-1209693807).
|
|
||||||
minor_changes:
|
|
||||||
- 'mysql_replication - add a new option: ``primary_ssl_verify_server_cert``
|
|
||||||
(https://github.com//pull/435).'
|
|
||||||
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules in this collection
|
|
||||||
|
|
||||||
that have been added after the release of ``community.mysql`` 3.4.0.'
|
|
||||||
fragments:
|
|
||||||
- 3.5.0.yml
|
|
||||||
- 434-do-not-revoke-grant-option-always.yaml
|
|
||||||
- 435-mysql_replication_verify_server_cert.yml
|
|
||||||
release_date: '2022-09-05'
|
|
||||||
3.5.1:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_user, mysql_role - mysql/mariadb recent versions translate 'ALL PRIVILEGES'
|
|
||||||
to a list of specific privileges. That caused a change every time we modified
|
|
||||||
user privileges. This fix compares privs before and after user modification
|
|
||||||
to avoid this infinite change (https://github.com/ansible-collections/community.mysql/issues/77).
|
|
||||||
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
release_summary: 'This is the patch release of the ``community.mysql`` collection.
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
This changelog contains all changes to the modules in this collection that
|
||||||
|
|
||||||
that have been made after the previous release.'
|
have been added after the release of ``community.mysql`` 1.4.7.'
|
||||||
fragments:
|
fragments:
|
||||||
- 3.5.1.yml
|
- 1.4.8.yml
|
||||||
- 438-fix-privilege-changing-everytime.yml
|
- simplified-bsd-license.yml
|
||||||
release_date: '2022-09-09'
|
release_date: '2022-07-28'
|
||||||
3.6.0:
|
1.5.0:
|
||||||
changes:
|
changes:
|
||||||
bugfixes:
|
|
||||||
- mysql_user - when revoke privs consists only of ``GRANT``, a 2nd revoke query
|
|
||||||
is executed with empty privs to revoke that ended in an SQL exception (https://github.com/ansible-collections/community.mysql/pull/503).
|
|
||||||
- mysql_variables - add uppercase character pattern to regex to allow GLOBAL
|
|
||||||
variables containing uppercase characters. This recognizes variable names
|
|
||||||
used in Galera, for example, ``wsrep_OSU_method``, which breaks the normal
|
|
||||||
pattern of all lowercase characters (https://github.com/ansible-collections/community.mysql/pull/501).
|
|
||||||
minor_changes:
|
minor_changes:
|
||||||
- mysql_info - add ``connector_name`` and ``connector_version`` to returned
|
- mysql_info - add ``connector_name`` and ``connector_version`` to returned
|
||||||
values (https://github.com/ansible-collections/community.mysql/pull/497).
|
values (https://github.com/ansible-collections/community.mysql/pull/497).
|
||||||
- mysql_role - enable auto_commit to avoid MySQL metadata table lock (https://github.com/ansible-collections/community.mysql/issues/479).
|
release_summary: 'This is bugfix release of the ``community.mysql`` collection.
|
||||||
- mysql_user - add plugin_auth_string as optional parameter to use a specific
|
|
||||||
pam service if pam/auth_pam plugin is used (https://github.com/ansible-collections/community.mysql/pull/445).
|
|
||||||
- mysql_user - add the ``session_vars`` argument to set session variables at
|
|
||||||
the beginning of module execution (https://github.com/ansible-collections/community.mysql/issues/478).
|
|
||||||
- mysql_user - display a more informative invalid privilege exception. Changes
|
|
||||||
the exception handling of the granting permission logic to show the query
|
|
||||||
executed , params and the exception message granting privileges fails` (https://github.com/ansible-collections/community.mysql/issues/465).
|
|
||||||
- mysql_user - enable auto_commit to avoid MySQL metadata table lock (https://github.com/ansible-collections/community.mysql/issues/479).
|
|
||||||
- setup_mysql - update MySQL tarball URL (https://github.com/ansible-collections/community.mysql/pull/491).
|
|
||||||
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
This changelog contains all changes to the modules and plugins in this collection
|
||||||
|
|
||||||
that have been made after the previous release.'
|
that have been made after the previous release.'
|
||||||
fragments:
|
fragments:
|
||||||
- 0_mysql_user_session_vars.yml
|
- 1.5.0.yml
|
||||||
- 3.6.0.yml
|
|
||||||
- 445_add_service_name_to_plugin_pam_auth_pam_usage.yml
|
|
||||||
- 465-display_more_informative_invalid_priv_exceptiion.yml
|
|
||||||
- 479_enable_auto_commit.yml
|
|
||||||
- 479_enable_auto_commit_part2.yml
|
|
||||||
- 491_fix_download_url.yaml
|
|
||||||
- 497_mysql_info_returns_connector_name_and_version.yml
|
- 497_mysql_info_returns_connector_name_and_version.yml
|
||||||
- 503-fix-revoke-grant-only.yml
|
- backport-stable-2-pr-452.yml
|
||||||
- mysql_variables_allow_uppercase_identifiers.yml
|
|
||||||
release_date: '2023-02-08'
|
release_date: '2023-02-08'
|
||||||
3.7.0:
|
1.5.1:
|
||||||
changes:
|
|
||||||
minor_changes:
|
|
||||||
- mysql module utils - change deprecated connection parameters ``passwd`` and
|
|
||||||
``db`` to ``password`` and ``database`` (https://github.com/ansible-collections/community.mysql/pull/177).
|
|
||||||
- mysql_user - add ``MAX_STATEMENT_TIME`` support for mariadb to the ``resource_limits``
|
|
||||||
argument (https://github.com/ansible-collections/community.mysql/issues/211).
|
|
||||||
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
|
|
||||||
that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 177-change_deprecated_connection_parameters.yml
|
|
||||||
- 3.7.0.yml
|
|
||||||
- 523-add-max_statement_time_resource-limit.yml
|
|
||||||
release_date: '2023-05-05'
|
|
||||||
3.7.1:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql module utils - use the connection arguments ``db`` instead of ``database``
|
|
||||||
and ``passwd`` instead of ``password`` when running with older mysql drivers
|
|
||||||
(MySQLdb < 2.1.0 or PyMySQL < 1.0.0) (https://github.com/ansible-collections/community.mysql/pull/551).
|
|
||||||
release_summary: 'This is a patch release of the community.mysql collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
|
|
||||||
that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 3.7.1.yml
|
|
||||||
- 551-fix_connection_arguments_driver_compatability.yaml
|
|
||||||
release_date: '2023-05-22'
|
|
||||||
3.7.2:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql module utils - use the connection arguments ``db`` instead of ``database``
|
|
||||||
and ``passwd`` instead of ``password`` when running with MySQLdb < 2.0.0 (https://github.com/ansible-collections/community.mysql/pull/553).
|
|
||||||
release_summary: 'This is a patch release of the community.mysql collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this collection
|
|
||||||
|
|
||||||
that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 3.7.2.yml
|
|
||||||
- 553_fix_connection_arguemnts_for_old_mysqldb_driver.yaml
|
|
||||||
release_date: '2023-05-25'
|
|
||||||
3.8.0:
|
|
||||||
changes:
|
changes:
|
||||||
major_changes:
|
major_changes:
|
||||||
- The community.mysql collection no longer supports ``ansible-core 2.12`` and
|
- The ``community.mysql`` 1.x.y release stream is now effectively End of Life.
|
||||||
``ansible-core 2.13``. While we take no active measures to prevent usage and
|
No more releases will be made. This follows the decision to support each major
|
||||||
there are no plans to introduce incompatible code to the modules, we will
|
release for two years. This decision stems from this
|
||||||
stop testing those versions. Both are or will soon be End of Life and if you
|
discussion (https://github.com/ansible-collections/community.mysql/discussions/537)
|
||||||
are still using them, you should consider upgrading to the ``latest Ansible
|
release_summary: Final maintenance release of ``community.mysql`` major version
|
||||||
/ ansible-core 2.15 or later`` as soon as possible (https://github.com/ansible-collections/community.mysql/pull/574).
|
1.
|
||||||
- mysql_role - the ``column_case_sensitive`` argument's default value will be
|
|
||||||
changed to ``true`` in community.mysql 4.0.0. If your playbook expected the
|
|
||||||
column to be automatically uppercased for your roles privileges, you should
|
|
||||||
set this to false explicitly (https://github.com/ansible-collections/community.mysql/issues/578).
|
|
||||||
- mysql_user - the ``column_case_sensitive`` argument's default value will be
|
|
||||||
changed to ``true`` in community.mysql 4.0.0. If your playbook expected the
|
|
||||||
column to be automatically uppercased for your users privileges, you should
|
|
||||||
set this to false explicitly (https://github.com/ansible-collections/community.mysql/issues/577).
|
|
||||||
minor_changes:
|
|
||||||
- mysql_info - add filter ``users_info`` (https://github.com/ansible-collections/community.mysql/pull/580).
|
|
||||||
- mysql_role - add ``column_case_sensitive`` option to prevent field names from
|
|
||||||
being uppercased (https://github.com/ansible-collections/community.mysql/pull/569).
|
|
||||||
- mysql_user - add ``column_case_sensitive`` option to prevent field names from
|
|
||||||
being uppercased (https://github.com/ansible-collections/community.mysql/pull/569).
|
|
||||||
release_summary: 'This is the minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
|
|
||||||
collection that have been made after the previous release.'
|
|
||||||
fragments:
|
fragments:
|
||||||
- 3.8.0.yml
|
- 1.5.1.yml
|
||||||
- 569_fix_column_uppercasing.yml
|
- 490_refactor_integration_tests.yml
|
||||||
- drop_ansible_core_2_12_and_2_13.yml
|
release_date: '2023-05-04'
|
||||||
- lie_mysql_info_users_info.yml
|
|
||||||
release_date: '2023-10-25'
|
|
||||||
3.9.0:
|
|
||||||
changes:
|
|
||||||
bugfixes:
|
|
||||||
- mysql_info - the ``slave_status`` filter was returning an empty list on MariaDB
|
|
||||||
with multiple replication channels. It now returns all channels by running
|
|
||||||
``SHOW ALL SLAVES STATUS`` for MariaDB servers (https://github.com/ansible-collections/community.mysql/issues/603).
|
|
||||||
major_changes:
|
|
||||||
- Collection version 2.*.* is EOL, no more bugfixes will be backported. Please
|
|
||||||
consider upgrading to the latest version.
|
|
||||||
minor_changes:
|
|
||||||
- mysql_user - add the ``password_expire`` and ``password_expire_interval``
|
|
||||||
arguments to implement the password expiration management for mysql user (https://github.com/ansible-collections/community.mysql/pull/598).
|
|
||||||
- mysql_user - add user attribute support via the ``attributes`` parameter and
|
|
||||||
return value (https://github.com/ansible-collections/community.mysql/pull/604).
|
|
||||||
release_summary: 'This is a minor release of the ``community.mysql`` collection.
|
|
||||||
|
|
||||||
This changelog contains all changes to the modules and plugins in this
|
|
||||||
|
|
||||||
collection that have been made after the previous release.'
|
|
||||||
fragments:
|
|
||||||
- 0-stable-2-eol.yml
|
|
||||||
- 3.9.0.yml
|
|
||||||
- 598-password_expire-support-for-mysql_user.yml
|
|
||||||
- 602-show-all-slaves-status.yaml
|
|
||||||
- 604-user-attributes.yaml
|
|
||||||
release_date: '2024-02-22'
|
|
||||||
|
|
|
@ -25,5 +25,5 @@ sections:
|
||||||
- Bugfixes
|
- Bugfixes
|
||||||
- - known_issues
|
- - known_issues
|
||||||
- Known Issues
|
- Known Issues
|
||||||
title: Community MySQL and MariaDB Collection
|
title: Community MySQL Collection
|
||||||
trivial_section_name: trivial
|
trivial_section_name: trivial
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
---
|
---
|
||||||
namespace: community
|
namespace: community
|
||||||
name: mysql
|
name: mysql
|
||||||
version: 3.15.0
|
version: 1.5.1
|
||||||
readme: README.md
|
readme: README.md
|
||||||
authors:
|
authors:
|
||||||
- Ansible community
|
- Ansible community
|
||||||
description: MySQL and MariaDB collection for Ansible
|
description: MySQL collection for Ansible
|
||||||
license_file: COPYING
|
license_file: COPYING
|
||||||
tags:
|
tags:
|
||||||
- database
|
- database
|
||||||
|
|
|
@ -1,11 +1,2 @@
|
||||||
---
|
---
|
||||||
requires_ansible: '>=2.9.10'
|
requires_ansible: '>=2.9.10'
|
||||||
action_groups:
|
|
||||||
all:
|
|
||||||
- mysql_db
|
|
||||||
- mysql_info
|
|
||||||
- mysql_query
|
|
||||||
- mysql_replication
|
|
||||||
- mysql_role
|
|
||||||
- mysql_user
|
|
||||||
- mysql_variables
|
|
||||||
|
|
|
@ -71,21 +71,24 @@ options:
|
||||||
- Whether to validate the server host name when an SSL connection is required. Corresponds to MySQL CLIs C(--ssl) switch.
|
- Whether to validate the server host name when an SSL connection is required. Corresponds to MySQL CLIs C(--ssl) switch.
|
||||||
- Setting this to C(false) disables hostname verification. Use with caution.
|
- Setting this to C(false) disables hostname verification. Use with caution.
|
||||||
- Requires pymysql >= 0.7.11.
|
- Requires pymysql >= 0.7.11.
|
||||||
|
- This option has no effect on MySQLdb.
|
||||||
type: bool
|
type: bool
|
||||||
version_added: '1.1.0'
|
version_added: '1.1.0'
|
||||||
requirements:
|
requirements:
|
||||||
- PyMySQL (Python 2.7 and Python 3.x)
|
- mysqlclient (Python 3.5+) or
|
||||||
|
- PyMySQL (Python 2.7 and Python 3.x) or
|
||||||
|
- MySQLdb (Python 2.x)
|
||||||
notes:
|
notes:
|
||||||
- Requires the PyMySQL (Python 2.7 and Python 3.X) package installed on the remote host.
|
- Requires the PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) package installed on the remote host.
|
||||||
The Python package may be installed with apt-get install python-pymysql (Ubuntu; see M(ansible.builtin.apt)) or
|
The Python package may be installed with apt-get install python-pymysql (Ubuntu; see M(ansible.builtin.apt)) or
|
||||||
yum install python2-PyMySQL (RHEL/CentOS/Fedora; see M(ansible.builtin.yum)). You can also use dnf install python2-PyMySQL
|
yum install python2-PyMySQL (RHEL/CentOS/Fedora; see M(ansible.builtin.yum)). You can also use dnf install python2-PyMySQL
|
||||||
for newer versions of Fedora; see M(ansible.builtin.dnf).
|
for newer versions of Fedora; see M(ansible.builtin.dnf).
|
||||||
- Be sure you have PyMySQL library installed on the target machine
|
- Be sure you have mysqlclient, PyMySQL, or MySQLdb library installed on the target machine
|
||||||
for the Python interpreter Ansible discovers. For example if ansible discovers and uses Python 3, you need to install
|
for the Python interpreter Ansible discovers. For example if ansible discovers and uses Python 3, you need to install
|
||||||
the Python 3 version of PyMySQL. If ansible discovers and uses Python 2, you need to install the Python 2
|
the Python 3 version of PyMySQL or mysqlclient. If ansible discovers and uses Python 2, you need to install the Python 2
|
||||||
version of PyMySQL.
|
version of either PyMySQL or MySQL-python.
|
||||||
- If you have trouble, it may help to force Ansible to use the Python interpreter you need by specifying
|
- If you have trouble, it may help to force Ansible to use the Python interpreter you need by specifying
|
||||||
C(ansible_python_interpreter). For more information, see
|
C(ansible_python_interpreter). For more information, see
|
||||||
U(https://docs.ansible.com/ansible/latest/reference_appendices/interpreter_discovery.html).
|
U(https://docs.ansible.com/ansible/latest/reference_appendices/interpreter_discovery.html).
|
||||||
- Both C(login_password) and C(login_user) are required when you are
|
- Both C(login_password) and C(login_user) are required when you are
|
||||||
passing credentials. If none are present, the module will attempt to read
|
passing credentials. If none are present, the module will attempt to read
|
||||||
|
@ -96,6 +99,9 @@ notes:
|
||||||
and later uses the unix_socket authentication plugin by default that
|
and later uses the unix_socket authentication plugin by default that
|
||||||
without using I(login_unix_socket=/var/run/mysqld/mysqld.sock) (the default path)
|
without using I(login_unix_socket=/var/run/mysqld/mysqld.sock) (the default path)
|
||||||
causes the error ``Host '127.0.0.1' is not allowed to connect to this MariaDB server``.
|
causes the error ``Host '127.0.0.1' is not allowed to connect to this MariaDB server``.
|
||||||
|
- Alternatively, you can use the mysqlclient library instead of MySQL-python (MySQLdb)
|
||||||
|
which supports both Python 2.X and Python >=3.5.
|
||||||
|
See U(https://pypi.org/project/mysqlclient/) how to install it.
|
||||||
- "If credentials from the config file (for example, C(/root/.my.cnf)) are not needed to connect to a database server, but
|
- "If credentials from the config file (for example, C(/root/.my.cnf)) are not needed to connect to a database server, but
|
||||||
the file exists and does not contain a C([client]) section, before any other valid directives, it will be read and this
|
the file exists and does not contain a C([client]) section, before any other valid directives, it will be read and this
|
||||||
will cause the connection to fail, to prevent this set it to an empty string, (for example C(config_file: ''))."
|
will cause the connection to fail, to prevent this set it to an empty string, (for example C(config_file: ''))."
|
||||||
|
@ -104,7 +110,4 @@ notes:
|
||||||
- Alternatively, to avoid using I(login_unix_socket) argument on each invocation you can specify the socket path
|
- Alternatively, to avoid using I(login_unix_socket) argument on each invocation you can specify the socket path
|
||||||
using the `socket` option in your MySQL config file (usually C(~/.my.cnf)) on the destination host, for
|
using the `socket` option in your MySQL config file (usually C(~/.my.cnf)) on the destination host, for
|
||||||
example C(socket=/var/lib/mysql/mysql.sock).
|
example C(socket=/var/lib/mysql/mysql.sock).
|
||||||
attributes:
|
|
||||||
check_mode:
|
|
||||||
description: Can run in check_mode and return changed status prediction without modifying target.
|
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -1,180 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
from __future__ import (absolute_import, division, print_function)
|
|
||||||
from ._version import LooseVersion
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
|
|
||||||
class CommandResolver():
|
|
||||||
def __init__(self, server_implementation, server_version):
|
|
||||||
self.server_implementation = server_implementation
|
|
||||||
self.server_version = LooseVersion(server_version)
|
|
||||||
|
|
||||||
def resolve_command(self, command):
|
|
||||||
"""
|
|
||||||
Resolves the appropriate SQL command based on the server implementation and version.
|
|
||||||
|
|
||||||
Parameters:
|
|
||||||
command (str): The base SQL command to be resolved (e.g., "SHOW SLAVE HOSTS").
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: The resolved SQL command suitable for the given server implementation and version.
|
|
||||||
|
|
||||||
Raises:
|
|
||||||
ValueError: If the command is not supported or recognized.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
Given a server implementation `mysql` and server version `8.0.23`, and a command `SHOW SLAVE HOSTS`,
|
|
||||||
the method will resolve the command based on the following table of versions:
|
|
||||||
|
|
||||||
Table:
|
|
||||||
[
|
|
||||||
("mysql", "default", "SHOW SLAVES HOSTS default"),
|
|
||||||
("mysql", "5.7.0", "SHOW SLAVES HOSTS"),
|
|
||||||
("mysql", "8.0.22", "SHOW REPLICAS"),
|
|
||||||
("mysql", "8.4.0", "SHOW REPLICAS 8.4"),
|
|
||||||
("mariadb", "10.5.1", "SHOW REPLICAS HOSTS"),
|
|
||||||
]
|
|
||||||
|
|
||||||
Example usage:
|
|
||||||
>>> resolver = CommandResolver("mysql", "8.0.23")
|
|
||||||
>>> resolver.resolve_command("SHOW SLAVE HOSTS")
|
|
||||||
'SHOW REPLICAS'
|
|
||||||
|
|
||||||
In this example, the resolver will:
|
|
||||||
- Filter and sort applicable versions: [
|
|
||||||
("8.4.0", "SHOW REPLICAS 8.4"),
|
|
||||||
("8.0.22", "HOW REPLICAS"),
|
|
||||||
("5.7.0", "SHOW SLAVES HOSTS")
|
|
||||||
]
|
|
||||||
|
|
||||||
- Iterate through the sorted list and find the first version less than or equal to 8.0.23,
|
|
||||||
which is 8.0.22, and return the corresponding command.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Convert the command to uppercase to ensure case-insensitive lookup
|
|
||||||
command = command.upper()
|
|
||||||
|
|
||||||
commands = {
|
|
||||||
"SHOW MASTER STATUS": {
|
|
||||||
("mysql", "default"): "SHOW MASTER STATUS",
|
|
||||||
("mariadb", "default"): "SHOW MASTER STATUS",
|
|
||||||
("mysql", "8.2.0"): "SHOW BINARY LOG STATUS",
|
|
||||||
("mariadb", "10.5.2"): "SHOW BINLOG STATUS",
|
|
||||||
},
|
|
||||||
"SHOW SLAVE STATUS": {
|
|
||||||
("mysql", "default"): "SHOW SLAVE STATUS",
|
|
||||||
("mariadb", "default"): "SHOW SLAVE STATUS",
|
|
||||||
("mysql", "8.0.22"): "SHOW REPLICA STATUS",
|
|
||||||
("mariadb", "10.5.1"): "SHOW REPLICA STATUS",
|
|
||||||
},
|
|
||||||
"SHOW SLAVE HOSTS": {
|
|
||||||
("mysql", "default"): "SHOW SLAVE HOSTS",
|
|
||||||
("mariadb", "default"): "SHOW SLAVE HOSTS",
|
|
||||||
("mysql", "8.0.22"): "SHOW REPLICAS",
|
|
||||||
("mariadb", "10.5.1"): "SHOW REPLICA HOSTS",
|
|
||||||
},
|
|
||||||
"CHANGE MASTER": {
|
|
||||||
("mysql", "default"): "CHANGE MASTER",
|
|
||||||
("mariadb", "default"): "CHANGE MASTER",
|
|
||||||
("mysql", "8.0.23"): "CHANGE REPLICATION SOURCE",
|
|
||||||
},
|
|
||||||
"MASTER_HOST": {
|
|
||||||
("mysql", "default"): "MASTER_HOST",
|
|
||||||
("mariadb", "default"): "MASTER_HOST",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_HOST",
|
|
||||||
},
|
|
||||||
"MASTER_USER": {
|
|
||||||
("mysql", "default"): "MASTER_USER",
|
|
||||||
("mariadb", "default"): "MASTER_USER",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_USER",
|
|
||||||
},
|
|
||||||
"MASTER_PASSWORD": {
|
|
||||||
("mysql", "default"): "MASTER_PASSWORD",
|
|
||||||
("mariadb", "default"): "MASTER_PASSWORD",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_PASSWORD",
|
|
||||||
},
|
|
||||||
"MASTER_PORT": {
|
|
||||||
("mysql", "default"): "MASTER_PORT",
|
|
||||||
("mariadb", "default"): "MASTER_PORT",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_PORT",
|
|
||||||
},
|
|
||||||
"MASTER_CONNECT_RETRY": {
|
|
||||||
("mysql", "default"): "MASTER_CONNECT_RETRY",
|
|
||||||
("mariadb", "default"): "MASTER_CONNECT_RETRY",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_CONNECT_RETRY",
|
|
||||||
},
|
|
||||||
"MASTER_LOG_FILE": {
|
|
||||||
("mysql", "default"): "MASTER_LOG_FILE",
|
|
||||||
("mariadb", "default"): "MASTER_LOG_FILE",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_LOG_FILE",
|
|
||||||
},
|
|
||||||
"MASTER_LOG_POS": {
|
|
||||||
("mysql", "default"): "MASTER_LOG_POS",
|
|
||||||
("mariadb", "default"): "MASTER_LOG_POS",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_LOG_POS",
|
|
||||||
},
|
|
||||||
"MASTER_DELAY": {
|
|
||||||
("mysql", "default"): "MASTER_DELAY",
|
|
||||||
("mariadb", "default"): "MASTER_DELAY",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_DELAY",
|
|
||||||
},
|
|
||||||
"MASTER_SSL": {
|
|
||||||
("mysql", "default"): "MASTER_SSL",
|
|
||||||
("mariadb", "default"): "MASTER_SSL",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_SSL",
|
|
||||||
},
|
|
||||||
"MASTER_SSL_CA": {
|
|
||||||
("mysql", "default"): "MASTER_SSL_CA",
|
|
||||||
("mariadb", "default"): "MASTER_SSL_CA",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_SSL_CA",
|
|
||||||
},
|
|
||||||
"MASTER_SSL_CAPATH": {
|
|
||||||
("mysql", "default"): "MASTER_SSL_CAPATH",
|
|
||||||
("mariadb", "default"): "MASTER_SSL_CAPATH",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_SSL_CAPATH",
|
|
||||||
},
|
|
||||||
"MASTER_SSL_CERT": {
|
|
||||||
("mysql", "default"): "MASTER_SSL_CERT",
|
|
||||||
("mariadb", "default"): "MASTER_SSL_CERT",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_SSL_CERT",
|
|
||||||
},
|
|
||||||
"MASTER_SSL_KEY": {
|
|
||||||
("mysql", "default"): "MASTER_SSL_KEY",
|
|
||||||
("mariadb", "default"): "MASTER_SSL_KEY",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_SSL_KEY",
|
|
||||||
},
|
|
||||||
"MASTER_SSL_CIPHER": {
|
|
||||||
("mysql", "default"): "MASTER_SSL_CIPHER",
|
|
||||||
("mariadb", "default"): "MASTER_SSL_CIPHER",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_SSL_CIPHER",
|
|
||||||
},
|
|
||||||
"MASTER_SSL_VERIFY_SERVER_CERT": {
|
|
||||||
("mysql", "default"): "MASTER_SSL_VERIFY_SERVER_CERT",
|
|
||||||
("mariadb", "default"): "MASTER_SSL_VERIFY_SERVER_CERT",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_SSL_VERIFY_SERVER_CERT",
|
|
||||||
},
|
|
||||||
"MASTER_AUTO_POSITION": {
|
|
||||||
("mysql", "default"): "MASTER_AUTO_POSITION",
|
|
||||||
("mariadb", "default"): "MASTER_AUTO_POSITION",
|
|
||||||
("mysql", "8.0.23"): "SOURCE_AUTO_POSITION",
|
|
||||||
},
|
|
||||||
"RESET MASTER": {
|
|
||||||
("mysql", "default"): "RESET MASTER",
|
|
||||||
("mariadb", "default"): "RESET MASTER",
|
|
||||||
("mysql", "8.4.0"): "RESET BINARY LOGS AND GTIDS",
|
|
||||||
},
|
|
||||||
# Add more command mappings here
|
|
||||||
}
|
|
||||||
|
|
||||||
if command in commands:
|
|
||||||
cmd_syntaxes = commands[command]
|
|
||||||
applicable_versions = [(v, cmd) for (impl, v), cmd in cmd_syntaxes.items() if impl == self.server_implementation and v != 'default']
|
|
||||||
applicable_versions.sort(reverse=True, key=lambda x: LooseVersion(x[0]))
|
|
||||||
|
|
||||||
for version, cmd in applicable_versions:
|
|
||||||
if self.server_version >= LooseVersion(version):
|
|
||||||
return cmd
|
|
||||||
|
|
||||||
return cmd_syntaxes[(self.server_implementation, "default")]
|
|
||||||
raise ValueError("Unsupported command: %s" % command)
|
|
|
@ -1,19 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import (absolute_import, division, print_function)
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.version import LooseVersion
|
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.mysql import get_server_version
|
|
||||||
|
|
||||||
|
|
||||||
def supports_roles(cursor):
|
|
||||||
version = get_server_version(cursor)
|
|
||||||
|
|
||||||
return LooseVersion(version) >= LooseVersion('10.0.5')
|
|
||||||
|
|
||||||
|
|
||||||
def is_mariadb():
|
|
||||||
return True
|
|
|
@ -17,60 +17,3 @@ def use_old_user_mgmt(cursor):
|
||||||
|
|
||||||
def supports_identified_by_password(cursor):
|
def supports_identified_by_password(cursor):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def server_supports_alter_user(cursor):
|
|
||||||
version = get_server_version(cursor)
|
|
||||||
|
|
||||||
return LooseVersion(version) >= LooseVersion("10.2")
|
|
||||||
|
|
||||||
|
|
||||||
def server_supports_password_expire(cursor):
|
|
||||||
version = get_server_version(cursor)
|
|
||||||
|
|
||||||
return LooseVersion(version) >= LooseVersion("10.4.3")
|
|
||||||
|
|
||||||
|
|
||||||
def get_tls_requires(cursor, user, host):
|
|
||||||
"""Get user TLS requirements.
|
|
||||||
Reads directly from mysql.user table allowing for a more
|
|
||||||
readable code.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
cursor (cursor): DB driver cursor object.
|
|
||||||
user (str): User name.
|
|
||||||
host (str): User host name.
|
|
||||||
|
|
||||||
Returns: Dictionary containing current TLS required
|
|
||||||
"""
|
|
||||||
tls_requires = dict()
|
|
||||||
|
|
||||||
query = ('SELECT ssl_type, ssl_cipher, x509_issuer, x509_subject '
|
|
||||||
'FROM mysql.user WHERE User = %s AND Host = %s')
|
|
||||||
cursor.execute(query, (user, host))
|
|
||||||
res = cursor.fetchone()
|
|
||||||
|
|
||||||
# Mysql_info use a DictCursor so we must convert back to a list
|
|
||||||
# otherwise we get KeyError 0
|
|
||||||
if isinstance(res, dict):
|
|
||||||
res = list(res.values())
|
|
||||||
|
|
||||||
# When user don't require SSL, res value is: ('', '', '', '')
|
|
||||||
if not any(res):
|
|
||||||
return None
|
|
||||||
|
|
||||||
if res[0] == 'ANY':
|
|
||||||
tls_requires['SSL'] = None
|
|
||||||
|
|
||||||
if res[0] == 'X509':
|
|
||||||
tls_requires['X509'] = None
|
|
||||||
|
|
||||||
if res[1]:
|
|
||||||
tls_requires['CIPHER'] = res[1]
|
|
||||||
|
|
||||||
if res[2]:
|
|
||||||
tls_requires['ISSUER'] = res[2]
|
|
||||||
|
|
||||||
if res[3]:
|
|
||||||
tls_requires['SUBJECT'] = res[3]
|
|
||||||
return tls_requires
|
|
||||||
|
|
|
@ -1,125 +0,0 @@
|
||||||
"""
|
|
||||||
Generate MySQL sha256 compatible plugins hash for a given password and salt
|
|
||||||
|
|
||||||
based on
|
|
||||||
* https://www.akkadia.org/drepper/SHA-crypt.txt
|
|
||||||
* https://crypto.stackexchange.com/questions/77427/whats-the-algorithm-behind-mysqls-sha256-password-hashing-scheme/111174#111174
|
|
||||||
* https://github.com/hashcat/hashcat/blob/master/tools/test_modules/m07400.pm
|
|
||||||
"""
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
|
||||||
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
import hashlib
|
|
||||||
|
|
||||||
|
|
||||||
def _to64(v, n):
|
|
||||||
"""Convert a 32-bit integer to a base-64 string"""
|
|
||||||
i64 = (
|
|
||||||
[".", "/"]
|
|
||||||
+ [chr(x) for x in range(48, 58)]
|
|
||||||
+ [chr(x) for x in range(65, 91)]
|
|
||||||
+ [chr(x) for x in range(97, 123)]
|
|
||||||
)
|
|
||||||
result = ""
|
|
||||||
while n > 0:
|
|
||||||
n -= 1
|
|
||||||
result += i64[v & 0x3F]
|
|
||||||
v >>= 6
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
def _hashlib_sha256(data):
|
|
||||||
"""Return SHA-256 digest from hashlib ."""
|
|
||||||
return hashlib.sha256(data).digest()
|
|
||||||
|
|
||||||
|
|
||||||
def _sha256_digest(key, salt, loops):
|
|
||||||
"""Return a SHA-256 digest of the concatenation of the key, the salt, and the key, repeated as necessary."""
|
|
||||||
# https://www.akkadia.org/drepper/SHA-crypt.txt
|
|
||||||
num_bytes = 32
|
|
||||||
bytes_key = key.encode()
|
|
||||||
bytes_salt = salt.encode()
|
|
||||||
digest_b = _hashlib_sha256(bytes_key + bytes_salt + bytes_key)
|
|
||||||
|
|
||||||
tmp = bytes_key + bytes_salt
|
|
||||||
for i in range(len(bytes_key), 0, -num_bytes):
|
|
||||||
tmp += digest_b if i > num_bytes else digest_b[:i]
|
|
||||||
|
|
||||||
i = len(bytes_key)
|
|
||||||
while i > 0:
|
|
||||||
tmp += digest_b if (i & 1) != 0 else bytes_key
|
|
||||||
i >>= 1
|
|
||||||
|
|
||||||
digest_a = _hashlib_sha256(tmp)
|
|
||||||
|
|
||||||
tmp = b""
|
|
||||||
for i in range(len(bytes_key)):
|
|
||||||
tmp += bytes_key
|
|
||||||
|
|
||||||
digest_dp = _hashlib_sha256(tmp)
|
|
||||||
|
|
||||||
byte_sequence_p = b""
|
|
||||||
for i in range(len(bytes_key), 0, -num_bytes):
|
|
||||||
byte_sequence_p += digest_dp if i > num_bytes else digest_dp[:i]
|
|
||||||
|
|
||||||
tmp = b""
|
|
||||||
til = 16 + digest_a[0]
|
|
||||||
|
|
||||||
for i in range(til):
|
|
||||||
tmp += bytes_salt
|
|
||||||
|
|
||||||
digest_ds = _hashlib_sha256(tmp)
|
|
||||||
|
|
||||||
byte_sequence_s = b""
|
|
||||||
for i in range(len(bytes_salt), 0, -num_bytes):
|
|
||||||
byte_sequence_s += digest_ds if i > num_bytes else digest_ds[:i]
|
|
||||||
|
|
||||||
digest_c = digest_a
|
|
||||||
|
|
||||||
for i in range(loops):
|
|
||||||
tmp = byte_sequence_p if (i & 1) else digest_c
|
|
||||||
if i % 3:
|
|
||||||
tmp += byte_sequence_s
|
|
||||||
if i % 7:
|
|
||||||
tmp += byte_sequence_p
|
|
||||||
tmp += digest_c if (i & 1) else byte_sequence_p
|
|
||||||
digest_c = _hashlib_sha256(tmp)
|
|
||||||
|
|
||||||
inc1, inc2, mod, end = (10, 21, 30, 0)
|
|
||||||
|
|
||||||
i = 0
|
|
||||||
tmp = ""
|
|
||||||
|
|
||||||
while True:
|
|
||||||
tmp += _to64(
|
|
||||||
(digest_c[i] << 16)
|
|
||||||
| (digest_c[(i + inc1) % mod] << 8)
|
|
||||||
| digest_c[(i + inc1 * 2) % mod],
|
|
||||||
4,
|
|
||||||
)
|
|
||||||
i = (i + inc2) % mod
|
|
||||||
if i == end:
|
|
||||||
break
|
|
||||||
|
|
||||||
tmp += _to64((digest_c[31] << 8) | digest_c[30], 3)
|
|
||||||
|
|
||||||
return tmp
|
|
||||||
|
|
||||||
|
|
||||||
def mysql_sha256_password_hash(password, salt):
|
|
||||||
"""Return a MySQL compatible caching_sha2_password hash in raw format."""
|
|
||||||
if len(salt) != 20:
|
|
||||||
raise ValueError("Salt must be 20 characters long.")
|
|
||||||
|
|
||||||
count = 5
|
|
||||||
iteration = 1000 * count
|
|
||||||
|
|
||||||
digest = _sha256_digest(password, salt, iteration)
|
|
||||||
return "$A${0:>03}${1}{2}".format(count, salt, digest)
|
|
||||||
|
|
||||||
|
|
||||||
def mysql_sha256_password_hash_hex(password, salt):
|
|
||||||
"""Return a MySQL compatible caching_sha2_password hash in hex format."""
|
|
||||||
return mysql_sha256_password_hash(password, salt).encode().hex().upper()
|
|
|
@ -1,19 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
from __future__ import (absolute_import, division, print_function)
|
|
||||||
__metaclass__ = type
|
|
||||||
|
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.version import LooseVersion
|
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.mysql import get_server_version
|
|
||||||
|
|
||||||
|
|
||||||
def supports_roles(cursor):
|
|
||||||
version = get_server_version(cursor)
|
|
||||||
|
|
||||||
return LooseVersion(version) >= LooseVersion('8')
|
|
||||||
|
|
||||||
|
|
||||||
def is_mariadb():
|
|
||||||
return False
|
|
|
@ -8,9 +8,6 @@ __metaclass__ = type
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.version import LooseVersion
|
from ansible_collections.community.mysql.plugins.module_utils.version import LooseVersion
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.mysql import get_server_version
|
from ansible_collections.community.mysql.plugins.module_utils.mysql import get_server_version
|
||||||
|
|
||||||
import re
|
|
||||||
import shlex
|
|
||||||
|
|
||||||
|
|
||||||
def use_old_user_mgmt(cursor):
|
def use_old_user_mgmt(cursor):
|
||||||
version = get_server_version(cursor)
|
version = get_server_version(cursor)
|
||||||
|
@ -21,58 +18,3 @@ def use_old_user_mgmt(cursor):
|
||||||
def supports_identified_by_password(cursor):
|
def supports_identified_by_password(cursor):
|
||||||
version = get_server_version(cursor)
|
version = get_server_version(cursor)
|
||||||
return LooseVersion(version) < LooseVersion("8")
|
return LooseVersion(version) < LooseVersion("8")
|
||||||
|
|
||||||
|
|
||||||
def server_supports_alter_user(cursor):
|
|
||||||
version = get_server_version(cursor)
|
|
||||||
|
|
||||||
return LooseVersion(version) >= LooseVersion("5.6")
|
|
||||||
|
|
||||||
|
|
||||||
def server_supports_password_expire(cursor):
|
|
||||||
version = get_server_version(cursor)
|
|
||||||
|
|
||||||
return LooseVersion(version) >= LooseVersion("5.7")
|
|
||||||
|
|
||||||
|
|
||||||
def get_tls_requires(cursor, user, host):
|
|
||||||
"""Get user TLS requirements.
|
|
||||||
We must use SHOW GRANTS because some tls fileds are encoded.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
cursor (cursor): DB driver cursor object.
|
|
||||||
user (str): User name.
|
|
||||||
host (str): User host name.
|
|
||||||
|
|
||||||
Returns: Dictionary containing current TLS required
|
|
||||||
"""
|
|
||||||
if not use_old_user_mgmt(cursor):
|
|
||||||
query = "SHOW CREATE USER '%s'@'%s'" % (user, host)
|
|
||||||
else:
|
|
||||||
query = "SHOW GRANTS for '%s'@'%s'" % (user, host)
|
|
||||||
|
|
||||||
cursor.execute(query)
|
|
||||||
grants = cursor.fetchone()
|
|
||||||
|
|
||||||
# Mysql_info use a DictCursor so we must convert back to a list
|
|
||||||
# otherwise we get KeyError 0
|
|
||||||
if isinstance(grants, dict):
|
|
||||||
grants = list(grants.values())
|
|
||||||
grants_str = ''.join(grants)
|
|
||||||
|
|
||||||
pattern = r"(?<=\bREQUIRE\b)(.*?)(?=(?:\bPASSWORD\b|$))"
|
|
||||||
requires_match = re.search(pattern, grants_str)
|
|
||||||
requires = requires_match.group().strip() if requires_match else ""
|
|
||||||
|
|
||||||
if requires.startswith('NONE'):
|
|
||||||
return None
|
|
||||||
|
|
||||||
if requires.startswith('SSL'):
|
|
||||||
return {'SSL': None}
|
|
||||||
|
|
||||||
if requires.startswith('X509'):
|
|
||||||
return {'X509': None}
|
|
||||||
|
|
||||||
items = iter(shlex.split(requires))
|
|
||||||
requires = dict(zip(items, items))
|
|
||||||
return requires or None
|
|
||||||
|
|
|
@ -35,8 +35,6 @@ mysql_driver_fail_msg = ('A MySQL module is required: for Python 2.7 either PyMy
|
||||||
'Consider setting ansible_python_interpreter to use '
|
'Consider setting ansible_python_interpreter to use '
|
||||||
'the intended Python version.')
|
'the intended Python version.')
|
||||||
|
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.database import mysql_quote_identifier
|
|
||||||
|
|
||||||
|
|
||||||
def get_connector_name(connector):
|
def get_connector_name(connector):
|
||||||
""" (class) -> str
|
""" (class) -> str
|
||||||
|
@ -122,7 +120,7 @@ def mysql_connect(module, login_user=None, login_password=None, config_file='',
|
||||||
if login_user is not None:
|
if login_user is not None:
|
||||||
config['user'] = login_user
|
config['user'] = login_user
|
||||||
if login_password is not None:
|
if login_password is not None:
|
||||||
config['password'] = login_password
|
config['passwd'] = login_password
|
||||||
if ssl_cert is not None:
|
if ssl_cert is not None:
|
||||||
config['ssl']['cert'] = ssl_cert
|
config['ssl']['cert'] = ssl_cert
|
||||||
if ssl_key is not None:
|
if ssl_key is not None:
|
||||||
|
@ -130,45 +128,22 @@ def mysql_connect(module, login_user=None, login_password=None, config_file='',
|
||||||
if ssl_ca is not None:
|
if ssl_ca is not None:
|
||||||
config['ssl']['ca'] = ssl_ca
|
config['ssl']['ca'] = ssl_ca
|
||||||
if db is not None:
|
if db is not None:
|
||||||
config['database'] = db
|
config['db'] = db
|
||||||
if connect_timeout is not None:
|
if connect_timeout is not None:
|
||||||
config['connect_timeout'] = connect_timeout
|
config['connect_timeout'] = connect_timeout
|
||||||
if check_hostname is not None:
|
if check_hostname is not None:
|
||||||
if get_connector_name(mysql_driver) == 'pymysql':
|
if mysql_driver.__name__ == "pymysql":
|
||||||
version_tuple = (n for n in mysql_driver.__version__.split('.') if n != 'None')
|
version_tuple = (n for n in mysql_driver.__version__.split('.') if n != 'None')
|
||||||
if reduce(lambda x, y: int(x) * 100 + int(y), version_tuple) >= 711:
|
if reduce(lambda x, y: int(x) * 100 + int(y), version_tuple) >= 711:
|
||||||
config['ssl']['check_hostname'] = check_hostname
|
config['ssl']['check_hostname'] = check_hostname
|
||||||
else:
|
else:
|
||||||
module.fail_json(msg='To use check_hostname, pymysql >= 0.7.11 is required on the target host')
|
module.fail_json(msg='To use check_hostname, pymysql >= 0.7.11 is required on the target host')
|
||||||
|
|
||||||
if get_connector_name(mysql_driver) == 'pymysql':
|
if _mysql_cursor_param == 'cursor':
|
||||||
# In case of PyMySQL driver:
|
# In case of PyMySQL driver:
|
||||||
if mysql_driver.version_info[0] < 1:
|
|
||||||
# for PyMySQL < 1.0.0, use 'db' instead of 'database' and 'passwd' instead of 'password'
|
|
||||||
if 'database' in config:
|
|
||||||
config['db'] = config['database']
|
|
||||||
del config['database']
|
|
||||||
if 'password' in config:
|
|
||||||
config['passwd'] = config['password']
|
|
||||||
del config['password']
|
|
||||||
db_connection = mysql_driver.connect(autocommit=autocommit, **config)
|
db_connection = mysql_driver.connect(autocommit=autocommit, **config)
|
||||||
else:
|
else:
|
||||||
# In case of MySQLdb driver
|
# In case of MySQLdb driver
|
||||||
|
|
||||||
# Will be deprecated and dropped
|
|
||||||
# https://github.com/ansible-collections/community.mysql/issues/654
|
|
||||||
module.warn('Support of mysqlcline/MySQLdb connector is deprecated. '
|
|
||||||
'We\'ll stop testing against it in collection version 4.0.0 '
|
|
||||||
'and remove the related code in 5.0.0. Use PyMySQL connector instead.')
|
|
||||||
|
|
||||||
if mysql_driver.version_info[0] < 2 or (mysql_driver.version_info[0] == 2 and mysql_driver.version_info[1] < 1):
|
|
||||||
# for MySQLdb < 2.1.0, use 'db' instead of 'database' and 'passwd' instead of 'password'
|
|
||||||
if 'database' in config:
|
|
||||||
config['db'] = config['database']
|
|
||||||
del config['database']
|
|
||||||
if 'password' in config:
|
|
||||||
config['passwd'] = config['password']
|
|
||||||
del config['password']
|
|
||||||
db_connection = mysql_driver.connect(**config)
|
db_connection = mysql_driver.connect(**config)
|
||||||
if autocommit:
|
if autocommit:
|
||||||
db_connection.autocommit(True)
|
db_connection.autocommit(True)
|
||||||
|
@ -212,20 +187,3 @@ def get_server_version(cursor):
|
||||||
version_str = result[0]
|
version_str = result[0]
|
||||||
|
|
||||||
return version_str
|
return version_str
|
||||||
|
|
||||||
|
|
||||||
def get_server_implementation(cursor):
|
|
||||||
if 'mariadb' in get_server_version(cursor).lower():
|
|
||||||
return "mariadb"
|
|
||||||
else:
|
|
||||||
return "mysql"
|
|
||||||
|
|
||||||
|
|
||||||
def set_session_vars(module, cursor, session_vars):
|
|
||||||
"""Set session vars."""
|
|
||||||
for var, value in session_vars.items():
|
|
||||||
query = "SET SESSION %s = " % mysql_quote_identifier(var, 'vars')
|
|
||||||
try:
|
|
||||||
cursor.execute(query + "%s", (value,))
|
|
||||||
except Exception as e:
|
|
||||||
module.fail_json(msg='Failed to execute %s%s: %s' % (query, value, e))
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -11,9 +11,9 @@ __metaclass__ = type
|
||||||
DOCUMENTATION = r'''
|
DOCUMENTATION = r'''
|
||||||
---
|
---
|
||||||
module: mysql_db
|
module: mysql_db
|
||||||
short_description: Add or remove MySQL or MariaDB databases from a remote host
|
short_description: Add or remove MySQL databases from a remote host
|
||||||
description:
|
description:
|
||||||
- Add or remove MySQL or MariaDB databases from a remote host.
|
- Add or remove MySQL databases from a remote host.
|
||||||
options:
|
options:
|
||||||
name:
|
name:
|
||||||
description:
|
description:
|
||||||
|
@ -46,8 +46,8 @@ options:
|
||||||
target:
|
target:
|
||||||
description:
|
description:
|
||||||
- Location, on the remote host, of the dump file to read from or write to.
|
- Location, on the remote host, of the dump file to read from or write to.
|
||||||
- Uncompressed SQL files (C(.sql)) as well as bzip2 (C(.bz2)), gzip (C(.gz)),
|
- Uncompressed SQL files (C(.sql)) as well as bzip2 (C(.bz2)), gzip (C(.gz)) and
|
||||||
xz (Added in 2.0) and zstd (C(.zst)) (Added in 3.12.0) compressed files are supported.
|
xz (Added in 2.0) compressed files are supported.
|
||||||
type: path
|
type: path
|
||||||
single_transaction:
|
single_transaction:
|
||||||
description:
|
description:
|
||||||
|
@ -150,26 +150,6 @@ options:
|
||||||
type: bool
|
type: bool
|
||||||
default: false
|
default: false
|
||||||
version_added: '0.1.0'
|
version_added: '0.1.0'
|
||||||
chdir:
|
|
||||||
description:
|
|
||||||
- Changes the current working directory.
|
|
||||||
- Can be useful, for example, when I(state=import) and a dump file contains relative paths.
|
|
||||||
type: path
|
|
||||||
version_added: '3.4.0'
|
|
||||||
pipefail:
|
|
||||||
description:
|
|
||||||
- Use C(bash) instead of C(sh) and add C(-o pipefail) to catch errors from the
|
|
||||||
mysql_dump command when I(state=dump) and compression is used.
|
|
||||||
- The default is C(no) to prevent issues on systems without bash as a default interpreter.
|
|
||||||
- The default will change to C(yes) in community.mysql 4.0.0.
|
|
||||||
type: bool
|
|
||||||
default: false
|
|
||||||
version_added: '3.4.0'
|
|
||||||
sql_log_bin:
|
|
||||||
description:
|
|
||||||
- Whether binary logging should be enabled or disabled for the connection.
|
|
||||||
type: bool
|
|
||||||
default: true
|
|
||||||
|
|
||||||
seealso:
|
seealso:
|
||||||
- module: community.mysql.mysql_info
|
- module: community.mysql.mysql_info
|
||||||
|
@ -193,15 +173,13 @@ requirements:
|
||||||
- mysql (command line binary)
|
- mysql (command line binary)
|
||||||
- mysqldump (command line binary)
|
- mysqldump (command line binary)
|
||||||
notes:
|
notes:
|
||||||
- Compatible with MariaDB or MySQL.
|
- Supports C(check_mode).
|
||||||
- Requires the mysql and mysqldump binaries on the remote host.
|
- Requires the mysql and mysqldump binaries on the remote host.
|
||||||
- This module is B(not idempotent) when I(state) is C(import),
|
- This module is B(not idempotent) when I(state) is C(import),
|
||||||
and will import the dump file each time if run more than once.
|
and will import the dump file each time if run more than once.
|
||||||
attributes:
|
|
||||||
check_mode:
|
|
||||||
support: full
|
|
||||||
extends_documentation_fragment:
|
extends_documentation_fragment:
|
||||||
- community.mysql.mysql
|
- community.mysql.mysql
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
EXAMPLES = r'''
|
EXAMPLES = r'''
|
||||||
|
@ -314,13 +292,6 @@ EXAMPLES = r'''
|
||||||
login_password: 123456
|
login_password: 123456
|
||||||
name: bobdata
|
name: bobdata
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
- name: Dump a database with compression and catch errors from mysqldump with bash pipefail
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: foo
|
|
||||||
target: /tmp/dump.sql.gz
|
|
||||||
pipefail: true
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
RETURN = r'''
|
RETURN = r'''
|
||||||
|
@ -348,15 +319,7 @@ import traceback
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.database import mysql_quote_identifier
|
from ansible_collections.community.mysql.plugins.module_utils.database import mysql_quote_identifier
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.mysql import (
|
from ansible_collections.community.mysql.plugins.module_utils.mysql import mysql_connect, mysql_driver, mysql_driver_fail_msg, mysql_common_argument_spec
|
||||||
mysql_connect,
|
|
||||||
mysql_driver,
|
|
||||||
mysql_driver_fail_msg,
|
|
||||||
mysql_common_argument_spec,
|
|
||||||
get_server_implementation,
|
|
||||||
get_server_version,
|
|
||||||
)
|
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.version import LooseVersion
|
|
||||||
from ansible.module_utils.six.moves import shlex_quote
|
from ansible.module_utils.six.moves import shlex_quote
|
||||||
from ansible.module_utils._text import to_native
|
from ansible.module_utils._text import to_native
|
||||||
|
|
||||||
|
@ -370,7 +333,7 @@ executed_commands = []
|
||||||
def db_exists(cursor, db):
|
def db_exists(cursor, db):
|
||||||
res = 0
|
res = 0
|
||||||
for each_db in db:
|
for each_db in db:
|
||||||
res += cursor.execute("SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = %s", (each_db,))
|
res += cursor.execute("SHOW DATABASES LIKE %s", (each_db.replace("_", r"\_"),))
|
||||||
return res == len(db)
|
return res == len(db)
|
||||||
|
|
||||||
|
|
||||||
|
@ -385,81 +348,68 @@ def db_delete(cursor, db):
|
||||||
|
|
||||||
|
|
||||||
def db_dump(module, host, user, password, db_name, target, all_databases, port,
|
def db_dump(module, host, user, password, db_name, target, all_databases, port,
|
||||||
config_file, server_implementation, server_version, socket=None,
|
config_file, socket=None, ssl_cert=None, ssl_key=None, ssl_ca=None,
|
||||||
ssl_cert=None, ssl_key=None, ssl_ca=None,
|
|
||||||
single_transaction=None, quick=None, ignore_tables=None, hex_blob=None,
|
single_transaction=None, quick=None, ignore_tables=None, hex_blob=None,
|
||||||
encoding=None, force=False, master_data=0, skip_lock_tables=False,
|
encoding=None, force=False, master_data=0, skip_lock_tables=False,
|
||||||
dump_extra_args=None, unsafe_password=False, restrict_config_file=False,
|
dump_extra_args=None, unsafe_password=False, restrict_config_file=False,
|
||||||
check_implicit_admin=False, pipefail=False):
|
check_implicit_admin=False):
|
||||||
|
cmd = module.get_bin_path('mysqldump', True)
|
||||||
cmd_str = 'mysqldump'
|
|
||||||
if server_implementation == 'mariadb' and LooseVersion(server_version) >= LooseVersion("10.4.6"):
|
|
||||||
cmd_str = 'mariadb-dump'
|
|
||||||
try:
|
|
||||||
cmd = [module.get_bin_path(cmd_str, True)]
|
|
||||||
except Exception as e:
|
|
||||||
return 1, "", "Error determining dump command: %s" % str(e)
|
|
||||||
|
|
||||||
# If defined, mysqldump demands --defaults-extra-file be the first option
|
# If defined, mysqldump demands --defaults-extra-file be the first option
|
||||||
if config_file:
|
if config_file:
|
||||||
if restrict_config_file:
|
if restrict_config_file:
|
||||||
cmd.append("--defaults-file=%s" % shlex_quote(config_file))
|
cmd += " --defaults-file=%s" % shlex_quote(config_file)
|
||||||
else:
|
else:
|
||||||
cmd.append("--defaults-extra-file=%s" % shlex_quote(config_file))
|
cmd += " --defaults-extra-file=%s" % shlex_quote(config_file)
|
||||||
|
|
||||||
if check_implicit_admin:
|
if check_implicit_admin:
|
||||||
cmd.append("--user=root --password=''")
|
cmd += " --user=root --password=''"
|
||||||
else:
|
else:
|
||||||
if user is not None:
|
if user is not None:
|
||||||
cmd.append("--user=%s" % shlex_quote(user))
|
cmd += " --user=%s" % shlex_quote(user)
|
||||||
|
|
||||||
if password is not None:
|
if password is not None:
|
||||||
if not unsafe_password:
|
if not unsafe_password:
|
||||||
cmd.append("--password=%s" % shlex_quote(password))
|
cmd += " --password=%s" % shlex_quote(password)
|
||||||
else:
|
else:
|
||||||
cmd.append("--password=%s" % password)
|
cmd += " --password=%s" % password
|
||||||
|
|
||||||
if ssl_cert is not None:
|
if ssl_cert is not None:
|
||||||
cmd.append("--ssl-cert=%s" % shlex_quote(ssl_cert))
|
cmd += " --ssl-cert=%s" % shlex_quote(ssl_cert)
|
||||||
if ssl_key is not None:
|
if ssl_key is not None:
|
||||||
cmd.append("--ssl-key=%s" % shlex_quote(ssl_key))
|
cmd += " --ssl-key=%s" % shlex_quote(ssl_key)
|
||||||
if ssl_ca is not None:
|
if ssl_ca is not None:
|
||||||
cmd.append("--ssl-ca=%s" % shlex_quote(ssl_ca))
|
cmd += " --ssl-ca=%s" % shlex_quote(ssl_ca)
|
||||||
if force:
|
if force:
|
||||||
cmd.append("--force")
|
cmd += " --force"
|
||||||
if socket is not None:
|
if socket is not None:
|
||||||
cmd.append("--socket=%s" % shlex_quote(socket))
|
cmd += " --socket=%s" % shlex_quote(socket)
|
||||||
else:
|
else:
|
||||||
cmd.append("--host=%s --port=%i" % (shlex_quote(host), port))
|
cmd += " --host=%s --port=%i" % (shlex_quote(host), port)
|
||||||
|
|
||||||
if all_databases:
|
if all_databases:
|
||||||
cmd.append("--all-databases")
|
cmd += " --all-databases"
|
||||||
elif len(db_name) > 1:
|
elif len(db_name) > 1:
|
||||||
cmd.append("--databases {0}".format(' '.join(db_name)))
|
cmd += " --databases {0}".format(' '.join(db_name))
|
||||||
else:
|
else:
|
||||||
cmd.append("%s" % shlex_quote(' '.join(db_name)))
|
cmd += " %s" % shlex_quote(' '.join(db_name))
|
||||||
|
|
||||||
if skip_lock_tables:
|
if skip_lock_tables:
|
||||||
cmd.append("--skip-lock-tables")
|
cmd += " --skip-lock-tables"
|
||||||
if (encoding is not None) and (encoding != ""):
|
if (encoding is not None) and (encoding != ""):
|
||||||
cmd.append("--default-character-set=%s" % shlex_quote(encoding))
|
cmd += " --default-character-set=%s" % shlex_quote(encoding)
|
||||||
if single_transaction:
|
if single_transaction:
|
||||||
cmd.append("--single-transaction=true")
|
cmd += " --single-transaction=true"
|
||||||
if quick:
|
if quick:
|
||||||
cmd.append("--quick")
|
cmd += " --quick"
|
||||||
if ignore_tables:
|
if ignore_tables:
|
||||||
for an_ignored_table in ignore_tables:
|
for an_ignored_table in ignore_tables:
|
||||||
cmd.append("--ignore-table={0}".format(an_ignored_table))
|
cmd += " --ignore-table={0}".format(an_ignored_table)
|
||||||
if hex_blob:
|
if hex_blob:
|
||||||
cmd.append("--hex-blob")
|
cmd += " --hex-blob"
|
||||||
if master_data:
|
if master_data:
|
||||||
if (server_implementation == 'mysql' and
|
cmd += " --master-data=%s" % master_data
|
||||||
LooseVersion(server_version) >= LooseVersion("8.2.0")):
|
|
||||||
cmd.append("--source-data=%s" % master_data)
|
|
||||||
else:
|
|
||||||
cmd.append("--master-data=%s" % master_data)
|
|
||||||
if dump_extra_args is not None:
|
if dump_extra_args is not None:
|
||||||
cmd.append(dump_extra_args)
|
cmd += " " + dump_extra_args
|
||||||
|
|
||||||
path = None
|
path = None
|
||||||
if os.path.splitext(target)[-1] == '.gz':
|
if os.path.splitext(target)[-1] == '.gz':
|
||||||
|
@ -468,44 +418,25 @@ def db_dump(module, host, user, password, db_name, target, all_databases, port,
|
||||||
path = module.get_bin_path('bzip2', True)
|
path = module.get_bin_path('bzip2', True)
|
||||||
elif os.path.splitext(target)[-1] == '.xz':
|
elif os.path.splitext(target)[-1] == '.xz':
|
||||||
path = module.get_bin_path('xz', True)
|
path = module.get_bin_path('xz', True)
|
||||||
elif os.path.splitext(target)[-1] == '.zst':
|
|
||||||
path = module.get_bin_path('zstd', True)
|
|
||||||
|
|
||||||
cmd = ' '.join(cmd)
|
|
||||||
|
|
||||||
if path:
|
if path:
|
||||||
cmd = '%s | %s > %s' % (cmd, path, shlex_quote(target))
|
cmd = '%s | %s > %s' % (cmd, path, shlex_quote(target))
|
||||||
if pipefail:
|
|
||||||
cmd = 'set -o pipefail && ' + cmd
|
|
||||||
else:
|
else:
|
||||||
cmd += " > %s" % shlex_quote(target)
|
cmd += " > %s" % shlex_quote(target)
|
||||||
|
|
||||||
executed_commands.append(cmd)
|
executed_commands.append(cmd)
|
||||||
|
rc, stdout, stderr = module.run_command(cmd, use_unsafe_shell=True)
|
||||||
if pipefail:
|
|
||||||
rc, stdout, stderr = module.run_command(cmd, use_unsafe_shell=True, executable='bash')
|
|
||||||
else:
|
|
||||||
rc, stdout, stderr = module.run_command(cmd, use_unsafe_shell=True)
|
|
||||||
|
|
||||||
return rc, stdout, stderr
|
return rc, stdout, stderr
|
||||||
|
|
||||||
|
|
||||||
def db_import(module, host, user, password, db_name, target, all_databases, port, config_file,
|
def db_import(module, host, user, password, db_name, target, all_databases, port, config_file,
|
||||||
server_implementation, server_version, socket=None, ssl_cert=None, ssl_key=None, ssl_ca=None,
|
socket=None, ssl_cert=None, ssl_key=None, ssl_ca=None, encoding=None, force=False,
|
||||||
encoding=None, force=False,
|
|
||||||
use_shell=False, unsafe_password=False, restrict_config_file=False,
|
use_shell=False, unsafe_password=False, restrict_config_file=False,
|
||||||
check_implicit_admin=False):
|
check_implicit_admin=False):
|
||||||
if not os.path.exists(target):
|
if not os.path.exists(target):
|
||||||
return module.fail_json(msg="target %s does not exist on the host" % target)
|
return module.fail_json(msg="target %s does not exist on the host" % target)
|
||||||
|
|
||||||
cmd_str = 'mysql'
|
cmd = [module.get_bin_path('mysql', True)]
|
||||||
if server_implementation == 'mariadb' and LooseVersion(server_version) >= LooseVersion("10.4.6"):
|
|
||||||
cmd_str = 'mariadb'
|
|
||||||
try:
|
|
||||||
cmd = [module.get_bin_path(cmd_str, True)]
|
|
||||||
except Exception as e:
|
|
||||||
return 1, "", "Error determining mysql/mariadb command: %s" % str(e)
|
|
||||||
|
|
||||||
# --defaults-file must go first, or errors out
|
# --defaults-file must go first, or errors out
|
||||||
if config_file:
|
if config_file:
|
||||||
if restrict_config_file:
|
if restrict_config_file:
|
||||||
|
@ -551,8 +482,6 @@ def db_import(module, host, user, password, db_name, target, all_databases, port
|
||||||
comp_prog_path = module.get_bin_path('bzip2', required=True)
|
comp_prog_path = module.get_bin_path('bzip2', required=True)
|
||||||
elif os.path.splitext(target)[-1] == '.xz':
|
elif os.path.splitext(target)[-1] == '.xz':
|
||||||
comp_prog_path = module.get_bin_path('xz', required=True)
|
comp_prog_path = module.get_bin_path('xz', required=True)
|
||||||
elif os.path.splitext(target)[-1] == '.zst':
|
|
||||||
comp_prog_path = module.get_bin_path('zstd', required=True)
|
|
||||||
if comp_prog_path:
|
if comp_prog_path:
|
||||||
# The line below is for returned data only:
|
# The line below is for returned data only:
|
||||||
executed_commands.append('%s -dc %s | %s' % (comp_prog_path, target, cmd))
|
executed_commands.append('%s -dc %s | %s' % (comp_prog_path, target, cmd))
|
||||||
|
@ -593,8 +522,7 @@ def db_create(cursor, db, encoding, collation):
|
||||||
query_params = dict(enc=encoding, collate=collation)
|
query_params = dict(enc=encoding, collate=collation)
|
||||||
res = 0
|
res = 0
|
||||||
for each_db in db:
|
for each_db in db:
|
||||||
# Escape '%' since mysql cursor.execute() uses a format string
|
query = ['CREATE DATABASE %s' % mysql_quote_identifier(each_db, 'database')]
|
||||||
query = ['CREATE DATABASE %s' % mysql_quote_identifier(each_db, 'database').replace('%', '%%')]
|
|
||||||
if encoding:
|
if encoding:
|
||||||
query.append("CHARACTER SET %(enc)s")
|
query.append("CHARACTER SET %(enc)s")
|
||||||
if collation:
|
if collation:
|
||||||
|
@ -618,14 +546,14 @@ def db_create(cursor, db, encoding, collation):
|
||||||
def main():
|
def main():
|
||||||
argument_spec = mysql_common_argument_spec()
|
argument_spec = mysql_common_argument_spec()
|
||||||
argument_spec.update(
|
argument_spec.update(
|
||||||
name=dict(type='list', elements='str', required=True, aliases=['db']),
|
name=dict(type='list', required=True, aliases=['db']),
|
||||||
encoding=dict(type='str', default=''),
|
encoding=dict(type='str', default=''),
|
||||||
collation=dict(type='str', default=''),
|
collation=dict(type='str', default=''),
|
||||||
target=dict(type='path'),
|
target=dict(type='path'),
|
||||||
state=dict(type='str', default='present', choices=['absent', 'dump', 'import', 'present']),
|
state=dict(type='str', default='present', choices=['absent', 'dump', 'import', 'present']),
|
||||||
single_transaction=dict(type='bool', default=False),
|
single_transaction=dict(type='bool', default=False),
|
||||||
quick=dict(type='bool', default=True),
|
quick=dict(type='bool', default=True),
|
||||||
ignore_tables=dict(type='list', elements='str', default=[]),
|
ignore_tables=dict(type='list', default=[]),
|
||||||
hex_blob=dict(default=False, type='bool'),
|
hex_blob=dict(default=False, type='bool'),
|
||||||
force=dict(type='bool', default=False),
|
force=dict(type='bool', default=False),
|
||||||
master_data=dict(type='int', default=0, choices=[0, 1, 2]),
|
master_data=dict(type='int', default=0, choices=[0, 1, 2]),
|
||||||
|
@ -636,9 +564,6 @@ def main():
|
||||||
restrict_config_file=dict(type='bool', default=False),
|
restrict_config_file=dict(type='bool', default=False),
|
||||||
check_implicit_admin=dict(type='bool', default=False),
|
check_implicit_admin=dict(type='bool', default=False),
|
||||||
config_overrides_defaults=dict(type='bool', default=False),
|
config_overrides_defaults=dict(type='bool', default=False),
|
||||||
chdir=dict(type='path'),
|
|
||||||
pipefail=dict(type='bool', default=False),
|
|
||||||
sql_log_bin=dict(type='bool', default=True),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
module = AnsibleModule(
|
module = AnsibleModule(
|
||||||
|
@ -687,15 +612,6 @@ def main():
|
||||||
restrict_config_file = module.params["restrict_config_file"]
|
restrict_config_file = module.params["restrict_config_file"]
|
||||||
check_implicit_admin = module.params['check_implicit_admin']
|
check_implicit_admin = module.params['check_implicit_admin']
|
||||||
config_overrides_defaults = module.params['config_overrides_defaults']
|
config_overrides_defaults = module.params['config_overrides_defaults']
|
||||||
chdir = module.params['chdir']
|
|
||||||
pipefail = module.params['pipefail']
|
|
||||||
sql_log_bin = module.params["sql_log_bin"]
|
|
||||||
|
|
||||||
if chdir:
|
|
||||||
try:
|
|
||||||
os.chdir(chdir)
|
|
||||||
except Exception as e:
|
|
||||||
module.fail_json("Cannot change the current directory to %s: %s" % (chdir, e))
|
|
||||||
|
|
||||||
if len(db) > 1 and state == 'import':
|
if len(db) > 1 and state == 'import':
|
||||||
module.fail_json(msg="Multiple databases are not supported with state=import")
|
module.fail_json(msg="Multiple databases are not supported with state=import")
|
||||||
|
@ -732,12 +648,6 @@ def main():
|
||||||
else:
|
else:
|
||||||
module.fail_json(msg="unable to find %s. Exception message: %s" % (config_file, to_native(e)))
|
module.fail_json(msg="unable to find %s. Exception message: %s" % (config_file, to_native(e)))
|
||||||
|
|
||||||
if state in ['absent', 'present'] and not sql_log_bin:
|
|
||||||
cursor.execute("SET SQL_LOG_BIN=0;")
|
|
||||||
|
|
||||||
server_implementation = get_server_implementation(cursor)
|
|
||||||
server_version = get_server_version(cursor)
|
|
||||||
|
|
||||||
changed = False
|
changed = False
|
||||||
if not os.path.exists(config_file):
|
if not os.path.exists(config_file):
|
||||||
config_file = None
|
config_file = None
|
||||||
|
@ -778,12 +688,11 @@ def main():
|
||||||
module.exit_json(changed=True, db=db_name, db_list=db)
|
module.exit_json(changed=True, db=db_name, db_list=db)
|
||||||
rc, stdout, stderr = db_dump(module, login_host, login_user,
|
rc, stdout, stderr = db_dump(module, login_host, login_user,
|
||||||
login_password, db, target, all_databases,
|
login_password, db, target, all_databases,
|
||||||
login_port, config_file, server_implementation, server_version,
|
login_port, config_file, socket, ssl_cert, ssl_key,
|
||||||
socket, ssl_cert, ssl_key,
|
|
||||||
ssl_ca, single_transaction, quick, ignore_tables,
|
ssl_ca, single_transaction, quick, ignore_tables,
|
||||||
hex_blob, encoding, force, master_data, skip_lock_tables,
|
hex_blob, encoding, force, master_data, skip_lock_tables,
|
||||||
dump_extra_args, unsafe_login_password, restrict_config_file,
|
dump_extra_args, unsafe_login_password, restrict_config_file,
|
||||||
check_implicit_admin, pipefail)
|
check_implicit_admin)
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
module.fail_json(msg="%s" % stderr)
|
module.fail_json(msg="%s" % stderr)
|
||||||
module.exit_json(changed=True, db=db_name, db_list=db, msg=stdout,
|
module.exit_json(changed=True, db=db_name, db_list=db, msg=stdout,
|
||||||
|
@ -800,8 +709,8 @@ def main():
|
||||||
rc, stdout, stderr = db_import(module, login_host, login_user,
|
rc, stdout, stderr = db_import(module, login_host, login_user,
|
||||||
login_password, db, target,
|
login_password, db, target,
|
||||||
all_databases,
|
all_databases,
|
||||||
login_port, config_file, server_implementation,
|
login_port, config_file,
|
||||||
server_version, socket, ssl_cert, ssl_key, ssl_ca,
|
socket, ssl_cert, ssl_key, ssl_ca,
|
||||||
encoding, force, use_shell, unsafe_login_password,
|
encoding, force, use_shell, unsafe_login_password,
|
||||||
restrict_config_file, check_implicit_admin)
|
restrict_config_file, check_implicit_admin)
|
||||||
if rc != 0:
|
if rc != 0:
|
||||||
|
|
|
@ -1,27 +1,25 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
|
|
||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
|
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
DOCUMENTATION = r'''
|
DOCUMENTATION = r'''
|
||||||
---
|
---
|
||||||
module: mysql_info
|
module: mysql_info
|
||||||
short_description: Gather information about MySQL or MariaDB servers
|
short_description: Gather information about MySQL servers
|
||||||
description:
|
description:
|
||||||
- Gathers information about MySQL or MariaDB servers.
|
- Gathers information about MySQL servers.
|
||||||
|
|
||||||
options:
|
options:
|
||||||
filter:
|
filter:
|
||||||
description:
|
description:
|
||||||
- Limit the collected information by comma separated string or YAML list.
|
- Limit the collected information by comma separated string or YAML list.
|
||||||
- Allowable values are C(version), C(databases), C(settings), C(global_status),
|
- Allowable values are C(version), C(databases), C(settings), C(global_status),
|
||||||
C(users), C(users_info), C(engines), C(master_status), C(slave_status), C(slave_hosts).
|
C(users), C(engines), C(master_status), C(slave_status), C(slave_hosts).
|
||||||
- By default, collects all subsets.
|
- By default, collects all subsets.
|
||||||
- You can use '!' before value (for example, C(!settings)) to exclude it from the information.
|
- You can use '!' before value (for example, C(!settings)) to exclude it from the information.
|
||||||
- If you pass including and excluding values to the filter, for example, I(filter=!settings,version),
|
- If you pass including and excluding values to the filter, for example, I(filter=!settings,version),
|
||||||
|
@ -36,7 +34,7 @@ options:
|
||||||
exclude_fields:
|
exclude_fields:
|
||||||
description:
|
description:
|
||||||
- List of fields which are not needed to collect.
|
- List of fields which are not needed to collect.
|
||||||
- "Supports elements: C(db_size), C(db_table_count). Unsupported elements will be ignored."
|
- "Supports elements: C(db_size). Unsupported elements will be ignored."
|
||||||
type: list
|
type: list
|
||||||
elements: str
|
elements: str
|
||||||
version_added: '0.1.0'
|
version_added: '0.1.0'
|
||||||
|
@ -47,14 +45,9 @@ options:
|
||||||
default: false
|
default: false
|
||||||
|
|
||||||
notes:
|
notes:
|
||||||
- Compatible with MariaDB or MySQL.
|
|
||||||
- Calculating the size of a database might be slow, depending on the number and size of tables in it.
|
- Calculating the size of a database might be slow, depending on the number and size of tables in it.
|
||||||
To avoid this, use I(exclude_fields=db_size).
|
To avoid this, use I(exclude_fields=db_size).
|
||||||
- filters C(users_info) doesn't support MariaDB roles.
|
- Supports C(check_mode).
|
||||||
|
|
||||||
attributes:
|
|
||||||
check_mode:
|
|
||||||
support: full
|
|
||||||
|
|
||||||
seealso:
|
seealso:
|
||||||
- module: community.mysql.mysql_variables
|
- module: community.mysql.mysql_variables
|
||||||
|
@ -78,9 +71,6 @@ EXAMPLES = r'''
|
||||||
# Display only databases and users info:
|
# Display only databases and users info:
|
||||||
# ansible mysql-hosts -m mysql_info -a 'filter=databases,users'
|
# ansible mysql-hosts -m mysql_info -a 'filter=databases,users'
|
||||||
|
|
||||||
# Display all users privileges:
|
|
||||||
# ansible mysql-hosts -m mysql_info -a 'filter=users_info'
|
|
||||||
|
|
||||||
# Display only slave status:
|
# Display only slave status:
|
||||||
# ansible standby -m mysql_info -a 'filter=slave_status'
|
# ansible standby -m mysql_info -a 'filter=slave_status'
|
||||||
|
|
||||||
|
@ -129,49 +119,9 @@ EXAMPLES = r'''
|
||||||
- databases
|
- databases
|
||||||
exclude_fields: db_size
|
exclude_fields: db_size
|
||||||
return_empty_dbs: true
|
return_empty_dbs: true
|
||||||
|
|
||||||
- name: Clone users from one server to another
|
|
||||||
block:
|
|
||||||
# Step 1
|
|
||||||
- name: Fetch information from a source server
|
|
||||||
delegate_to: server_source
|
|
||||||
community.mysql.mysql_info:
|
|
||||||
filter:
|
|
||||||
- users_info
|
|
||||||
register: result
|
|
||||||
|
|
||||||
# Step 2
|
|
||||||
# Don't work with sha256_password and cache_sha2_password
|
|
||||||
- name: Clone users fetched in a previous task to a target server
|
|
||||||
community.mysql.mysql_user:
|
|
||||||
name: "{{ item.name }}"
|
|
||||||
host: "{{ item.host }}"
|
|
||||||
plugin: "{{ item.plugin | default(omit) }}"
|
|
||||||
plugin_auth_string: "{{ item.plugin_auth_string | default(omit) }}"
|
|
||||||
plugin_hash_string: "{{ item.plugin_hash_string | default(omit) }}"
|
|
||||||
tls_requires: "{{ item.tls_requires | default(omit) }}"
|
|
||||||
priv: "{{ item.priv | default(omit) }}"
|
|
||||||
resource_limits: "{{ item.resource_limits | default(omit) }}"
|
|
||||||
locked: "{{ item.locked | default(omit) }}"
|
|
||||||
column_case_sensitive: true
|
|
||||||
state: present
|
|
||||||
loop: "{{ result.users_info }}"
|
|
||||||
loop_control:
|
|
||||||
label: "{{ item.name }}@{{ item.host }}"
|
|
||||||
when:
|
|
||||||
- item.name != 'root' # In case you don't want to import admin accounts
|
|
||||||
- item.name != 'mariadb.sys'
|
|
||||||
- item.name != 'mysql'
|
|
||||||
- item.name != 'PUBLIC' # MariaDB roles are not supported
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
RETURN = r'''
|
RETURN = r'''
|
||||||
server_engine:
|
|
||||||
description: Database server engine.
|
|
||||||
returned: if not excluded by filter
|
|
||||||
type: str
|
|
||||||
sample: 'MariaDB'
|
|
||||||
version_added: '3.10.0'
|
|
||||||
version:
|
version:
|
||||||
description: Database server version.
|
description: Database server version.
|
||||||
returned: if not excluded by filter
|
returned: if not excluded by filter
|
||||||
|
@ -208,19 +158,13 @@ databases:
|
||||||
returned: if not excluded by filter
|
returned: if not excluded by filter
|
||||||
type: dict
|
type: dict
|
||||||
sample:
|
sample:
|
||||||
- { "mysql": { "size": 656594, "tables": 31 }, "information_schema": { "size": 73728, "tables": 79 } }
|
- { "mysql": { "size": 656594 }, "information_schema": { "size": 73728 } }
|
||||||
contains:
|
contains:
|
||||||
size:
|
size:
|
||||||
description: Database size in bytes.
|
description: Database size in bytes.
|
||||||
returned: if not excluded by filter
|
returned: if not excluded by filter
|
||||||
type: dict
|
type: dict
|
||||||
sample: { 'size': 656594 }
|
sample: { 'size': 656594 }
|
||||||
tables:
|
|
||||||
description: Count of tables and views in that database.
|
|
||||||
returned: if not excluded by filter
|
|
||||||
type: dict
|
|
||||||
sample: { 'tables': 12 }
|
|
||||||
version_added: '3.11.0'
|
|
||||||
settings:
|
settings:
|
||||||
description: Global settings (variables) information.
|
description: Global settings (variables) information.
|
||||||
returned: if not excluded by filter
|
returned: if not excluded by filter
|
||||||
|
@ -234,34 +178,11 @@ global_status:
|
||||||
sample:
|
sample:
|
||||||
- { "Innodb_buffer_pool_read_requests": 123, "Innodb_buffer_pool_reads": 32 }
|
- { "Innodb_buffer_pool_read_requests": 123, "Innodb_buffer_pool_reads": 32 }
|
||||||
users:
|
users:
|
||||||
description: Return a dictionnary of users grouped by host and with global privileges only.
|
description: Users information.
|
||||||
returned: if not excluded by filter
|
returned: if not excluded by filter
|
||||||
type: dict
|
type: dict
|
||||||
sample:
|
sample:
|
||||||
- { "localhost": { "root": { "Alter_priv": "Y", "Alter_routine_priv": "Y" } } }
|
- { "localhost": { "root": { "Alter_priv": "Y", "Alter_routine_priv": "Y" } } }
|
||||||
users_info:
|
|
||||||
description:
|
|
||||||
- Information about users accounts.
|
|
||||||
- The output can be used as an input of the M(community.mysql.mysql_user) plugin.
|
|
||||||
- Useful when migrating accounts to another server or to create an inventory.
|
|
||||||
- Does not support proxy privileges. If an account has proxy privileges, they won't appear in the output.
|
|
||||||
- Causes issues with authentications plugins C(sha256_password) and C(caching_sha2_password).
|
|
||||||
If the output is fed to M(community.mysql.mysql_user), the
|
|
||||||
``plugin_auth_string`` will most likely be unreadable due to non-binary
|
|
||||||
characters.
|
|
||||||
- The "locked" field was aded in ``community.mysql`` 3.13.
|
|
||||||
returned: if not excluded by filter
|
|
||||||
type: dict
|
|
||||||
sample:
|
|
||||||
- { "plugin_auth_string": '*1234567',
|
|
||||||
"name": "user1",
|
|
||||||
"host": "host.com",
|
|
||||||
"plugin": "mysql_native_password",
|
|
||||||
"priv": "db1.*:SELECT/db2.*:SELECT",
|
|
||||||
"resource_limits": { "MAX_USER_CONNECTIONS": 100 },
|
|
||||||
"tls_requires": { "SSL": null },
|
|
||||||
"locked": false }
|
|
||||||
version_added: '3.8.0'
|
|
||||||
engines:
|
engines:
|
||||||
description: Information about the server's storage engines.
|
description: Information about the server's storage engines.
|
||||||
returned: if not excluded by filter
|
returned: if not excluded by filter
|
||||||
|
@ -292,22 +213,20 @@ connector_name:
|
||||||
type: str
|
type: str
|
||||||
sample:
|
sample:
|
||||||
- "pymysql"
|
- "pymysql"
|
||||||
version_added: '3.6.0'
|
- "MySQLdb"
|
||||||
|
version_added: '1.5.0'
|
||||||
connector_version:
|
connector_version:
|
||||||
description: Version of the python connector used by the module. When the connector is not identified, returns C(Unknown).
|
description: Version of the python connector used by the module. When the connector is not identified, returns C(Unknown).
|
||||||
returned: always
|
returned: always
|
||||||
type: str
|
type: str
|
||||||
sample:
|
sample:
|
||||||
- "1.0.2"
|
- "1.0.2"
|
||||||
version_added: '3.6.0'
|
version_added: '1.5.0'
|
||||||
'''
|
'''
|
||||||
|
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.command_resolver import (
|
|
||||||
CommandResolver
|
|
||||||
)
|
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.mysql import (
|
from ansible_collections.community.mysql.plugins.module_utils.mysql import (
|
||||||
mysql_connect,
|
mysql_connect,
|
||||||
mysql_common_argument_spec,
|
mysql_common_argument_spec,
|
||||||
|
@ -315,16 +234,6 @@ from ansible_collections.community.mysql.plugins.module_utils.mysql import (
|
||||||
mysql_driver_fail_msg,
|
mysql_driver_fail_msg,
|
||||||
get_connector_name,
|
get_connector_name,
|
||||||
get_connector_version,
|
get_connector_version,
|
||||||
get_server_implementation,
|
|
||||||
get_server_version,
|
|
||||||
)
|
|
||||||
|
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.user import (
|
|
||||||
privileges_get,
|
|
||||||
get_resource_limits,
|
|
||||||
get_existing_authentication,
|
|
||||||
get_user_implementation,
|
|
||||||
user_is_locked,
|
|
||||||
)
|
)
|
||||||
from ansible.module_utils.six import iteritems
|
from ansible.module_utils.six import iteritems
|
||||||
from ansible.module_utils._text import to_native
|
from ansible.module_utils._text import to_native
|
||||||
|
@ -352,13 +261,9 @@ class MySQL_Info(object):
|
||||||
5. add info about the new subset with an example to RETURN block
|
5. add info about the new subset with an example to RETURN block
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, module, cursor, server_implementation, server_version, user_implementation):
|
def __init__(self, module, cursor):
|
||||||
self.module = module
|
self.module = module
|
||||||
self.cursor = cursor
|
self.cursor = cursor
|
||||||
self.server_implementation = server_implementation
|
|
||||||
self.server_version = server_version
|
|
||||||
self.user_implementation = user_implementation
|
|
||||||
self.command_resolver = CommandResolver(self.server_implementation, self.server_version)
|
|
||||||
self.info = {
|
self.info = {
|
||||||
'version': {},
|
'version': {},
|
||||||
'databases': {},
|
'databases': {},
|
||||||
|
@ -366,7 +271,6 @@ class MySQL_Info(object):
|
||||||
'global_status': {},
|
'global_status': {},
|
||||||
'engines': {},
|
'engines': {},
|
||||||
'users': {},
|
'users': {},
|
||||||
'users_info': {},
|
|
||||||
'master_status': {},
|
'master_status': {},
|
||||||
'slave_hosts': {},
|
'slave_hosts': {},
|
||||||
'slave_status': {},
|
'slave_status': {},
|
||||||
|
@ -435,9 +339,6 @@ class MySQL_Info(object):
|
||||||
if 'users' in wanted:
|
if 'users' in wanted:
|
||||||
self.__get_users()
|
self.__get_users()
|
||||||
|
|
||||||
if 'users_info' in wanted:
|
|
||||||
self.__get_users_info()
|
|
||||||
|
|
||||||
if 'master_status' in wanted:
|
if 'master_status' in wanted:
|
||||||
self.__get_master_status()
|
self.__get_master_status()
|
||||||
|
|
||||||
|
@ -520,8 +421,7 @@ class MySQL_Info(object):
|
||||||
|
|
||||||
def __get_master_status(self):
|
def __get_master_status(self):
|
||||||
"""Get master status if the instance is a master."""
|
"""Get master status if the instance is a master."""
|
||||||
query = self.command_resolver.resolve_command("SHOW MASTER STATUS")
|
res = self.__exec_sql('SHOW MASTER STATUS')
|
||||||
res = self.__exec_sql(query)
|
|
||||||
if res:
|
if res:
|
||||||
for line in res:
|
for line in res:
|
||||||
for vname, val in iteritems(line):
|
for vname, val in iteritems(line):
|
||||||
|
@ -529,8 +429,7 @@ class MySQL_Info(object):
|
||||||
|
|
||||||
def __get_slave_status(self):
|
def __get_slave_status(self):
|
||||||
"""Get slave status if the instance is a slave."""
|
"""Get slave status if the instance is a slave."""
|
||||||
query = self.command_resolver.resolve_command("SHOW SLAVE STATUS")
|
res = self.__exec_sql('SHOW SLAVE STATUS')
|
||||||
res = self.__exec_sql(query)
|
|
||||||
if res:
|
if res:
|
||||||
for line in res:
|
for line in res:
|
||||||
host = line['Master_Host']
|
host = line['Master_Host']
|
||||||
|
@ -551,8 +450,7 @@ class MySQL_Info(object):
|
||||||
|
|
||||||
def __get_slaves(self):
|
def __get_slaves(self):
|
||||||
"""Get slave hosts info if the instance is a master."""
|
"""Get slave hosts info if the instance is a master."""
|
||||||
query = self.command_resolver.resolve_command("SHOW SLAVE HOSTS")
|
res = self.__exec_sql('SHOW SLAVE HOSTS')
|
||||||
res = self.__exec_sql(query)
|
|
||||||
if res:
|
if res:
|
||||||
for line in res:
|
for line in res:
|
||||||
srv_id = line['Server_id']
|
srv_id = line['Server_id']
|
||||||
|
@ -579,133 +477,42 @@ class MySQL_Info(object):
|
||||||
if vname not in ('Host', 'User'):
|
if vname not in ('Host', 'User'):
|
||||||
self.info['users'][host][user][vname] = self.__convert(val)
|
self.info['users'][host][user][vname] = self.__convert(val)
|
||||||
|
|
||||||
def __get_users_info(self):
|
|
||||||
"""Get user privileges, passwords, resources_limits, ...
|
|
||||||
|
|
||||||
Query the server to get all the users and return a string
|
|
||||||
of privileges that can be used by the mysql_user plugin.
|
|
||||||
For instance:
|
|
||||||
|
|
||||||
"users_info": [
|
|
||||||
{
|
|
||||||
"host": "users_info.com",
|
|
||||||
"priv": "*.*: ALL,GRANT",
|
|
||||||
"name": "users_info_adm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"host": "users_info.com",
|
|
||||||
"priv": "`mysql`.*: SELECT/`users_info_db`.*: SELECT",
|
|
||||||
"name": "users_info_multi"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
"""
|
|
||||||
res = self.__exec_sql('SELECT * FROM mysql.user')
|
|
||||||
if not res:
|
|
||||||
return None
|
|
||||||
|
|
||||||
output = list()
|
|
||||||
for line in res:
|
|
||||||
user = line['User']
|
|
||||||
host = line['Host']
|
|
||||||
|
|
||||||
# MariaDB roles have no host
|
|
||||||
is_role = self.server_implementation == 'mariadb' and not host
|
|
||||||
user_priv = privileges_get(self.cursor, user, host, maria_role=is_role)
|
|
||||||
|
|
||||||
if not user_priv:
|
|
||||||
self.module.warn("No privileges found for %s on host %s" % (user, host))
|
|
||||||
continue
|
|
||||||
|
|
||||||
priv_string = list()
|
|
||||||
for db_table, priv in user_priv.items():
|
|
||||||
# Proxy privileges are hard to work with because of different quotes or
|
|
||||||
# backticks like ''@'', ''@'%' or even ``@``. In addition, MySQL will
|
|
||||||
# forbid you to grant a proxy privileges through TCP.
|
|
||||||
if set(priv) == {'PROXY', 'GRANT'} or set(priv) == {'PROXY'}:
|
|
||||||
continue
|
|
||||||
|
|
||||||
unquote_db_table = db_table.replace('`', '').replace("'", '')
|
|
||||||
priv_string.append('%s:%s' % (unquote_db_table, ','.join(priv)))
|
|
||||||
|
|
||||||
# Only keep *.* USAGE if it's the only user privilege given
|
|
||||||
if len(priv_string) > 1 and '*.*:USAGE' in priv_string:
|
|
||||||
priv_string.remove('*.*:USAGE')
|
|
||||||
|
|
||||||
resource_limits = get_resource_limits(self.cursor, user, host)
|
|
||||||
copy_ressource_limits = dict.copy(resource_limits)
|
|
||||||
|
|
||||||
tls_requires = self.user_implementation.get_tls_requires(
|
|
||||||
self.cursor, user, host)
|
|
||||||
|
|
||||||
output_dict = {
|
|
||||||
'name': user,
|
|
||||||
'host': host,
|
|
||||||
'priv': '/'.join(priv_string),
|
|
||||||
'resource_limits': copy_ressource_limits,
|
|
||||||
'tls_requires': tls_requires,
|
|
||||||
}
|
|
||||||
|
|
||||||
# Prevent returning a resource limit if empty
|
|
||||||
if resource_limits:
|
|
||||||
for key, value in resource_limits.items():
|
|
||||||
if value == 0:
|
|
||||||
del output_dict['resource_limits'][key]
|
|
||||||
if len(output_dict['resource_limits']) == 0:
|
|
||||||
del output_dict['resource_limits']
|
|
||||||
|
|
||||||
# Prevent returning tls_require if empty
|
|
||||||
if not tls_requires:
|
|
||||||
del output_dict['tls_requires']
|
|
||||||
|
|
||||||
authentications = get_existing_authentication(self.cursor, user, host)
|
|
||||||
if authentications:
|
|
||||||
output_dict.update(authentications[0])
|
|
||||||
|
|
||||||
if line.get('is_role') and line['is_role'] == 'N':
|
|
||||||
output_dict['locked'] = user_is_locked(self.cursor, user, host)
|
|
||||||
|
|
||||||
# TODO password_option
|
|
||||||
# but both are not supported by mysql_user atm. So no point yet.
|
|
||||||
|
|
||||||
output.append(output_dict)
|
|
||||||
|
|
||||||
self.info['users_info'] = output
|
|
||||||
|
|
||||||
def __get_databases(self, exclude_fields, return_empty_dbs):
|
def __get_databases(self, exclude_fields, return_empty_dbs):
|
||||||
"""Get info about databases."""
|
"""Get info about databases."""
|
||||||
|
if not exclude_fields:
|
||||||
|
query = ('SELECT table_schema AS "name", '
|
||||||
|
'SUM(data_length + index_length) AS "size" '
|
||||||
|
'FROM information_schema.TABLES GROUP BY table_schema')
|
||||||
|
else:
|
||||||
|
if 'db_size' in exclude_fields:
|
||||||
|
query = ('SELECT table_schema AS "name" '
|
||||||
|
'FROM information_schema.TABLES GROUP BY table_schema')
|
||||||
|
|
||||||
def is_field_included(field_name):
|
res = self.__exec_sql(query)
|
||||||
return not exclude_fields or 'db_{}'.format(field_name) not in exclude_fields
|
|
||||||
|
|
||||||
def create_db_info(db_data):
|
if res:
|
||||||
info = {}
|
for db in res:
|
||||||
if is_field_included('size'):
|
self.info['databases'][db['name']] = {}
|
||||||
info['size'] = int(db_data.get('size', 0) or 0)
|
|
||||||
if is_field_included('table_count'):
|
|
||||||
info['tables'] = int(db_data.get('tables', 0) or 0)
|
|
||||||
return info
|
|
||||||
|
|
||||||
# Build the main query
|
if not exclude_fields or 'db_size' not in exclude_fields:
|
||||||
query_parts = ['SELECT table_schema AS "name"']
|
if db['size'] is None:
|
||||||
if is_field_included('size'):
|
db['size'] = 0
|
||||||
query_parts.append('SUM(data_length + index_length) AS "size"')
|
|
||||||
if is_field_included('table_count'):
|
|
||||||
query_parts.append('COUNT(table_name) as "tables"')
|
|
||||||
|
|
||||||
query = "{} FROM information_schema.TABLES GROUP BY table_schema".format(", ".join(query_parts))
|
self.info['databases'][db['name']]['size'] = int(db['size'])
|
||||||
|
|
||||||
# Get and process databases with tables
|
# If empty dbs are not needed in the returned dict, exit from the method
|
||||||
databases = self.__exec_sql(query) or []
|
if not return_empty_dbs:
|
||||||
for db in databases:
|
return None
|
||||||
self.info['databases'][db['name']] = create_db_info(db)
|
|
||||||
|
|
||||||
# Handle empty databases if requested
|
# Add info about empty databases (issue #65727):
|
||||||
if return_empty_dbs:
|
res = self.__exec_sql('SHOW DATABASES')
|
||||||
empty_databases = self.__exec_sql('SHOW DATABASES') or []
|
if res:
|
||||||
for db in empty_databases:
|
for db in res:
|
||||||
db_name = db['Database']
|
if db['Database'] not in self.info['databases']:
|
||||||
if db_name not in self.info['databases']:
|
self.info['databases'][db['Database']] = {}
|
||||||
self.info['databases'][db_name] = create_db_info({})
|
|
||||||
|
if not exclude_fields or 'db_size' not in exclude_fields:
|
||||||
|
self.info['databases'][db['Database']]['size'] = 0
|
||||||
|
|
||||||
def __exec_sql(self, query, ddl=False):
|
def __exec_sql(self, query, ddl=False):
|
||||||
"""Execute SQL.
|
"""Execute SQL.
|
||||||
|
@ -737,8 +544,8 @@ def main():
|
||||||
argument_spec = mysql_common_argument_spec()
|
argument_spec = mysql_common_argument_spec()
|
||||||
argument_spec.update(
|
argument_spec.update(
|
||||||
login_db=dict(type='str'),
|
login_db=dict(type='str'),
|
||||||
filter=dict(type='list', elements='str'),
|
filter=dict(type='list'),
|
||||||
exclude_fields=dict(type='list', elements='str'),
|
exclude_fields=dict(type='list'),
|
||||||
return_empty_dbs=dict(type='bool', default=False),
|
return_empty_dbs=dict(type='bool', default=False),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -783,17 +590,12 @@ def main():
|
||||||
'Exception message: %s' % (connector_name, connector_version, config_file, to_native(e)))
|
'Exception message: %s' % (connector_name, connector_version, config_file, to_native(e)))
|
||||||
module.fail_json(msg)
|
module.fail_json(msg)
|
||||||
|
|
||||||
server_implementation = get_server_implementation(cursor)
|
|
||||||
server_version = get_server_version(cursor)
|
|
||||||
user_implementation = get_user_implementation(cursor)
|
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
# Create object and do main job
|
# Create object and do main job
|
||||||
|
|
||||||
mysql = MySQL_Info(module, cursor, server_implementation, server_version, user_implementation)
|
mysql = MySQL_Info(module, cursor)
|
||||||
|
|
||||||
module.exit_json(changed=False,
|
module.exit_json(changed=False,
|
||||||
server_engine='MariaDB' if server_implementation == 'mariadb' else 'MySQL',
|
|
||||||
connector_name=connector_name,
|
connector_name=connector_name,
|
||||||
connector_version=connector_version,
|
connector_version=connector_version,
|
||||||
**mysql.get_info(filter_, exclude_fields, return_empty_dbs))
|
**mysql.get_info(filter_, exclude_fields, return_empty_dbs))
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright: (c) 2020, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2020, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
|
@ -10,9 +10,9 @@ __metaclass__ = type
|
||||||
DOCUMENTATION = r'''
|
DOCUMENTATION = r'''
|
||||||
---
|
---
|
||||||
module: mysql_query
|
module: mysql_query
|
||||||
short_description: Run MySQL or MariaDB queries
|
short_description: Run MySQL queries
|
||||||
description:
|
description:
|
||||||
- Runs arbitrary MySQL or MariaDB queries.
|
- Runs arbitrary MySQL queries.
|
||||||
- Pay attention, the module does not support check mode!
|
- Pay attention, the module does not support check mode!
|
||||||
All queries will be executed in autocommit mode.
|
All queries will be executed in autocommit mode.
|
||||||
- To run SQL queries from a file, use M(community.mysql.mysql_db) module.
|
- To run SQL queries from a file, use M(community.mysql.mysql_db) module.
|
||||||
|
@ -26,9 +26,9 @@ options:
|
||||||
as a formatting character. All literal C(%) characters in the query should be
|
as a formatting character. All literal C(%) characters in the query should be
|
||||||
escaped as C(%%).
|
escaped as C(%%).
|
||||||
- Note that if you use the C(IF EXISTS/IF NOT EXISTS) clauses in your query
|
- Note that if you use the C(IF EXISTS/IF NOT EXISTS) clauses in your query
|
||||||
and C(mysqlclient) or C(PyMySQL 0.10.0+) connectors, the module will report
|
and C(mysqlclient) connector, the module will report that
|
||||||
that the state has been changed even if it has not. If it is important in your
|
the state has been changed even if it has not. If it is important in your
|
||||||
workflow, use the C(PyMySQL 0.9.3) connector instead.
|
workflow, use the C(PyMySQL) connector instead.
|
||||||
type: raw
|
type: raw
|
||||||
required: true
|
required: true
|
||||||
positional_args:
|
positional_args:
|
||||||
|
@ -36,7 +36,6 @@ options:
|
||||||
- List of values to be passed as positional arguments to the query.
|
- List of values to be passed as positional arguments to the query.
|
||||||
- Mutually exclusive with I(named_args).
|
- Mutually exclusive with I(named_args).
|
||||||
type: list
|
type: list
|
||||||
elements: raw
|
|
||||||
named_args:
|
named_args:
|
||||||
description:
|
description:
|
||||||
- Dictionary of key-value arguments to pass to the query.
|
- Dictionary of key-value arguments to pass to the query.
|
||||||
|
@ -51,17 +50,13 @@ options:
|
||||||
- Where passed queries run in a single transaction (C(yes)) or commit them one-by-one (C(no)).
|
- Where passed queries run in a single transaction (C(yes)) or commit them one-by-one (C(no)).
|
||||||
type: bool
|
type: bool
|
||||||
default: false
|
default: false
|
||||||
attributes:
|
|
||||||
check_mode:
|
|
||||||
support: none
|
|
||||||
seealso:
|
seealso:
|
||||||
- module: community.mysql.mysql_db
|
- module: community.mysql.mysql_db
|
||||||
notes:
|
|
||||||
- Compatible with MariaDB or MySQL.
|
|
||||||
author:
|
author:
|
||||||
- Andrew Klychkov (@Andersson007)
|
- Andrew Klychkov (@Andersson007)
|
||||||
extends_documentation_fragment:
|
extends_documentation_fragment:
|
||||||
- community.mysql.mysql
|
- community.mysql.mysql
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
EXAMPLES = r'''
|
EXAMPLES = r'''
|
||||||
|
@ -116,18 +111,8 @@ rowcount:
|
||||||
returned: changed
|
returned: changed
|
||||||
type: list
|
type: list
|
||||||
sample: [5, 1]
|
sample: [5, 1]
|
||||||
execution_time_ms:
|
|
||||||
description:
|
|
||||||
- A list containing execution time per query in milliseconds.
|
|
||||||
- The measurements are done right before and after passing
|
|
||||||
the query to the driver for execution.
|
|
||||||
returned: success
|
|
||||||
type: list
|
|
||||||
sample: [7104, 85]
|
|
||||||
version_added: '3.12.0'
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import time
|
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
|
@ -148,32 +133,12 @@ DDL_QUERY_KEYWORDS = ('CREATE', 'DROP', 'ALTER', 'RENAME', 'TRUNCATE')
|
||||||
# Module execution.
|
# Module execution.
|
||||||
#
|
#
|
||||||
|
|
||||||
def get_time():
|
|
||||||
try:
|
|
||||||
time_taken = time.perf_counter()
|
|
||||||
except AttributeError:
|
|
||||||
# For Python 2 compatibility, fallback to time.time()
|
|
||||||
time_taken = time.time()
|
|
||||||
return time_taken
|
|
||||||
|
|
||||||
|
|
||||||
def execute_and_return_time(cursor, query, args):
|
|
||||||
# Measure query execution time in milliseconds
|
|
||||||
start_time = get_time()
|
|
||||||
|
|
||||||
cursor.execute(query, args)
|
|
||||||
|
|
||||||
# Calculate the execution time rounding it to 4 decimal places
|
|
||||||
exec_time_ms = round((get_time() - start_time) * 1000, 4)
|
|
||||||
return cursor, exec_time_ms
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
argument_spec = mysql_common_argument_spec()
|
argument_spec = mysql_common_argument_spec()
|
||||||
argument_spec.update(
|
argument_spec.update(
|
||||||
query=dict(type='raw', required=True),
|
query=dict(type='raw', required=True),
|
||||||
login_db=dict(type='str'),
|
login_db=dict(type='str'),
|
||||||
positional_args=dict(type='list', elements='raw'),
|
positional_args=dict(type='list'),
|
||||||
named_args=dict(type='dict'),
|
named_args=dict(type='dict'),
|
||||||
single_transaction=dict(type='bool', default=False),
|
single_transaction=dict(type='bool', default=False),
|
||||||
)
|
)
|
||||||
|
@ -242,7 +207,6 @@ def main():
|
||||||
query_result = []
|
query_result = []
|
||||||
executed_queries = []
|
executed_queries = []
|
||||||
rowcount = []
|
rowcount = []
|
||||||
execution_time_ms = []
|
|
||||||
|
|
||||||
already_exists = False
|
already_exists = False
|
||||||
for q in query:
|
for q in query:
|
||||||
|
@ -253,14 +217,12 @@ def main():
|
||||||
category=mysql_driver.Warning)
|
category=mysql_driver.Warning)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cursor, exec_time_ms = execute_and_return_time(cursor, q, arguments)
|
cursor.execute(q, arguments)
|
||||||
execution_time_ms.append(exec_time_ms)
|
|
||||||
except mysql_driver.Warning:
|
except mysql_driver.Warning:
|
||||||
# When something is run with IF NOT EXISTS
|
# When something is run with IF NOT EXISTS
|
||||||
# and there's "already exists" MySQL warning,
|
# and there's "already exists" MySQL warning,
|
||||||
# set the flag as True.
|
# set the flag as True.
|
||||||
# PyMySQL < 0.10.0 throws the warning, mysqlclient
|
# PyMySQL throws the warning, mysqlclinet does NOT.
|
||||||
# and PyMySQL 0.10.0+ does NOT.
|
|
||||||
already_exists = True
|
already_exists = True
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -311,7 +273,6 @@ def main():
|
||||||
'executed_queries': executed_queries,
|
'executed_queries': executed_queries,
|
||||||
'query_result': query_result,
|
'query_result': query_result,
|
||||||
'rowcount': rowcount,
|
'rowcount': rowcount,
|
||||||
'execution_time_ms': execution_time_ms,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Exit:
|
# Exit:
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright: (c) 2013, Balazs Pocze <banyek@gawker.com>
|
# Copyright: (c) 2013, Balazs Pocze <banyek@gawker.com>
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# Certain parts are taken from Mark Theunissen's mysqldb module
|
# Certain parts are taken from Mark Theunissen's mysqldb module
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
|
@ -13,74 +13,68 @@ __metaclass__ = type
|
||||||
DOCUMENTATION = r'''
|
DOCUMENTATION = r'''
|
||||||
---
|
---
|
||||||
module: mysql_replication
|
module: mysql_replication
|
||||||
short_description: Manage MySQL or MariaDB replication
|
short_description: Manage MySQL replication
|
||||||
description:
|
description:
|
||||||
- Manages MySQL or MariaDB server replication, replica, primary status, get and change primary host.
|
- Manages MySQL server replication, replica, master status, get and change master host.
|
||||||
author:
|
author:
|
||||||
- Balazs Pocze (@banyek)
|
- Balazs Pocze (@banyek)
|
||||||
- Andrew Klychkov (@Andersson007)
|
- Andrew Klychkov (@Andersson007)
|
||||||
- Dennis Urtubia (@dennisurtubia)
|
|
||||||
- Laurent Indermühle (@laurent-indermuehle)
|
|
||||||
options:
|
options:
|
||||||
mode:
|
mode:
|
||||||
description:
|
description:
|
||||||
- Module operating mode. Could be
|
- Module operating mode. Could be
|
||||||
C(changeprimary) (CHANGE MASTER TO) - also works for MySQL 8.0.23 and later since community.mysql 3.10.0,
|
C(changemaster) (CHANGE MASTER TO),
|
||||||
C(changereplication) (CHANGE REPLICATION SOURCE TO) - only supported in MySQL 8.0.23 and later,
|
C(getmaster) (SHOW MASTER STATUS),
|
||||||
C(getprimary) (SHOW MASTER STATUS),
|
C(getreplica | getslave) (SHOW REPLICA | SLAVE STATUS),
|
||||||
C(getreplica) (SHOW REPLICA STATUS),
|
C(startreplica | startslave) (START REPLICA | SLAVE),
|
||||||
C(startreplica) (START REPLICA),
|
C(stopreplica | stopslave) (STOP REPLICA | SLAVE),
|
||||||
C(stopreplica) (STOP REPLICA),
|
C(resetmaster) (RESET MASTER) - supported since community.mysql 0.1.0,
|
||||||
C(resetprimary) (RESET MASTER) - supported since community.mysql 0.1.0,
|
C(resetreplica, resetslave) (RESET REPLICA | SLAVE),
|
||||||
C(resetreplica) (RESET REPLICA),
|
C(resetreplicaall, resetslave) (RESET REPLICA | SLAVE ALL).
|
||||||
C(resetreplicaall) (RESET REPLICA ALL).
|
|
||||||
type: str
|
type: str
|
||||||
choices:
|
choices:
|
||||||
- changeprimary
|
- changemaster
|
||||||
- changereplication
|
- getmaster
|
||||||
- getprimary
|
|
||||||
- getreplica
|
- getreplica
|
||||||
|
- getslave
|
||||||
- startreplica
|
- startreplica
|
||||||
|
- startslave
|
||||||
- stopreplica
|
- stopreplica
|
||||||
- resetprimary
|
- stopslave
|
||||||
|
- resetmaster
|
||||||
- resetreplica
|
- resetreplica
|
||||||
|
- resetslave
|
||||||
- resetreplicaall
|
- resetreplicaall
|
||||||
|
- resetslaveall
|
||||||
default: getreplica
|
default: getreplica
|
||||||
primary_host:
|
master_host:
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_HOST) mysql variable.
|
- Same as mysql variable.
|
||||||
type: str
|
type: str
|
||||||
aliases: [master_host]
|
master_user:
|
||||||
primary_user:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_USER) mysql variable.
|
- Same as mysql variable.
|
||||||
type: str
|
type: str
|
||||||
aliases: [master_user]
|
master_password:
|
||||||
primary_password:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_PASSWORD) mysql variable.
|
- Same as mysql variable.
|
||||||
type: str
|
type: str
|
||||||
aliases: [master_password]
|
master_port:
|
||||||
primary_port:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_PORT) mysql variable.
|
- Same as mysql variable.
|
||||||
type: int
|
type: int
|
||||||
aliases: [master_port]
|
master_connect_retry:
|
||||||
primary_connect_retry:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_CONNECT_RETRY) mysql variable.
|
- Same as mysql variable.
|
||||||
type: int
|
type: int
|
||||||
aliases: [master_connect_retry]
|
master_log_file:
|
||||||
primary_log_file:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_LOG_FILE) mysql variable.
|
- Same as mysql variable.
|
||||||
type: str
|
type: str
|
||||||
aliases: [master_log_file]
|
master_log_pos:
|
||||||
primary_log_pos:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_LOG_POS) mysql variable.
|
- Same as mysql variable.
|
||||||
type: int
|
type: int
|
||||||
aliases: [master_log_pos]
|
|
||||||
relay_log_file:
|
relay_log_file:
|
||||||
description:
|
description:
|
||||||
- Same as mysql variable.
|
- Same as mysql variable.
|
||||||
|
@ -89,89 +83,73 @@ options:
|
||||||
description:
|
description:
|
||||||
- Same as mysql variable.
|
- Same as mysql variable.
|
||||||
type: int
|
type: int
|
||||||
primary_ssl:
|
master_ssl:
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_SSL) mysql variable.
|
- Same as the C(MASTER_SSL) mysql variable.
|
||||||
- When setting it to C(yes), the connection attempt only succeeds
|
- When setting it to C(yes), the connection attempt only succeeds
|
||||||
if an encrypted connection can be established.
|
if an encrypted connection can be established.
|
||||||
- For details, refer to
|
- For details, refer to
|
||||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||||
- The default is C(false).
|
|
||||||
type: bool
|
type: bool
|
||||||
aliases: [master_ssl]
|
default: false
|
||||||
primary_ssl_ca:
|
master_ssl_ca:
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_SSL_CA) mysql variable.
|
- Same as the C(MASTER_SSL_CA) mysql variable.
|
||||||
- For details, refer to
|
- For details, refer to
|
||||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||||
type: str
|
type: str
|
||||||
aliases: [master_ssl_ca]
|
master_ssl_capath:
|
||||||
primary_ssl_capath:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_SSL_CAPATH) mysql variable.
|
- Same as the C(MASTER_SSL_CAPATH) mysql variable.
|
||||||
- For details, refer to
|
- For details, refer to
|
||||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||||
type: str
|
type: str
|
||||||
aliases: [master_ssl_capath]
|
master_ssl_cert:
|
||||||
primary_ssl_cert:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_SSL_CERT) mysql variable.
|
- Same as the C(MASTER_SSL_CERT) mysql variable.
|
||||||
- For details, refer to
|
- For details, refer to
|
||||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||||
type: str
|
type: str
|
||||||
aliases: [master_ssl_cert]
|
master_ssl_key:
|
||||||
primary_ssl_key:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_SSL_KEY) mysql variable.
|
- Same as the C(MASTER_SSL_KEY) mysql variable.
|
||||||
- For details, refer to
|
- For details, refer to
|
||||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||||
type: str
|
type: str
|
||||||
aliases: [master_ssl_key]
|
master_ssl_cipher:
|
||||||
primary_ssl_cipher:
|
|
||||||
description:
|
description:
|
||||||
- Same as the C(MASTER_SSL_CIPHER) 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.
|
- Specifies a colon-separated list of one or more ciphers permitted by the replica for the replication connection.
|
||||||
- For details, refer to
|
- For details, refer to
|
||||||
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
L(MySQL encrypted replication documentation,https://dev.mysql.com/doc/refman/8.0/en/replication-solutions-encrypted-connections.html).
|
||||||
type: str
|
type: str
|
||||||
aliases: [master_ssl_cipher]
|
master_auto_position:
|
||||||
primary_ssl_verify_server_cert:
|
|
||||||
description:
|
|
||||||
- Same as C(MASTER_SSL_VERIFY_SERVER_CERT) MySQL/MariaDB variable.
|
|
||||||
- The module switch automatically to C(SOURCE_SSL_VERIFY_SERVER_CERT) for MySQL 8.0.23 and later.
|
|
||||||
- Prior to community.mysql 3.14.0 C(false) had no effect.
|
|
||||||
type: bool
|
|
||||||
version_added: '3.5.0'
|
|
||||||
primary_auto_position:
|
|
||||||
description:
|
description:
|
||||||
- Whether the host uses GTID based replication or not.
|
- Whether the host uses GTID based replication or not.
|
||||||
- Same as the C(MASTER_AUTO_POSITION) mysql variable.
|
|
||||||
type: bool
|
type: bool
|
||||||
default: false
|
default: false
|
||||||
aliases: [master_auto_position]
|
master_use_gtid:
|
||||||
primary_use_gtid:
|
|
||||||
description:
|
description:
|
||||||
- Configures the replica 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.
|
- C(disabled) equals MASTER_USE_GTID=no command.
|
||||||
- To find information about available values see
|
- To find information about available values see
|
||||||
U(https://mariadb.com/kb/en/library/change-master-to/#master_use_gtid).
|
U(https://mariadb.com/kb/en/library/change-master-to/#master_use_gtid).
|
||||||
- Available since MariaDB 10.0.2.
|
- Available since MariaDB 10.0.2.
|
||||||
choices: [current_pos, replica_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
|
type: str
|
||||||
version_added: '0.1.0'
|
version_added: '0.1.0'
|
||||||
aliases: [master_use_gtid]
|
master_delay:
|
||||||
primary_delay:
|
|
||||||
description:
|
description:
|
||||||
- Time lag behind the primary's state (in seconds).
|
- Time lag behind the master's state (in seconds).
|
||||||
- Same as the C(MASTER_DELAY) mysql variable.
|
|
||||||
- Available from MySQL 5.6.
|
- Available from MySQL 5.6.
|
||||||
- For more information see U(https://dev.mysql.com/doc/refman/8.0/en/replication-delayed.html).
|
- For more information see U(https://dev.mysql.com/doc/refman/8.0/en/replication-delayed.html).
|
||||||
type: int
|
type: int
|
||||||
version_added: '0.1.0'
|
version_added: '0.1.0'
|
||||||
aliases: [master_delay]
|
|
||||||
connection_name:
|
connection_name:
|
||||||
description:
|
description:
|
||||||
- Name of the primary connection.
|
- Name of the master connection.
|
||||||
- Supported from MariaDB 10.0.1.
|
- Supported from MariaDB 10.0.1.
|
||||||
- Mutually exclusive with I(channel).
|
- Mutually exclusive with I(channel).
|
||||||
- For more information see U(https://mariadb.com/kb/en/library/multi-source-replication/).
|
- For more information see U(https://mariadb.com/kb/en/library/multi-source-replication/).
|
||||||
|
@ -193,16 +171,12 @@ options:
|
||||||
version_added: '0.1.0'
|
version_added: '0.1.0'
|
||||||
|
|
||||||
notes:
|
notes:
|
||||||
- Compatible with MariaDB or MySQL.
|
- If an empty value for the parameter of string type is needed, use an empty string.
|
||||||
- If an empty value for the parameter of string type is needed, use an empty string.
|
|
||||||
|
|
||||||
attributes:
|
|
||||||
check_mode:
|
|
||||||
support: none
|
|
||||||
|
|
||||||
extends_documentation_fragment:
|
extends_documentation_fragment:
|
||||||
- community.mysql.mysql
|
- community.mysql.mysql
|
||||||
|
|
||||||
|
|
||||||
seealso:
|
seealso:
|
||||||
- module: community.mysql.mysql_info
|
- module: community.mysql.mysql_info
|
||||||
- name: MySQL replication reference
|
- name: MySQL replication reference
|
||||||
|
@ -224,23 +198,16 @@ EXAMPLES = r'''
|
||||||
mode: stopreplica
|
mode: stopreplica
|
||||||
login_unix_socket: /run/mysqld/mysqld.sock
|
login_unix_socket: /run/mysqld/mysqld.sock
|
||||||
|
|
||||||
- name: Get primary binlog file name and binlog position
|
- name: Get master binlog file name and binlog position
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
mode: getprimary
|
mode: getmaster
|
||||||
|
|
||||||
- name: Change primary to primary server 192.0.2.1 and use binary log 'mysql-bin.000009' with position 4578
|
- name: Change master to master server 192.0.2.1 and use binary log 'mysql-bin.000009' with position 4578
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
mode: changeprimary
|
mode: changemaster
|
||||||
primary_host: 192.0.2.1
|
master_host: 192.0.2.1
|
||||||
primary_log_file: mysql-bin.000009
|
master_log_file: mysql-bin.000009
|
||||||
primary_log_pos: 4578
|
master_log_pos: 4578
|
||||||
|
|
||||||
- name: Change replication source to replica server 192.0.2.1 and use binary log 'mysql-bin.000009' with position 4578
|
|
||||||
community.mysql.mysql_replication:
|
|
||||||
mode: changereplication
|
|
||||||
primary_host: 192.0.2.1
|
|
||||||
primary_log_file: mysql-bin.000009
|
|
||||||
primary_log_pos: 4578
|
|
||||||
|
|
||||||
- name: Check replica status using port 3308
|
- name: Check replica status using port 3308
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
|
@ -248,43 +215,44 @@ EXAMPLES = r'''
|
||||||
login_host: ansible.example.com
|
login_host: ansible.example.com
|
||||||
login_port: 3308
|
login_port: 3308
|
||||||
|
|
||||||
- name: On MariaDB change primary to use GTID current_pos
|
- name: On MariaDB change master to use GTID current_pos
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
mode: changeprimary
|
mode: changemaster
|
||||||
primary_use_gtid: current_pos
|
master_use_gtid: current_pos
|
||||||
|
|
||||||
- name: Change primary to use replication delay 3600 seconds
|
- name: Change master to use replication delay 3600 seconds
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
mode: changeprimary
|
mode: changemaster
|
||||||
primary_host: 192.0.2.1
|
master_host: 192.0.2.1
|
||||||
primary_delay: 3600
|
master_delay: 3600
|
||||||
|
|
||||||
- name: Start MariaDB replica with connection name primary-1
|
- name: Start MariaDB replica with connection name master-1
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
mode: startreplica
|
mode: startreplica
|
||||||
connection_name: primary-1
|
connection_name: master-1
|
||||||
|
|
||||||
- name: Stop replication in channel primary-1
|
- name: Stop replication in channel master-1
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
mode: stopreplica
|
mode: stopreplica
|
||||||
channel: primary-1
|
channel: master-1
|
||||||
|
|
||||||
- name: >
|
- name: >
|
||||||
Run RESET MASTER command which will delete all existing binary log files
|
Run RESET MASTER command which will delete all existing binary log files
|
||||||
and reset the binary log index file on the primary
|
and reset the binary log index file on the master
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
mode: resetprimary
|
mode: resetmaster
|
||||||
|
|
||||||
- name: Run start replica and fail the task on errors
|
- name: Run start replica and fail the task on errors
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
mode: startreplica
|
mode: startreplica
|
||||||
connection_name: primary-1
|
connection_name: master-1
|
||||||
fail_on_error: true
|
fail_on_error: true
|
||||||
|
|
||||||
- name: Change primary and fail on error (like when replica thread is running)
|
- name: Change master and fail on error (like when replica thread is running)
|
||||||
community.mysql.mysql_replication:
|
community.mysql.mysql_replication:
|
||||||
mode: changeprimary
|
mode: changemaster
|
||||||
fail_on_error: true
|
fail_on_error: true
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
RETURN = r'''
|
RETURN = r'''
|
||||||
|
@ -292,7 +260,7 @@ queries:
|
||||||
description: List of executed queries which modified DB's state.
|
description: List of executed queries which modified DB's state.
|
||||||
returned: always
|
returned: always
|
||||||
type: list
|
type: list
|
||||||
sample: ["CHANGE MASTER TO MASTER_HOST='primary2.example.com',MASTER_PORT=3306"]
|
sample: ["CHANGE MASTER TO MASTER_HOST='master2.example.com',MASTER_PORT=3306"]
|
||||||
version_added: '0.1.0'
|
version_added: '0.1.0'
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
@ -300,12 +268,7 @@ import os
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
from ansible.module_utils.basic import AnsibleModule
|
from ansible.module_utils.basic import AnsibleModule
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.command_resolver import (
|
|
||||||
CommandResolver
|
|
||||||
)
|
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.mysql import (
|
from ansible_collections.community.mysql.plugins.module_utils.mysql import (
|
||||||
get_server_version,
|
|
||||||
get_server_implementation,
|
|
||||||
mysql_connect,
|
mysql_connect,
|
||||||
mysql_driver,
|
mysql_driver,
|
||||||
mysql_driver_fail_msg,
|
mysql_driver_fail_msg,
|
||||||
|
@ -316,12 +279,10 @@ from ansible.module_utils._text import to_native
|
||||||
executed_queries = []
|
executed_queries = []
|
||||||
|
|
||||||
|
|
||||||
def get_primary_status(cursor, command_resolver):
|
def get_master_status(cursor):
|
||||||
query = command_resolver.resolve_command("SHOW MASTER STATUS")
|
cursor.execute("SHOW MASTER STATUS")
|
||||||
cursor.execute(query)
|
masterstatus = cursor.fetchone()
|
||||||
|
return masterstatus
|
||||||
primarystatus = cursor.fetchone()
|
|
||||||
return primarystatus
|
|
||||||
|
|
||||||
|
|
||||||
def get_replica_status(cursor, connection_name='', channel='', term='REPLICA'):
|
def get_replica_status(cursor, connection_name='', channel='', term='REPLICA'):
|
||||||
|
@ -355,7 +316,7 @@ def stop_replica(module, cursor, connection_name='', channel='', fail_on_error=F
|
||||||
stopped = False
|
stopped = False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if fail_on_error:
|
if fail_on_error:
|
||||||
module.fail_json(msg="STOP REPLICA failed: %s" % to_native(e))
|
module.fail_json(msg="STOP SLAVE failed: %s" % to_native(e))
|
||||||
stopped = False
|
stopped = False
|
||||||
return stopped
|
return stopped
|
||||||
|
|
||||||
|
@ -377,7 +338,7 @@ def reset_replica(module, cursor, connection_name='', channel='', fail_on_error=
|
||||||
reset = False
|
reset = False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if fail_on_error:
|
if fail_on_error:
|
||||||
module.fail_json(msg="RESET REPLICA failed: %s" % to_native(e))
|
module.fail_json(msg="RESET SLAVE failed: %s" % to_native(e))
|
||||||
reset = False
|
reset = False
|
||||||
return reset
|
return reset
|
||||||
|
|
||||||
|
@ -399,13 +360,13 @@ def reset_replica_all(module, cursor, connection_name='', channel='', fail_on_er
|
||||||
reset = False
|
reset = False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if fail_on_error:
|
if fail_on_error:
|
||||||
module.fail_json(msg="RESET REPLICA ALL failed: %s" % to_native(e))
|
module.fail_json(msg="RESET SLAVE ALL failed: %s" % to_native(e))
|
||||||
reset = False
|
reset = False
|
||||||
return reset
|
return reset
|
||||||
|
|
||||||
|
|
||||||
def reset_primary(module, cursor, command_resolver, fail_on_error=False):
|
def reset_master(module, cursor, fail_on_error=False):
|
||||||
query = command_resolver.resolve_command('RESET MASTER')
|
query = 'RESET MASTER'
|
||||||
try:
|
try:
|
||||||
executed_queries.append(query)
|
executed_queries.append(query)
|
||||||
cursor.execute(query)
|
cursor.execute(query)
|
||||||
|
@ -414,7 +375,7 @@ def reset_primary(module, cursor, command_resolver, fail_on_error=False):
|
||||||
reset = False
|
reset = False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if fail_on_error:
|
if fail_on_error:
|
||||||
module.fail_json(msg="%s failed: %s" % (command_resolver.resolve_command('RESET MASTER'), to_native(e)))
|
module.fail_json(msg="RESET MASTER failed: %s" % to_native(e))
|
||||||
reset = False
|
reset = False
|
||||||
return reset
|
return reset
|
||||||
|
|
||||||
|
@ -436,27 +397,16 @@ def start_replica(module, cursor, connection_name='', channel='', fail_on_error=
|
||||||
started = False
|
started = False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if fail_on_error:
|
if fail_on_error:
|
||||||
module.fail_json(msg="START REPLICA failed: %s" % to_native(e))
|
module.fail_json(msg="START SLAVE failed: %s" % to_native(e))
|
||||||
started = False
|
started = False
|
||||||
return started
|
return started
|
||||||
|
|
||||||
|
|
||||||
def changeprimary(cursor, command_resolver, chm, connection_name='', channel=''):
|
def changemaster(cursor, chm, connection_name='', channel=''):
|
||||||
query_head = command_resolver.resolve_command("CHANGE MASTER")
|
|
||||||
if connection_name:
|
if connection_name:
|
||||||
query = "%s '%s' TO %s" % (query_head, connection_name, ','.join(chm))
|
query = "CHANGE MASTER '%s' TO %s" % (connection_name, ','.join(chm))
|
||||||
else:
|
else:
|
||||||
query = '%s TO %s' % (query_head, ','.join(chm))
|
query = 'CHANGE MASTER TO %s' % ','.join(chm)
|
||||||
|
|
||||||
if channel:
|
|
||||||
query += " FOR CHANNEL '%s'" % channel
|
|
||||||
|
|
||||||
executed_queries.append(query)
|
|
||||||
cursor.execute(query)
|
|
||||||
|
|
||||||
|
|
||||||
def changereplication(cursor, chm, channel=''):
|
|
||||||
query = 'CHANGE REPLICATION SOURCE TO %s' % ','.join(chm)
|
|
||||||
|
|
||||||
if channel:
|
if channel:
|
||||||
query += " FOR CHANNEL '%s'" % channel
|
query += " FOR CHANNEL '%s'" % channel
|
||||||
|
@ -469,35 +419,29 @@ def main():
|
||||||
argument_spec = mysql_common_argument_spec()
|
argument_spec = mysql_common_argument_spec()
|
||||||
argument_spec.update(
|
argument_spec.update(
|
||||||
mode=dict(type='str', default='getreplica', choices=[
|
mode=dict(type='str', default='getreplica', choices=[
|
||||||
'getprimary',
|
'getmaster', 'getreplica', 'getslave', 'changemaster',
|
||||||
'getreplica',
|
'stopreplica', 'stopslave', 'startreplica', 'startslave',
|
||||||
'changeprimary',
|
'resetmaster', 'resetreplica', 'resetslave',
|
||||||
'stopreplica',
|
'resetreplicaall', 'resetslaveall']),
|
||||||
'startreplica',
|
master_auto_position=dict(type='bool', default=False),
|
||||||
'resetprimary',
|
master_host=dict(type='str'),
|
||||||
'resetreplica',
|
master_user=dict(type='str'),
|
||||||
'resetreplicaall',
|
master_password=dict(type='str', no_log=True),
|
||||||
'changereplication']),
|
master_port=dict(type='int'),
|
||||||
primary_auto_position=dict(type='bool', default=False, aliases=['master_auto_position']),
|
master_connect_retry=dict(type='int'),
|
||||||
primary_host=dict(type='str', aliases=['master_host']),
|
master_log_file=dict(type='str'),
|
||||||
primary_user=dict(type='str', aliases=['master_user']),
|
master_log_pos=dict(type='int'),
|
||||||
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_file=dict(type='str'),
|
||||||
relay_log_pos=dict(type='int'),
|
relay_log_pos=dict(type='int'),
|
||||||
primary_ssl=dict(type='bool', aliases=['master_ssl']),
|
master_ssl=dict(type='bool', default=False),
|
||||||
primary_ssl_ca=dict(type='str', aliases=['master_ssl_ca']),
|
master_ssl_ca=dict(type='str'),
|
||||||
primary_ssl_capath=dict(type='str', aliases=['master_ssl_capath']),
|
master_ssl_capath=dict(type='str'),
|
||||||
primary_ssl_cert=dict(type='str', aliases=['master_ssl_cert']),
|
master_ssl_cert=dict(type='str'),
|
||||||
primary_ssl_key=dict(type='str', no_log=False, aliases=['master_ssl_key']),
|
master_ssl_key=dict(type='str', no_log=False),
|
||||||
primary_ssl_cipher=dict(type='str', aliases=['master_ssl_cipher']),
|
master_ssl_cipher=dict(type='str'),
|
||||||
primary_ssl_verify_server_cert=dict(type='bool'),
|
master_use_gtid=dict(type='str', choices=[
|
||||||
primary_use_gtid=dict(type='str', choices=[
|
'current_pos', 'replica_pos', 'slave_pos', 'disabled']),
|
||||||
'current_pos', 'replica_pos', 'disabled'], aliases=['master_use_gtid']),
|
master_delay=dict(type='int'),
|
||||||
primary_delay=dict(type='int', aliases=['master_delay']),
|
|
||||||
connection_name=dict(type='str'),
|
connection_name=dict(type='str'),
|
||||||
channel=dict(type='str'),
|
channel=dict(type='str'),
|
||||||
fail_on_error=dict(type='bool', default=False),
|
fail_on_error=dict(type='bool', default=False),
|
||||||
|
@ -509,34 +453,33 @@ def main():
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
mode = module.params["mode"]
|
mode = module.params["mode"]
|
||||||
primary_host = module.params["primary_host"]
|
master_host = module.params["master_host"]
|
||||||
primary_user = module.params["primary_user"]
|
master_user = module.params["master_user"]
|
||||||
primary_password = module.params["primary_password"]
|
master_password = module.params["master_password"]
|
||||||
primary_port = module.params["primary_port"]
|
master_port = module.params["master_port"]
|
||||||
primary_connect_retry = module.params["primary_connect_retry"]
|
master_connect_retry = module.params["master_connect_retry"]
|
||||||
primary_log_file = module.params["primary_log_file"]
|
master_log_file = module.params["master_log_file"]
|
||||||
primary_log_pos = module.params["primary_log_pos"]
|
master_log_pos = module.params["master_log_pos"]
|
||||||
relay_log_file = module.params["relay_log_file"]
|
relay_log_file = module.params["relay_log_file"]
|
||||||
relay_log_pos = module.params["relay_log_pos"]
|
relay_log_pos = module.params["relay_log_pos"]
|
||||||
primary_ssl = module.params["primary_ssl"]
|
master_ssl = module.params["master_ssl"]
|
||||||
primary_ssl_ca = module.params["primary_ssl_ca"]
|
master_ssl_ca = module.params["master_ssl_ca"]
|
||||||
primary_ssl_capath = module.params["primary_ssl_capath"]
|
master_ssl_capath = module.params["master_ssl_capath"]
|
||||||
primary_ssl_cert = module.params["primary_ssl_cert"]
|
master_ssl_cert = module.params["master_ssl_cert"]
|
||||||
primary_ssl_key = module.params["primary_ssl_key"]
|
master_ssl_key = module.params["master_ssl_key"]
|
||||||
primary_ssl_cipher = module.params["primary_ssl_cipher"]
|
master_ssl_cipher = module.params["master_ssl_cipher"]
|
||||||
primary_ssl_verify_server_cert = module.params["primary_ssl_verify_server_cert"]
|
master_auto_position = module.params["master_auto_position"]
|
||||||
primary_auto_position = module.params["primary_auto_position"]
|
|
||||||
ssl_cert = module.params["client_cert"]
|
ssl_cert = module.params["client_cert"]
|
||||||
ssl_key = module.params["client_key"]
|
ssl_key = module.params["client_key"]
|
||||||
ssl_ca = module.params["ca_cert"]
|
ssl_ca = module.params["ca_cert"]
|
||||||
check_hostname = module.params["check_hostname"]
|
check_hostname = module.params["check_hostname"]
|
||||||
connect_timeout = module.params['connect_timeout']
|
connect_timeout = module.params['connect_timeout']
|
||||||
config_file = module.params['config_file']
|
config_file = module.params['config_file']
|
||||||
primary_delay = module.params['primary_delay']
|
master_delay = module.params['master_delay']
|
||||||
if module.params.get("primary_use_gtid") == 'disabled':
|
if module.params.get("master_use_gtid") == 'disabled':
|
||||||
primary_use_gtid = 'no'
|
master_use_gtid = 'no'
|
||||||
else:
|
else:
|
||||||
primary_use_gtid = module.params["primary_use_gtid"]
|
master_use_gtid = module.params["master_use_gtid"]
|
||||||
connection_name = module.params["connection_name"]
|
connection_name = module.params["connection_name"]
|
||||||
channel = module.params['channel']
|
channel = module.params['channel']
|
||||||
fail_on_error = module.params['fail_on_error']
|
fail_on_error = module.params['fail_on_error']
|
||||||
|
@ -561,11 +504,8 @@ def main():
|
||||||
else:
|
else:
|
||||||
module.fail_json(msg="unable to find %s. Exception message: %s" % (config_file, to_native(e)))
|
module.fail_json(msg="unable to find %s. Exception message: %s" % (config_file, to_native(e)))
|
||||||
|
|
||||||
server_version = get_server_version(cursor)
|
|
||||||
server_implementation = get_server_implementation(cursor)
|
|
||||||
command_resolver = CommandResolver(server_implementation, server_version)
|
|
||||||
cursor.execute("SELECT VERSION()")
|
cursor.execute("SELECT VERSION()")
|
||||||
if server_implementation == 'mariadb':
|
if 'mariadb' in cursor.fetchone()["VERSION()"].lower():
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.implementations.mariadb import replication as impl
|
from ansible_collections.community.mysql.plugins.module_utils.implementations.mariadb import replication as impl
|
||||||
else:
|
else:
|
||||||
from ansible_collections.community.mysql.plugins.module_utils.implementations.mysql import replication as impl
|
from ansible_collections.community.mysql.plugins.module_utils.implementations.mysql import replication as impl
|
||||||
|
@ -574,174 +514,128 @@ def main():
|
||||||
# "REPLICA" must be used instead of "SLAVE"
|
# "REPLICA" must be used instead of "SLAVE"
|
||||||
if impl.uses_replica_terminology(cursor):
|
if impl.uses_replica_terminology(cursor):
|
||||||
replica_term = 'REPLICA'
|
replica_term = 'REPLICA'
|
||||||
|
if master_use_gtid == 'slave_pos':
|
||||||
|
module.deprecate('master_use_gtid "slave_pos" value is deprecated, use "replica_pos" instead.',
|
||||||
|
version='3.0.0', collection_name='community.mysql')
|
||||||
|
master_use_gtid = 'replica_pos'
|
||||||
else:
|
else:
|
||||||
replica_term = 'SLAVE'
|
replica_term = 'SLAVE'
|
||||||
if primary_use_gtid == 'replica_pos':
|
if master_use_gtid == 'replica_pos':
|
||||||
primary_use_gtid = 'slave_pos'
|
master_use_gtid = 'slave_pos'
|
||||||
|
|
||||||
if mode == 'getprimary':
|
if mode in "getmaster":
|
||||||
status = get_primary_status(cursor, command_resolver)
|
status = get_master_status(cursor)
|
||||||
if status and "File" in status and "Position" in status:
|
if not isinstance(status, dict):
|
||||||
status['Is_Primary'] = True
|
status = dict(Is_Master=False, msg="Server is not configured as mysql master")
|
||||||
else:
|
else:
|
||||||
status = dict(
|
status['Is_Master'] = True
|
||||||
Is_Primary=False,
|
|
||||||
msg="Server is not configured as mysql primary. "
|
|
||||||
"Meaning: Binary logs are disabled")
|
|
||||||
|
|
||||||
module.exit_json(queries=executed_queries, **status)
|
module.exit_json(queries=executed_queries, **status)
|
||||||
|
|
||||||
elif mode == "getreplica":
|
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)
|
status = get_replica_status(cursor, connection_name, channel, replica_term)
|
||||||
# MySQL 8.0 uses Replica_...
|
if not isinstance(status, dict):
|
||||||
# MariaDB 10.6 uses Slave_...
|
status = dict(Is_Slave=False, msg="Server is not configured as mysql slave")
|
||||||
if status and (
|
|
||||||
"Slave_IO_Running" in status or
|
|
||||||
"Replica_IO_Running" in status):
|
|
||||||
status['Is_Replica'] = True
|
|
||||||
else:
|
else:
|
||||||
status = dict(Is_Replica=False, msg="Server is not configured as mysql replica")
|
status['Is_Slave'] = True
|
||||||
|
|
||||||
module.exit_json(queries=executed_queries, **status)
|
module.exit_json(queries=executed_queries, **status)
|
||||||
|
|
||||||
elif mode == 'changeprimary':
|
elif mode in "changemaster":
|
||||||
chm = []
|
chm = []
|
||||||
result = {}
|
result = {}
|
||||||
if primary_host is not None:
|
if master_host is not None:
|
||||||
chm.append("%s='%s'" % (command_resolver.resolve_command('MASTER_HOST'), primary_host))
|
chm.append("MASTER_HOST='%s'" % master_host)
|
||||||
if primary_user is not None:
|
if master_user is not None:
|
||||||
chm.append("%s='%s'" % (command_resolver.resolve_command('MASTER_USER'), primary_user))
|
chm.append("MASTER_USER='%s'" % master_user)
|
||||||
if primary_password is not None:
|
if master_password is not None:
|
||||||
chm.append("%s='%s'" % (command_resolver.resolve_command('MASTER_PASSWORD'), primary_password))
|
chm.append("MASTER_PASSWORD='%s'" % master_password)
|
||||||
if primary_port is not None:
|
if master_port is not None:
|
||||||
chm.append("%s=%s" % (command_resolver.resolve_command('MASTER_PORT'), primary_port))
|
chm.append("MASTER_PORT=%s" % master_port)
|
||||||
if primary_connect_retry is not None:
|
if master_connect_retry is not None:
|
||||||
chm.append("%s=%s" % (command_resolver.resolve_command('MASTER_CONNECT_RETRY'), primary_connect_retry))
|
chm.append("MASTER_CONNECT_RETRY=%s" % master_connect_retry)
|
||||||
if primary_log_file is not None:
|
if master_log_file is not None:
|
||||||
chm.append("%s='%s'" % (command_resolver.resolve_command('MASTER_LOG_FILE'), primary_log_file))
|
chm.append("MASTER_LOG_FILE='%s'" % master_log_file)
|
||||||
if primary_log_pos is not None:
|
if master_log_pos is not None:
|
||||||
chm.append("%s=%s" % (command_resolver.resolve_command('MASTER_LOG_POS'), primary_log_pos))
|
chm.append("MASTER_LOG_POS=%s" % master_log_pos)
|
||||||
if primary_delay is not None:
|
if master_delay is not None:
|
||||||
chm.append("%s=%s" % (command_resolver.resolve_command('MASTER_DELAY'), primary_delay))
|
chm.append("MASTER_DELAY=%s" % master_delay)
|
||||||
if relay_log_file is not None:
|
if relay_log_file is not None:
|
||||||
chm.append("RELAY_LOG_FILE='%s'" % relay_log_file)
|
chm.append("RELAY_LOG_FILE='%s'" % relay_log_file)
|
||||||
if relay_log_pos is not None:
|
if relay_log_pos is not None:
|
||||||
chm.append("RELAY_LOG_POS=%s" % relay_log_pos)
|
chm.append("RELAY_LOG_POS=%s" % relay_log_pos)
|
||||||
if primary_ssl is not None:
|
if master_ssl:
|
||||||
if primary_ssl:
|
chm.append("MASTER_SSL=1")
|
||||||
chm.append("%s=1" % command_resolver.resolve_command('MASTER_SSL'))
|
if master_ssl_ca is not None:
|
||||||
else:
|
chm.append("MASTER_SSL_CA='%s'" % master_ssl_ca)
|
||||||
chm.append("%s=0" % command_resolver.resolve_command('MASTER_SSL'))
|
if master_ssl_capath is not None:
|
||||||
if primary_ssl_ca is not None:
|
chm.append("MASTER_SSL_CAPATH='%s'" % master_ssl_capath)
|
||||||
chm.append("%s='%s'" % (command_resolver.resolve_command('MASTER_SSL_CA'), primary_ssl_ca))
|
if master_ssl_cert is not None:
|
||||||
if primary_ssl_capath is not None:
|
chm.append("MASTER_SSL_CERT='%s'" % master_ssl_cert)
|
||||||
chm.append("%s='%s'" % (command_resolver.resolve_command('MASTER_SSL_CAPATH'), primary_ssl_capath))
|
if master_ssl_key is not None:
|
||||||
if primary_ssl_cert is not None:
|
chm.append("MASTER_SSL_KEY='%s'" % master_ssl_key)
|
||||||
chm.append("%s='%s'" % (command_resolver.resolve_command('MASTER_SSL_CERT'), primary_ssl_cert))
|
if master_ssl_cipher is not None:
|
||||||
if primary_ssl_key is not None:
|
chm.append("MASTER_SSL_CIPHER='%s'" % master_ssl_cipher)
|
||||||
chm.append("%s='%s'" % (command_resolver.resolve_command('MASTER_SSL_KEY'), primary_ssl_key))
|
if master_auto_position:
|
||||||
if primary_ssl_cipher is not None:
|
chm.append("MASTER_AUTO_POSITION=1")
|
||||||
chm.append("%s='%s'" % (command_resolver.resolve_command('MASTER_SSL_CIPHER'), primary_ssl_cipher))
|
if master_use_gtid is not None:
|
||||||
if primary_ssl_verify_server_cert is not None:
|
chm.append("MASTER_USE_GTID=%s" % master_use_gtid)
|
||||||
if primary_ssl_verify_server_cert:
|
|
||||||
chm.append("%s=1" % command_resolver.resolve_command('MASTER_SSL_VERIFY_SERVER_CERT'))
|
|
||||||
else:
|
|
||||||
chm.append("%s=0" % command_resolver.resolve_command('MASTER_SSL_VERIFY_SERVER_CERT'))
|
|
||||||
if primary_auto_position:
|
|
||||||
chm.append("%s=1" % command_resolver.resolve_command('MASTER_AUTO_POSITION'))
|
|
||||||
if primary_use_gtid is not None:
|
|
||||||
chm.append("MASTER_USE_GTID=%s" % primary_use_gtid) # MariaDB only
|
|
||||||
try:
|
try:
|
||||||
changeprimary(cursor, command_resolver, chm, connection_name, channel)
|
changemaster(cursor, chm, connection_name, channel)
|
||||||
except mysql_driver.Warning as e:
|
except mysql_driver.Warning as e:
|
||||||
result['warning'] = to_native(e)
|
result['warning'] = to_native(e)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
module.fail_json(msg='%s. Query == %s TO %s' % (to_native(e), command_resolver.resolve_command('CHANGE MASTER'), chm))
|
module.fail_json(msg='%s. Query == CHANGE MASTER TO %s' % (to_native(e), chm))
|
||||||
result['changed'] = True
|
result['changed'] = True
|
||||||
module.exit_json(queries=executed_queries, **result)
|
module.exit_json(queries=executed_queries, **result)
|
||||||
elif mode == "startreplica":
|
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)
|
started = start_replica(module, cursor, connection_name, channel, fail_on_error, replica_term)
|
||||||
if started is True:
|
if started is True:
|
||||||
module.exit_json(msg="Replica started ", changed=True, queries=executed_queries)
|
module.exit_json(msg="Slave started ", changed=True, queries=executed_queries)
|
||||||
else:
|
else:
|
||||||
module.exit_json(msg="Replica already started (Or cannot be started)", changed=False, queries=executed_queries)
|
module.exit_json(msg="Slave already started (Or cannot be started)", changed=False, queries=executed_queries)
|
||||||
elif mode == "stopreplica":
|
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)
|
stopped = stop_replica(module, cursor, connection_name, channel, fail_on_error, replica_term)
|
||||||
if stopped is True:
|
if stopped is True:
|
||||||
module.exit_json(msg="Replica stopped", changed=True, queries=executed_queries)
|
module.exit_json(msg="Slave stopped", changed=True, queries=executed_queries)
|
||||||
else:
|
else:
|
||||||
module.exit_json(msg="Replica already stopped", changed=False, queries=executed_queries)
|
module.exit_json(msg="Slave already stopped", changed=False, queries=executed_queries)
|
||||||
elif mode == 'resetprimary':
|
elif mode in "resetmaster":
|
||||||
reset = reset_primary(module, cursor, command_resolver, fail_on_error)
|
reset = reset_master(module, cursor, fail_on_error)
|
||||||
if reset is True:
|
if reset is True:
|
||||||
module.exit_json(msg="Primary reset", changed=True, queries=executed_queries)
|
module.exit_json(msg="Master reset", changed=True, queries=executed_queries)
|
||||||
else:
|
else:
|
||||||
module.exit_json(msg="Primary already reset", changed=False, queries=executed_queries)
|
module.exit_json(msg="Master already reset", changed=False, queries=executed_queries)
|
||||||
elif mode == "resetreplica":
|
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)
|
reset = reset_replica(module, cursor, connection_name, channel, fail_on_error, replica_term)
|
||||||
if reset is True:
|
if reset is True:
|
||||||
module.exit_json(msg="Replica reset", changed=True, queries=executed_queries)
|
module.exit_json(msg="Slave reset", changed=True, queries=executed_queries)
|
||||||
else:
|
else:
|
||||||
module.exit_json(msg="Replica already reset", changed=False, queries=executed_queries)
|
module.exit_json(msg="Slave already reset", changed=False, queries=executed_queries)
|
||||||
elif mode == "resetreplicaall":
|
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)
|
reset = reset_replica_all(module, cursor, connection_name, channel, fail_on_error, replica_term)
|
||||||
if reset is True:
|
if reset is True:
|
||||||
module.exit_json(msg="Replica reset", changed=True, queries=executed_queries)
|
module.exit_json(msg="Slave reset", changed=True, queries=executed_queries)
|
||||||
else:
|
else:
|
||||||
module.exit_json(msg="Replica already reset", changed=False, queries=executed_queries)
|
module.exit_json(msg="Slave already reset", changed=False, queries=executed_queries)
|
||||||
elif mode == 'changereplication':
|
|
||||||
chm = []
|
|
||||||
result = {}
|
|
||||||
if primary_host is not None:
|
|
||||||
chm.append("SOURCE_HOST='%s'" % primary_host)
|
|
||||||
if primary_user is not None:
|
|
||||||
chm.append("SOURCE_USER='%s'" % primary_user)
|
|
||||||
if primary_password is not None:
|
|
||||||
chm.append("SOURCE_PASSWORD='%s'" % primary_password)
|
|
||||||
if primary_port is not None:
|
|
||||||
chm.append("SOURCE_PORT=%s" % primary_port)
|
|
||||||
if primary_connect_retry is not None:
|
|
||||||
chm.append("SOURCE_CONNECT_RETRY=%s" % primary_connect_retry)
|
|
||||||
if primary_log_file is not None:
|
|
||||||
chm.append("SOURCE_LOG_FILE='%s'" % primary_log_file)
|
|
||||||
if primary_log_pos is not None:
|
|
||||||
chm.append("SOURCE_LOG_POS=%s" % primary_log_pos)
|
|
||||||
if primary_delay is not None:
|
|
||||||
chm.append("SOURCE_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 primary_ssl is not None:
|
|
||||||
if primary_ssl:
|
|
||||||
chm.append("SOURCE_SSL=1")
|
|
||||||
else:
|
|
||||||
chm.append("SOURCE_SSL=0")
|
|
||||||
if primary_ssl_ca is not None:
|
|
||||||
chm.append("SOURCE_SSL_CA='%s'" % primary_ssl_ca)
|
|
||||||
if primary_ssl_capath is not None:
|
|
||||||
chm.append("SOURCE_SSL_CAPATH='%s'" % primary_ssl_capath)
|
|
||||||
if primary_ssl_cert is not None:
|
|
||||||
chm.append("SOURCE_SSL_CERT='%s'" % primary_ssl_cert)
|
|
||||||
if primary_ssl_key is not None:
|
|
||||||
chm.append("SOURCE_SSL_KEY='%s'" % primary_ssl_key)
|
|
||||||
if primary_ssl_cipher is not None:
|
|
||||||
chm.append("SOURCE_SSL_CIPHER='%s'" % primary_ssl_cipher)
|
|
||||||
if primary_ssl_verify_server_cert is not None:
|
|
||||||
if primary_ssl_verify_server_cert:
|
|
||||||
chm.append("%s=1" % command_resolver.resolve_command('MASTER_SSL_VERIFY_SERVER_CERT'))
|
|
||||||
else:
|
|
||||||
chm.append("%s=0" % command_resolver.resolve_command('MASTER_SSL_VERIFY_SERVER_CERT'))
|
|
||||||
if primary_auto_position:
|
|
||||||
chm.append("SOURCE_AUTO_POSITION=1")
|
|
||||||
try:
|
|
||||||
changereplication(cursor, chm, channel)
|
|
||||||
except mysql_driver.Warning as e:
|
|
||||||
result['warning'] = to_native(e)
|
|
||||||
except Exception as e:
|
|
||||||
module.fail_json(msg='%s. Query == CHANGE REPLICATION SOURCE TO %s' % (to_native(e), chm))
|
|
||||||
result['changed'] = True
|
|
||||||
module.exit_json(queries=executed_queries, **result)
|
|
||||||
|
|
||||||
warnings.simplefilter("ignore")
|
warnings.simplefilter("ignore")
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -12,9 +12,9 @@ DOCUMENTATION = r'''
|
||||||
---
|
---
|
||||||
module: mysql_variables
|
module: mysql_variables
|
||||||
|
|
||||||
short_description: Manage MySQL or MariaDB global variables
|
short_description: Manage MySQL global variables
|
||||||
description:
|
description:
|
||||||
- Query / Set MySQL or MariaDB variables.
|
- Query / Set MySQL variables.
|
||||||
author:
|
author:
|
||||||
- Balazs Pocze (@banyek)
|
- Balazs Pocze (@banyek)
|
||||||
options:
|
options:
|
||||||
|
@ -26,7 +26,6 @@ options:
|
||||||
value:
|
value:
|
||||||
description:
|
description:
|
||||||
- If set, then sets variable value to this.
|
- If set, then sets variable value to this.
|
||||||
- With boolean values, use C(0)|C(1) or quoted C("ON")|C("OFF").
|
|
||||||
type: str
|
type: str
|
||||||
mode:
|
mode:
|
||||||
description:
|
description:
|
||||||
|
@ -45,9 +44,8 @@ options:
|
||||||
default: global
|
default: global
|
||||||
version_added: '0.1.0'
|
version_added: '0.1.0'
|
||||||
|
|
||||||
attributes:
|
notes:
|
||||||
check_mode:
|
- Does not support C(check_mode).
|
||||||
support: none
|
|
||||||
|
|
||||||
seealso:
|
seealso:
|
||||||
- module: community.mysql.mysql_info
|
- module: community.mysql.mysql_info
|
||||||
|
@ -55,9 +53,6 @@ seealso:
|
||||||
description: Complete reference of the MySQL SET command documentation.
|
description: Complete reference of the MySQL SET command documentation.
|
||||||
link: https://dev.mysql.com/doc/refman/8.0/en/set-statement.html
|
link: https://dev.mysql.com/doc/refman/8.0/en/set-statement.html
|
||||||
|
|
||||||
notes:
|
|
||||||
- Compatible with MariaDB or MySQL.
|
|
||||||
|
|
||||||
extends_documentation_fragment:
|
extends_documentation_fragment:
|
||||||
- community.mysql.mysql
|
- community.mysql.mysql
|
||||||
'''
|
'''
|
||||||
|
@ -75,11 +70,6 @@ EXAMPLES = r'''
|
||||||
variable: read_only
|
variable: read_only
|
||||||
value: 1
|
value: 1
|
||||||
mode: persist
|
mode: persist
|
||||||
|
|
||||||
- name: Set a boolean using ON/OFF notation
|
|
||||||
mysql_variables:
|
|
||||||
variable: log_slow_replica_statements
|
|
||||||
value: "ON" # Make sure it's quoted
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
RETURN = r'''
|
RETURN = r'''
|
||||||
|
@ -182,22 +172,10 @@ def setvariable(cursor, mysqlvar, value, mode='global'):
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def convert_bool_setting_value_wanted(val):
|
|
||||||
"""Converts passed value from 0,1,on,off to ON/OFF
|
|
||||||
as it's represented in the server.
|
|
||||||
"""
|
|
||||||
if val in ('on', 1):
|
|
||||||
val = 'ON'
|
|
||||||
elif val in ('off', 0):
|
|
||||||
val = 'OFF'
|
|
||||||
|
|
||||||
return val
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
argument_spec = mysql_common_argument_spec()
|
argument_spec = mysql_common_argument_spec()
|
||||||
argument_spec.update(
|
argument_spec.update(
|
||||||
variable=dict(type='str', required=True),
|
variable=dict(type='str'),
|
||||||
value=dict(type='str'),
|
value=dict(type='str'),
|
||||||
mode=dict(type='str', choices=['global', 'persist', 'persist_only'], default='global'),
|
mode=dict(type='str', choices=['global', 'persist', 'persist_only'], default='global'),
|
||||||
)
|
)
|
||||||
|
@ -221,7 +199,7 @@ def main():
|
||||||
|
|
||||||
if mysqlvar is None:
|
if mysqlvar is None:
|
||||||
module.fail_json(msg="Cannot run without variable to operate with")
|
module.fail_json(msg="Cannot run without variable to operate with")
|
||||||
if match('^[0-9A-Za-z_.]+$', mysqlvar) is None:
|
if match('^[0-9a-z_.]+$', mysqlvar) is None:
|
||||||
module.fail_json(msg="invalid variable name \"%s\"" % mysqlvar)
|
module.fail_json(msg="invalid variable name \"%s\"" % mysqlvar)
|
||||||
if mysql_driver is None:
|
if mysql_driver is None:
|
||||||
module.fail_json(msg=mysql_driver_fail_msg)
|
module.fail_json(msg=mysql_driver_fail_msg)
|
||||||
|
@ -261,9 +239,6 @@ def main():
|
||||||
# Type values before using them
|
# Type values before using them
|
||||||
value_wanted = typedvalue(value)
|
value_wanted = typedvalue(value)
|
||||||
value_actual = typedvalue(mysqlvar_val)
|
value_actual = typedvalue(mysqlvar_val)
|
||||||
if value_actual in ('ON', 'OFF') and value_wanted not in ('ON', 'OFF'):
|
|
||||||
value_wanted = convert_bool_setting_value_wanted(value_wanted)
|
|
||||||
|
|
||||||
value_in_auto_cnf = None
|
value_in_auto_cnf = None
|
||||||
if var_in_mysqld_auto_cnf is not None:
|
if var_in_mysqld_auto_cnf is not None:
|
||||||
value_in_auto_cnf = typedvalue(var_in_mysqld_auto_cnf)
|
value_in_auto_cnf = typedvalue(var_in_mysqld_auto_cnf)
|
||||||
|
|
21
test-containers/mariadb-py310-mysqlclient211/Dockerfile
Normal file
21
test-containers/mariadb-py310-mysqlclient211/Dockerfile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2204-test-container:main
|
||||||
|
# ubuntu2204 comes with mariadb-client-10.6
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
# python3.10-dev # Reqs for mysqlclient
|
||||||
|
# default-libmysqlclient-dev # Reqs for mysqlclient
|
||||||
|
# build-essential # Reqs for mysqlclient
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.10 \
|
||||||
|
python3.10-dev \
|
||||||
|
mariadb-client \
|
||||||
|
iproute2 \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
build-essential
|
||||||
|
|
||||||
|
RUN python3.10 -m pip install --disable-pip-version-check --no-cache-dir mysqlclient==2.1.1
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
15
test-containers/mariadb-py310-pymysql102/Dockerfile
Normal file
15
test-containers/mariadb-py310-pymysql102/Dockerfile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2204-test-container:main
|
||||||
|
# ubuntu2204 comes with mariadb-client-10.6
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.10 \
|
||||||
|
mariadb-client \
|
||||||
|
iproute2
|
||||||
|
|
||||||
|
RUN python3.10 -m pip install --disable-pip-version-check --no-cache-dir pymysql==1.0.2
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
21
test-containers/mariadb-py38-mysqlclient201/Dockerfile
Normal file
21
test-containers/mariadb-py38-mysqlclient201/Dockerfile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2004-test-container:main
|
||||||
|
# ubuntu2004 comes with mariadb-client-10.3
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
# python3.8-dev # Reqs for mysqlclient
|
||||||
|
# default-libmysqlclient-dev # Reqs for mysqlclient
|
||||||
|
# build-essential # Reqs for mysqlclient
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.8 \
|
||||||
|
python3.8-dev \
|
||||||
|
mariadb-client \
|
||||||
|
iproute2 \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
build-essential
|
||||||
|
|
||||||
|
RUN python3.8 -m pip install --disable-pip-version-check --no-cache-dir mysqlclient==2.0.1
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
15
test-containers/mariadb-py38-pymysql093/Dockerfile
Normal file
15
test-containers/mariadb-py38-pymysql093/Dockerfile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2004-test-container:main
|
||||||
|
# ubuntu2004 comes with mariadb-client-10.3
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.8 \
|
||||||
|
mariadb-client \
|
||||||
|
iproute2
|
||||||
|
|
||||||
|
RUN python3.8 -m pip install --disable-pip-version-check --no-cache-dir pymysql==0.9.3
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
21
test-containers/mariadb-py39-mysqlclient203/Dockerfile
Normal file
21
test-containers/mariadb-py39-mysqlclient203/Dockerfile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2004-test-container:main
|
||||||
|
# ubuntu2004 comes with mariadb-client-10.3
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
# python3.9-dev # Reqs for mysqlclient
|
||||||
|
# default-libmysqlclient-dev # Reqs for mysqlclient
|
||||||
|
# build-essential # Reqs for mysqlclient
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.9 \
|
||||||
|
python3.9-dev \
|
||||||
|
mariadb-client \
|
||||||
|
iproute2 \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
build-essential
|
||||||
|
|
||||||
|
RUN python3.9 -m pip install --disable-pip-version-check --no-cache-dir mysqlclient==2.0.3
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
15
test-containers/mariadb-py39-pymysql093/Dockerfile
Normal file
15
test-containers/mariadb-py39-pymysql093/Dockerfile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2004-test-container:main
|
||||||
|
# ubuntu2004 comes with mariadb-client-10.3
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.9 \
|
||||||
|
mariadb-client \
|
||||||
|
iproute2
|
||||||
|
|
||||||
|
RUN python3.9 -m pip install --disable-pip-version-check --no-cache-dir pymysql==0.9.3
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
21
test-containers/my57-py38-mysqlclient201/Dockerfile
Normal file
21
test-containers/my57-py38-mysqlclient201/Dockerfile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
FROM quay.io/ansible/ubuntu1804-test-container:main
|
||||||
|
# ubuntu1804 comes with mysql-client-5.7
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
# python3.8-dev # Reqs for mysqlclient
|
||||||
|
# default-libmysqlclient-dev # Reqs for mysqlclient
|
||||||
|
# build-essential # Reqs for mysqlclient
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.8 \
|
||||||
|
python3.8-dev \
|
||||||
|
mysql-client \
|
||||||
|
iproute2 \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
build-essential
|
||||||
|
|
||||||
|
RUN python3.8 -m pip install --disable-pip-version-check --no-cache-dir mysqlclient==2.0.1
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
21
test-containers/my57-py38-pymysql0711/Dockerfile
Normal file
21
test-containers/my57-py38-pymysql0711/Dockerfile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
FROM quay.io/ansible/ubuntu1804-test-container:main
|
||||||
|
# ubuntu1804 comes with mysql-client-5.7
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
# python3.8-dev # Reqs for mysqlclient
|
||||||
|
# default-libmysqlclient-dev # Reqs for mysqlclient
|
||||||
|
# build-essential # Reqs for mysqlclient
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.8 \
|
||||||
|
python3.8-dev \
|
||||||
|
mysql-client \
|
||||||
|
iproute2 \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
build-essential
|
||||||
|
|
||||||
|
RUN python3.8 -m pip install --disable-pip-version-check --no-cache-dir pymysql==0.7.11
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
15
test-containers/my57-py38-pymysql093/Dockerfile
Normal file
15
test-containers/my57-py38-pymysql093/Dockerfile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
FROM quay.io/ansible/ubuntu1804-test-container:main
|
||||||
|
# ubuntu1804 comes with mysql-client-5.7
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.8 \
|
||||||
|
mysql-client \
|
||||||
|
iproute2
|
||||||
|
|
||||||
|
RUN python3.8 -m pip install --disable-pip-version-check --no-cache-dir pymysql==0.9.3
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
21
test-containers/mysql-py310-mysqlclient211/Dockerfile
Normal file
21
test-containers/mysql-py310-mysqlclient211/Dockerfile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2204-test-container:main
|
||||||
|
# ubuntu2204 comes with mysql-client-8
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
# python3.10-dev # Reqs for mysqlclient
|
||||||
|
# default-libmysqlclient-dev # Reqs for mysqlclient
|
||||||
|
# build-essential # Reqs for mysqlclient
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.10 \
|
||||||
|
python3.10-dev \
|
||||||
|
mysql-client \
|
||||||
|
iproute2 \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
build-essential
|
||||||
|
|
||||||
|
RUN python3.10 -m pip install --disable-pip-version-check --no-cache-dir mysqlclient==2.1.1
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
15
test-containers/mysql-py310-pymysql102/Dockerfile
Normal file
15
test-containers/mysql-py310-pymysql102/Dockerfile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2204-test-container:main
|
||||||
|
# ubuntu2204 comes with mysql-client-8
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.10 \
|
||||||
|
mysql-client \
|
||||||
|
iproute2
|
||||||
|
|
||||||
|
RUN python3.10 -m pip install --disable-pip-version-check --no-cache-dir pymysql==1.0.2
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
21
test-containers/mysql-py38-mysqlclient201/Dockerfile
Normal file
21
test-containers/mysql-py38-mysqlclient201/Dockerfile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2004-test-container:main
|
||||||
|
# ubuntu2004 comes with mysql-client-8
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
# python3.8-dev # Reqs for mysqlclient
|
||||||
|
# default-libmysqlclient-dev # Reqs for mysqlclient
|
||||||
|
# build-essential # Reqs for mysqlclient
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.8 \
|
||||||
|
python3.8-dev \
|
||||||
|
mysql-client \
|
||||||
|
iproute2 \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
build-essential
|
||||||
|
|
||||||
|
RUN python3.8 -m pip install --disable-pip-version-check --no-cache-dir mysqlclient==2.0.1
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
15
test-containers/mysql-py38-pymysql093/Dockerfile
Normal file
15
test-containers/mysql-py38-pymysql093/Dockerfile
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2004-test-container:main
|
||||||
|
# ubuntu2004 comes with mysql-client-8
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.8 \
|
||||||
|
mysql-client \
|
||||||
|
iproute2
|
||||||
|
|
||||||
|
RUN python3.8 -m pip install --disable-pip-version-check --no-cache-dir pymysql==0.9.3
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
21
test-containers/mysql-py39-mysqlclient203/Dockerfile
Normal file
21
test-containers/mysql-py39-mysqlclient203/Dockerfile
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2004-test-container:main
|
||||||
|
# ubuntu2004 comes with mysql-client-8
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
# python3.9-dev # Reqs for mysqlclient
|
||||||
|
# default-libmysqlclient-dev # Reqs for mysqlclient
|
||||||
|
# build-essential # Reqs for mysqlclient
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.9 \
|
||||||
|
python3.9-dev \
|
||||||
|
mysql-client \
|
||||||
|
iproute2 \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
build-essential
|
||||||
|
|
||||||
|
RUN python3.9 -m pip install --disable-pip-version-check --no-cache-dir mysqlclient==2.0.3
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
16
test-containers/mysql-py39-pymysql093/Dockerfile
Normal file
16
test-containers/mysql-py39-pymysql093/Dockerfile
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
FROM quay.io/ansible/ubuntu2004-test-container:main
|
||||||
|
# ubuntu2004 comes with mysql-client-8
|
||||||
|
|
||||||
|
# iproute2 # To grab docker network gateway address
|
||||||
|
RUN apt-get update -y && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get upgrade -y --no-install-recommends && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||||
|
python3.9 \
|
||||||
|
mysql-client \
|
||||||
|
iproute2
|
||||||
|
|
||||||
|
# cffi # To connect to MySQL 8 with Python3.9 and PyMySQL
|
||||||
|
RUN python3.9 -m pip install --disable-pip-version-check --no-cache-dir cffi pymysql==0.9.3
|
||||||
|
|
||||||
|
ENV container=docker
|
||||||
|
CMD ["/sbin/init"]
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# 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
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
# Tests for master_use_gtid parameter.
|
# Tests for master_use_gtid parameter.
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
# Needs for further tests:
|
# Needs for further tests:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
# Preparation:
|
# Preparation:
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
Version: SKS 1.1.6
|
|
||||||
Comment: Hostname: pgp.mit.edu
|
|
||||||
|
|
||||||
mQINBGU2rNoBEACSi5t0nL6/Hj3d0PwsbdnbY+SqLUIZ3uWZQm6tsNhvTnahvPPZBGdl99iW
|
|
||||||
YTt2KmXp0KeN2s9pmLKkGAbacQP1RqzMFnoHawSMf0qTUVjAvhnI4+qzMDjTNSBq9fa3nHmO
|
|
||||||
YxownnrRkpiQUM/yD7/JmVENgwWb6akZeGYrXch9jd4XV3t8OD6TGzTedTki0TDNr6YZYhC7
|
|
||||||
jUm9fK9Zs299pzOXSxRRNGd+3H9gbXizrBu4L/3lUrNf//rM7OvV9Ho7u9YYyAQ3L3+OABK9
|
|
||||||
FKHNhrpi8Q0cbhvWkD4oCKJ+YZ54XrOG0YTg/YUAs5/3//FATI1sWdtLjJ5pSb0onV3LIbar
|
|
||||||
RTN8lC4Le/5kd3lcot9J8b3EMXL5p9OGW7wBfmNVRSUI74Vmwt+v9gyp0Hd0keRCUn8lo/1V
|
|
||||||
0YD9i92KsE+/IqoYTjnya/5kX41jB8vr1ebkHFuJ404+G6ETd0owwxq64jLIcsp/GBZHGU0R
|
|
||||||
KKAo9DRLH7rpQ7PVlnw8TDNlOtWt5EJlBXFcPL+NgWbqkADAyA/XSNeWlqonvPlYfmasnAHA
|
|
||||||
pMd9NhPQhC7hJTjCiAwG8UyWpV8Dj07DHFQ5xBbkTnKH2OrJtguPqSNYtTASbsWz09S8ujoT
|
|
||||||
DXFT17NbFM2dMIiq0a4VQB3SzH13H2io9Cbg/TzJrJGmwgoXgwARAQABtDZNeVNRTCBSZWxl
|
|
||||||
YXNlIEVuZ2luZWVyaW5nIDxteXNxbC1idWlsZEBvc3Mub3JhY2xlLmNvbT6JAlQEEwEIAD4W
|
|
||||||
IQS8pDQXw7SF3RKOxtS3s7eIqNN4XAUCZTas2gIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgID
|
|
||||||
AQIeAQIXgAAKCRC3s7eIqNN4XLzoD/9PlpWtfHlI8eQTHwGsGIwFA+fgipyDElapHw3MO+K9
|
|
||||||
VOEYRZCZSuBXHJe9kjGEVCGUDrfImvgTuNuqYmVUV+wyhP+w46W/cWVkqZKAW0hNp0TTvu3e
|
|
||||||
Dwap7gdk80VF24Y2Wo0bbiGkpPiPmB59oybGKaJ756JlKXIL4hTtK3/hjIPFnb64Ewe4YLZy
|
|
||||||
oJu0fQOyA8gXuBoalHhUQTbRpXI0XI3tpZiQemNbfBfJqXo6LP3/LgChAuOfHIQ8alvnhCwx
|
|
||||||
hNUSYGIRqx+BEbJw1X99Az8XvGcZ36VOQAZztkW7mEfH9NDPz7MXwoEvduc61xwlMvEsUIaS
|
|
||||||
fn6SGLFzWPClA98UMSJgF6sKb+JNoNbzKaZ8V5w13msLb/pq7hab72HH99XJbyKNliYj3+KA
|
|
||||||
3q0YLf+Hgt4Y4EhIJ8x2+g690Np7zJF4KXNFbi1BGloLGm78akY1rQlzpndKSpZq5KWw8FY/
|
|
||||||
1PEXORezg/BPD3Etp0AVKff4YdrDlOkNB7zoHRfFHAvEuuqti8aMBrbRnRSG0xunMUOEhbYS
|
|
||||||
/wOOTl0g3bF9NpAkfU1Fun57N96Us2T9gKo9AiOY5DxMe+IrBg4zaydEOovgqNi2wbU0MOBQ
|
|
||||||
b23Puhj7ZCIXcpILvcx9ygjkONr75w+XQrFDNeux4Znzay3ibXtAPqEykPMZHsZ2sbkCDQRl
|
|
||||||
NqzaARAAsdvBo8WRqZ5WVVk6lReD8b6Zx83eJUkV254YX9zn5t8KDRjYOySwS75mJIaZLsv0
|
|
||||||
YQjJk+5rt10tejyCrJIFo9CMvCmjUKtVbgmhfS5+fUDRrYCEZBBSa0Dvn68EBLiHugr+SPXF
|
|
||||||
6o1hXEUqdMCpB6oVp6X45JVQroCKIH5vsCtw2jU8S2/IjjV0V+E/zitGCiZaoZ1f6NG7ozyF
|
|
||||||
ep1CSAReZu/sssk0pCLlfCebRd9Rz3QjSrQhWYuJa+eJmiF4oahnpUGktxMD632I9aG+IMfj
|
|
||||||
tNJNtX32MbO+Se+cCtVc3cxSa/pR+89a3cb9IBA5tFF2Qoekhqo/1mmLi93Xn6uDUhl5tVxT
|
|
||||||
nB217dBT27tw+p0hjd9hXZRQbrIZUTyh3+8EMfmAjNSIeR+th86xRd9XFRr9EOqrydnALOUr
|
|
||||||
9cT7TfXWGEkFvn6ljQX7f4RvjJOTbc4jJgVFyu8K+VU6u1NnFJgDiNGsWvnYxAf7gDDbUSXE
|
|
||||||
uC2anhWvxPvpLGmsspngge4yl+3nv+UqZ9sm6LCebR/7UZ67tYz3p6xzAOVgYsYcxoIUuEZX
|
|
||||||
jHQtsYfTZZhrjUWBJ09jrMvlKUHLnS437SLbgoXVYZmcqwAWpVNOLZf+fFm4IE5aGBG5Dho2
|
|
||||||
CZ6ujngW9Zkn98T1d4N0MEwwXa2V6T1ijzcqD7GApZUAEQEAAYkCPAQYAQgAJhYhBLykNBfD
|
|
||||||
tIXdEo7G1Lezt4io03hcBQJlNqzaAhsMBQkDwmcAAAoJELezt4io03hcXqMP/01aPT3A3Sg7
|
|
||||||
oTQoHdCxj04ELkzrezNWGM+YwbSKrR2LoXR8zf2tBFzc2/Tl98V0+68f/eCvkvqCuOtq4392
|
|
||||||
Ps23j9W3r5XG+GDOwDsx0gl0E+Qkw07pwdJctA6efsmnRkjF2YVO0N9MiJA1tc8NbNXpEEHJ
|
|
||||||
Z7F8Ri5cpQrGUz/AY0eae2b7QefyP4rpUELpMZPjc8Px39Fe1DzRbT+5E19TZbrpbwlSYs1i
|
|
||||||
CzS5YGFmpCRyZcLKXo3zS6N22+82cnRBSPPipiO6WaQawcVMlQO1SX0giB+3/DryfN9VuIYd
|
|
||||||
1EWCGQa3O0MVu6o5KVHwPgl9R1P6xPZhurkDpAd0b1s4fFxin+MdxwmG7RslZA9CXRPpzo7/
|
|
||||||
fCMW8sYOH15DP+YfUckoEreBt+zezBxbIX2CGGWEV9v3UBXadRtwxYQ6sN9bqW4jm1b41vNA
|
|
||||||
17b6CVH6sVgtU3eN+5Y9an1e5jLD6kFYx+OIeqIIId/TEqwS61csY9aav4j4KLOZFCGNU0FV
|
|
||||||
ji7NQewSpepTcJwfJDOzmtiDP4vol1ApJGLRwZZZ9PB6wsOgDOoP6sr0YrDI/NNX2RyXXbgl
|
|
||||||
nQ1yJZVSH3/3eo6knG2qTthUKHCRDNKdy9Qqc1x4WWWtSRjh+zX8AvJK2q1rVLH2/3ilxe9w
|
|
||||||
cAZUlaj3id3TxquAlud4lWDz
|
|
||||||
=h5nH
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
|
@ -4,18 +4,15 @@
|
||||||
# and should not be used as examples of how to write Ansible roles #
|
# and should not be used as examples of how to write Ansible roles #
|
||||||
####################################################################
|
####################################################################
|
||||||
|
|
||||||
- name: "{{ role_name }} | Main | Prepare the fake root folder"
|
- name: Prepare the fake root folder
|
||||||
ansible.builtin.import_tasks:
|
ansible.builtin.import_tasks:
|
||||||
file: fake_root.yml
|
file: fake_root.yml
|
||||||
|
|
||||||
- name: "{{ role_name }} | Main | Set variables"
|
# setvars.yml requires the iproute2 package installed by install.yml
|
||||||
|
- name: Set variables
|
||||||
ansible.builtin.import_tasks:
|
ansible.builtin.import_tasks:
|
||||||
file: setvars.yml
|
file: setvars.yml
|
||||||
|
|
||||||
- name: "{{ role_name }} | Main | Install requirements"
|
- name: Verify all components version under test
|
||||||
ansible.builtin.import_tasks:
|
|
||||||
file: requirements.yml
|
|
||||||
|
|
||||||
- name: "{{ role_name }} | Main | Verify all components version under test"
|
|
||||||
ansible.builtin.import_tasks:
|
ansible.builtin.import_tasks:
|
||||||
file: verify.yml
|
file: verify.yml
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
---
|
|
||||||
|
|
||||||
# We use the ubuntu2204 image provided by ansible-test.
|
|
||||||
|
|
||||||
# The GPG key is imported in the files folder from:
|
|
||||||
# https://dev.mysql.com/doc/refman/8.4/en/checking-gpg-signature.html
|
|
||||||
# Downloading the key on each iteration of the tests is too slow.
|
|
||||||
- name: Install MySQL PGP public key
|
|
||||||
ansible.builtin.copy:
|
|
||||||
src: files/mysql.gpg
|
|
||||||
dest: /usr/share/keyrings/mysql.gpg
|
|
||||||
owner: root
|
|
||||||
group: root
|
|
||||||
mode: '0644'
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.4', '>=')
|
|
||||||
|
|
||||||
- name: Add Apt signing key to keyring
|
|
||||||
ansible.builtin.apt_key:
|
|
||||||
id: A8D3785C
|
|
||||||
file: /usr/share/keyrings/mysql.gpg
|
|
||||||
state: present
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.4', '>=')
|
|
||||||
|
|
||||||
- name: Add MySQL 8.4 repository
|
|
||||||
ansible.builtin.apt_repository:
|
|
||||||
repo: deb http://repo.mysql.com/apt/ubuntu/ jammy mysql-8.4-lts mysql-tools
|
|
||||||
state: present
|
|
||||||
filename: mysql
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.4', '>=')
|
|
||||||
|
|
||||||
- name: "{{ role_name }} | Requirements | Install Linux packages"
|
|
||||||
ansible.builtin.package:
|
|
||||||
name:
|
|
||||||
- bzip2 # To test mysql_db dump compression
|
|
||||||
- "{{ db_engine }}-client"
|
|
||||||
|
|
||||||
# The command mysql-config must be present for mysqlclient python package.
|
|
||||||
# The package libmysqlclient-dev that provides this command have a
|
|
||||||
# different name between Ubuntu 20.04 and 22.04. Luckily, libmysql++ is
|
|
||||||
# available on both.
|
|
||||||
- "{{ 'libmysql++-dev' if db_engine == 'mysql' else 'libmariadb-dev' }}"
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: "{{ role_name }} | Requirements | Install Python packages"
|
|
||||||
ansible.builtin.pip:
|
|
||||||
name:
|
|
||||||
- "{{ connector_name }}=={{ connector_version }}"
|
|
||||||
state: present
|
|
|
@ -1,17 +1,13 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
- name: "{{ role_name }} | Setvars | Install tools gather network facts"
|
- name: "{{ role_name }} | Setvars | Extract Podman/Docker Network Gateway"
|
||||||
ansible.builtin.package:
|
ansible.builtin.shell:
|
||||||
name:
|
cmd: ip route|grep default|awk '{print $3}'
|
||||||
- iproute2
|
register: ip_route_output
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: "{{ role_name }} | Setvars | Gather facts"
|
|
||||||
ansible.builtin.setup:
|
|
||||||
|
|
||||||
- name: "{{ role_name }} | Setvars | Set Fact"
|
- name: "{{ role_name }} | Setvars | Set Fact"
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
gateway_addr: "{{ ansible_default_ipv4.gateway }}"
|
gateway_addr: "{{ ip_route_output.stdout }}"
|
||||||
connector_name_lookup: >-
|
connector_name_lookup: >-
|
||||||
{{ lookup(
|
{{ lookup(
|
||||||
'file',
|
'file',
|
||||||
|
@ -32,6 +28,11 @@
|
||||||
'file',
|
'file',
|
||||||
'/root/ansible_collections/community/mysql/tests/integration/db_engine_version'
|
'/root/ansible_collections/community/mysql/tests/integration/db_engine_version'
|
||||||
) }}
|
) }}
|
||||||
|
python_version_lookup: >-
|
||||||
|
{{ lookup(
|
||||||
|
'file',
|
||||||
|
'/root/ansible_collections/community/mysql/tests/integration/python'
|
||||||
|
) }}
|
||||||
ansible_version_lookup: >-
|
ansible_version_lookup: >-
|
||||||
{{ lookup(
|
{{ lookup(
|
||||||
'file',
|
'file',
|
||||||
|
@ -44,6 +45,7 @@
|
||||||
connector_version: "{{ connector_version_lookup.strip() }}"
|
connector_version: "{{ connector_version_lookup.strip() }}"
|
||||||
db_engine: "{{ db_engine_name_lookup.strip() }}"
|
db_engine: "{{ db_engine_name_lookup.strip() }}"
|
||||||
db_version: "{{ db_engine_version_lookup.strip() }}"
|
db_version: "{{ db_engine_version_lookup.strip() }}"
|
||||||
|
python_version: "{{ python_version_lookup.strip() }}"
|
||||||
test_ansible_version: >-
|
test_ansible_version: >-
|
||||||
{%- if ansible_version_lookup == 'devel' -%}
|
{%- if ansible_version_lookup == 'devel' -%}
|
||||||
{{ ansible_version_lookup }}
|
{{ ansible_version_lookup }}
|
||||||
|
@ -71,6 +73,7 @@
|
||||||
connector_version: {{ connector_version }}
|
connector_version: {{ connector_version }}
|
||||||
db_engine: {{ db_engine }}
|
db_engine: {{ db_engine }}
|
||||||
db_version: {{ db_version }}
|
db_version: {{ db_version }}
|
||||||
|
python_version: {{ python_version }}
|
||||||
test_ansible_version: {{ test_ansible_version }}
|
test_ansible_version: {{ test_ansible_version }}
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
msg: "{{ msg.split('\n') }}"
|
msg: "{{ msg.split('\n') }}"
|
||||||
|
|
|
@ -19,11 +19,8 @@
|
||||||
- name: Assert that test container runs the expected MySQL/MariaDB version
|
- name: Assert that test container runs the expected MySQL/MariaDB version
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- registred_db_version == db_version
|
- "'{{ primary_info.version.major }}.{{ primary_info.version.minor }}\
|
||||||
vars:
|
.{{ primary_info.version.release }}' == '{{ db_version }}'"
|
||||||
registred_db_version:
|
|
||||||
"{{ primary_info.version.major }}.{{ primary_info.version.minor }}\
|
|
||||||
.{{ primary_info.version.release }}"
|
|
||||||
|
|
||||||
- name: Assert that mysql_info module used the expected version of pymysql
|
- name: Assert that mysql_info module used the expected version of pymysql
|
||||||
assert:
|
assert:
|
||||||
|
@ -41,27 +38,22 @@
|
||||||
when:
|
when:
|
||||||
- connector_name == 'mysqlclient'
|
- connector_name == 'mysqlclient'
|
||||||
|
|
||||||
- name: Get the python version in use
|
|
||||||
ansible.builtin.shell:
|
|
||||||
cmd: echo $( $(command -v python || command -v python3) -V )
|
|
||||||
changed_when: false
|
|
||||||
failed_when: false
|
|
||||||
register: python_version_in_use
|
|
||||||
|
|
||||||
- name: Display the python version in use
|
- name: Display the python version in use
|
||||||
ansible.builtin.debug:
|
command:
|
||||||
msg: >
|
cmd: python{{ python_version }} -V
|
||||||
Python in use inside the test container:
|
changed_when: false
|
||||||
{{ python_version_in_use.stdout }}
|
register: python_in_use
|
||||||
when:
|
|
||||||
- python_version_in_use is defined
|
- name: Assert that expected Python is installed
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- python_in_use.stdout is search(python_version)
|
||||||
|
|
||||||
- name: Assert that we run the expected ansible version
|
- name: Assert that we run the expected ansible version
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- ansible_running_version == test_ansible_version
|
- >
|
||||||
vars:
|
"{{ ansible_version.major }}.{{ ansible_version.minor }}"
|
||||||
ansible_running_version:
|
is version(test_ansible_version, '==')
|
||||||
"{{ ansible_version.major }}.{{ ansible_version.minor }}"
|
|
||||||
when:
|
when:
|
||||||
- test_ansible_version != 'devel' # Devel will change overtime
|
- test_ansible_version != 'devel' # Devel will change overtime
|
||||||
|
|
|
@ -1,9 +1,5 @@
|
||||||
- name: delete temporary directory
|
- name: delete temporary directory
|
||||||
include_tasks: default-cleanup.yml
|
include_tasks: default-cleanup.yml
|
||||||
tags:
|
|
||||||
- setup_remote_tmp_dir
|
|
||||||
|
|
||||||
- name: delete temporary directory (windows)
|
- name: delete temporary directory (windows)
|
||||||
include_tasks: windows-cleanup.yml
|
include_tasks: windows-cleanup.yml
|
||||||
tags:
|
|
||||||
- setup_remote_tmp_dir
|
|
||||||
|
|
|
@ -7,13 +7,9 @@
|
||||||
setup:
|
setup:
|
||||||
gather_subset: distribution
|
gather_subset: distribution
|
||||||
when: ansible_facts == {}
|
when: ansible_facts == {}
|
||||||
tags:
|
|
||||||
- setup_remote_tmp_dir
|
|
||||||
|
|
||||||
- include_tasks: "{{ lookup('first_found', files)}}"
|
- include_tasks: "{{ lookup('first_found', files)}}"
|
||||||
vars:
|
vars:
|
||||||
files:
|
files:
|
||||||
- "{{ ansible_os_family | lower }}.yml"
|
- "{{ ansible_os_family | lower }}.yml"
|
||||||
- "default.yml"
|
- "default.yml"
|
||||||
tags:
|
|
||||||
- setup_remote_tmp_dir
|
|
||||||
|
|
|
@ -8,7 +8,8 @@ mysql_primary_port: 3307
|
||||||
# Database names
|
# Database names
|
||||||
db_names:
|
db_names:
|
||||||
- "data"
|
- "data"
|
||||||
- "db%"
|
# - "db%"
|
||||||
|
# Don't test % in stable-1. Support was added in v2
|
||||||
|
|
||||||
# Database formats
|
# Database formats
|
||||||
db_formats:
|
db_formats:
|
||||||
|
|
|
@ -93,9 +93,7 @@
|
||||||
- name: Config overrides | Add fake host to config file
|
- name: Config overrides | Add fake host to config file
|
||||||
shell: 'echo "host = {{ fake_host }}" >> {{ config_file }}'
|
shell: 'echo "host = {{ fake_host }}" >> {{ config_file }}'
|
||||||
|
|
||||||
- name: >-
|
- name: Config overrides | Remove database using fake login_host
|
||||||
Config overrides | Fail to Remove database using fake login_host
|
|
||||||
because its default has been overriden by wrong value from config file
|
|
||||||
mysql_db:
|
mysql_db:
|
||||||
login_user: '{{ mysql_user }}'
|
login_user: '{{ mysql_user }}'
|
||||||
login_password: '{{ mysql_password }}'
|
login_password: '{{ mysql_password }}'
|
||||||
|
@ -104,17 +102,15 @@
|
||||||
name: '{{ db_to_create }}'
|
name: '{{ db_to_create }}'
|
||||||
state: absent
|
state: absent
|
||||||
config_file: '{{ config_file }}'
|
config_file: '{{ config_file }}'
|
||||||
config_overrides_defaults: true
|
config_overrides_defaults: yes
|
||||||
register: result
|
register: result
|
||||||
failed_when:
|
ignore_errors: yes
|
||||||
- result is succeeded
|
|
||||||
- result.msg is not search(pattern1)
|
- name: Config overrides | Must fail because login_host default has beed overriden by wrong value from config file
|
||||||
- result.msg is not search(pattern2)
|
assert:
|
||||||
- result.msg is not search(pattern3)
|
that:
|
||||||
vars:
|
- result is failed
|
||||||
pattern1: Can't connect to MySQL server on '{{ fake_host }}'
|
- result.msg is search("Can't connect to MySQL server on '{{ fake_host }}'") or result.msg is search("Unknown MySQL server host '{{ fake_host }}'")
|
||||||
pattern2: Unknown MySQL server host '{{ fake_host }}'
|
|
||||||
pattern3: Unknown server host '{{ fake_host }}'
|
|
||||||
|
|
||||||
- name: Config overrides | Clean up test database
|
- name: Config overrides | Clean up test database
|
||||||
mysql_db:
|
mysql_db:
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
block:
|
block:
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
- name: get server certificate
|
- name: get server certificate
|
||||||
copy:
|
copy:
|
||||||
content: "{{ lookup('pipe', \"openssl s_client -starttls mysql -connect localhost:3307 -showcerts 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'\") }}"
|
content: "{{ lookup('pipe', \"openssl s_client -starttls mysql -connect localhost:3307 -showcerts 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'\") }}"
|
||||||
|
|
|
@ -1,149 +0,0 @@
|
||||||
---
|
|
||||||
|
|
||||||
# When mysqldump encountered an issue, mysql_db was still happy. But the
|
|
||||||
# dump produced was empty or worse, only contained `DROP TABLE IF EXISTS...`
|
|
||||||
|
|
||||||
- module_defaults:
|
|
||||||
community.mysql.mysql_db: &mysql_defaults
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
community.mysql.mysql_query: *mysql_defaults
|
|
||||||
|
|
||||||
block:
|
|
||||||
|
|
||||||
- name: Dumps errors | Setup test | Create 2 schemas
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
name:
|
|
||||||
- "db1"
|
|
||||||
- "db2"
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Dumps errors | Setup test | Create 2 tables
|
|
||||||
community.mysql.mysql_query:
|
|
||||||
query:
|
|
||||||
- "CREATE TABLE db1.t1 (id int)"
|
|
||||||
- "CREATE TABLE db1.t2 (id int)"
|
|
||||||
- "CREATE VIEW db2.v1 AS SELECT id from db1.t1"
|
|
||||||
|
|
||||||
- name: Dumps errors | Full dump without compression
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: all
|
|
||||||
target: /tmp/full-dump.sql
|
|
||||||
register: full_dump
|
|
||||||
|
|
||||||
- name: Dumps errors | Full dump with gunzip
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: all
|
|
||||||
target: /tmp/full-dump.sql.gz
|
|
||||||
register: full_dump_gz
|
|
||||||
|
|
||||||
- name: Dumps errors | Distinct dump without compression
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: db2
|
|
||||||
target: /tmp/dump-db2.sql
|
|
||||||
register: dump_db2
|
|
||||||
|
|
||||||
- name: Dumps errors | Distinct dump with gunzip
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: db2
|
|
||||||
target: /tmp/dump-db2.sql.gz
|
|
||||||
register: dump_db2_gz
|
|
||||||
|
|
||||||
- name: Dumps errors | Check distinct dumps are changed
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- dump_db2 is changed
|
|
||||||
- dump_db2_gz is changed
|
|
||||||
|
|
||||||
# Now db2.v1 targets an inexistant table so mysqldump will fail
|
|
||||||
- name: Dumps errors | Drop t1
|
|
||||||
community.mysql.mysql_query:
|
|
||||||
query:
|
|
||||||
- "DROP TABLE db1.t1"
|
|
||||||
|
|
||||||
- name: Dumps errors | Full dump after drop t1 without compression
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: all
|
|
||||||
target: /tmp/full-dump-without-t1.sql
|
|
||||||
pipefail: true # This should do nothing
|
|
||||||
|
|
||||||
register: full_dump_without_t1
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Dumps errors | Full dump after drop t1 with gzip without the fix
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: all
|
|
||||||
target: /tmp/full-dump-without-t1.sql.gz
|
|
||||||
register: full_dump_without_t1_gz_without_fix
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Dumps errors | Full dump after drop t1 with gzip with the fix
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: all
|
|
||||||
target: /tmp/full-dump-without-t1.sql.gz
|
|
||||||
pipefail: true
|
|
||||||
register: full_dump_without_t1_gz_with_fix
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Dumps errors | Check full dump
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- full_dump_without_t1 is failed
|
|
||||||
- full_dump_without_t1.msg is search(
|
|
||||||
'references invalid table')
|
|
||||||
- full_dump_without_t1_gz_without_fix is changed
|
|
||||||
- full_dump_without_t1_gz_with_fix is failed
|
|
||||||
- full_dump_without_t1_gz_with_fix.msg is search(
|
|
||||||
'references invalid table')
|
|
||||||
|
|
||||||
- name: Dumps errors | Distinct dump after drop t1 without compression
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: db2
|
|
||||||
target: /tmp/dump-db2-without_t1.sql
|
|
||||||
pipefail: true # This should do nothing
|
|
||||||
register: dump_db2_without_t1
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Dumps errors | Distinct dump after drop t1 with gzip without the fix
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: db2
|
|
||||||
target: /tmp/dump-db2-without_t1.sql.gz
|
|
||||||
register: dump_db2_without_t1_gz_without_fix
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Dumps errors | Distinct dump after drop t1 with gzip with the fix
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
state: dump
|
|
||||||
name: db2
|
|
||||||
target: /tmp/dump-db2-without_t1.sql.gz
|
|
||||||
pipefail: true
|
|
||||||
register: dump_db2_without_t1_gz_with_fix
|
|
||||||
ignore_errors: true
|
|
||||||
|
|
||||||
- name: Dumps errors | Check distinct dump
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- dump_db2_without_t1 is failed
|
|
||||||
- dump_db2_without_t1.msg is search(
|
|
||||||
'references invalid table')
|
|
||||||
- dump_db2_without_t1_gz_without_fix is changed
|
|
||||||
- dump_db2_without_t1_gz_with_fix is failed
|
|
||||||
- dump_db2_without_t1_gz_with_fix.msg is search(
|
|
||||||
'references invalid table')
|
|
||||||
- name: Dumps errors | Cleanup
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
name:
|
|
||||||
- "db1"
|
|
||||||
- "db2"
|
|
||||||
state: absent
|
|
|
@ -60,6 +60,3 @@
|
||||||
vars:
|
vars:
|
||||||
db_name: "{{ item }}"
|
db_name: "{{ item }}"
|
||||||
loop: "{{ db_names }}"
|
loop: "{{ db_names }}"
|
||||||
|
|
||||||
- name: Check errors from mysqldump are seen issue 256
|
|
||||||
ansible.builtin.include_tasks: issue_256_mysqldump_errors.yml
|
|
||||||
|
|
|
@ -33,9 +33,9 @@
|
||||||
- name: assert that databases does not exist
|
- name: assert that databases does not exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name not in mysql_result.stdout
|
- "'{{ db1_name }}' not in mysql_result.stdout"
|
||||||
- db2_name not in mysql_result.stdout
|
- "'{{ db2_name }}' not in mysql_result.stdout"
|
||||||
- db3_name not in mysql_result.stdout
|
- "'{{ db3_name }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Create multiple databases that does not exists (check mode)
|
# Create multiple databases that does not exists (check mode)
|
||||||
|
@ -65,9 +65,9 @@
|
||||||
- name: assert that databases does not exist (since created via check mode)
|
- name: assert that databases does not exist (since created via check mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name not in mysql_result.stdout
|
- "'{{ db1_name }}' not in mysql_result.stdout"
|
||||||
- db2_name not in mysql_result.stdout
|
- "'{{ db2_name }}' not in mysql_result.stdout"
|
||||||
- db3_name not in mysql_result.stdout
|
- "'{{ db3_name }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Create multiple databases
|
# Create multiple databases
|
||||||
|
@ -88,7 +88,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.db_list == [db1_name, db2_name, db3_name]
|
- result.db_list == ['{{ db1_name }}', '{{ db2_name }}', '{{ db3_name }}']
|
||||||
|
|
||||||
- name: run command to list databases like specified database name
|
- name: run command to list databases like specified database name
|
||||||
command: "{{ mysql_command }} \"-e show databases like 'database%'\""
|
command: "{{ mysql_command }} \"-e show databases like 'database%'\""
|
||||||
|
@ -97,9 +97,9 @@
|
||||||
- name: assert that databases exist after creation
|
- name: assert that databases exist after creation
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
|
|
||||||
# =========================================================================
|
# =========================================================================
|
||||||
# Recreate already existing databases (check mode)
|
# Recreate already existing databases (check mode)
|
||||||
|
@ -129,9 +129,9 @@
|
||||||
- name: assert that databases exist (since performed recreation of existing databases via check mode)
|
- name: assert that databases exist (since performed recreation of existing databases via check mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Recreate same databases
|
# Recreate same databases
|
||||||
|
@ -160,9 +160,9 @@
|
||||||
- name: assert that databases does priorly exist
|
- name: assert that databases does priorly exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Delete one of the databases (db2 here)
|
# Delete one of the databases (db2 here)
|
||||||
|
@ -189,9 +189,9 @@
|
||||||
- name: assert that only db2 database does not exist
|
- name: assert that only db2 database does not exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name not in mysql_result.stdout
|
- "'{{ db2_name }}' not in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
|
|
||||||
# =========================================================================
|
# =========================================================================
|
||||||
# Recreate multiple databases in which few databases does not exists (check mode)
|
# Recreate multiple databases in which few databases does not exists (check mode)
|
||||||
|
@ -221,9 +221,9 @@
|
||||||
- name: assert that recreated non existing databases does not exist (since created via check mode)
|
- name: assert that recreated non existing databases does not exist (since created via check mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name not in mysql_result.stdout
|
- "'{{ db2_name }}' not in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Create multiple databases
|
# Create multiple databases
|
||||||
|
@ -252,9 +252,9 @@
|
||||||
- name: assert that databases exist
|
- name: assert that databases exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
|
|
||||||
# ============================== DUMP TEST =================================
|
# ============================== DUMP TEST =================================
|
||||||
#
|
#
|
||||||
|
@ -293,9 +293,9 @@
|
||||||
- name: assert that databases exist (check mode)
|
- name: assert that databases exist (check mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
|
|
||||||
- name: state dump - file name should not exist (since dumped via check mode)
|
- name: state dump - file name should not exist (since dumped via check mode)
|
||||||
file:
|
file:
|
||||||
|
@ -332,10 +332,10 @@
|
||||||
- name: assert that databases exist (since check mode)
|
- name: assert that databases exist (since check mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
- db4_name not in mysql_result.stdout
|
- "'{{ db4_name }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
- name: state dump - file name should not exist (since prior dump operation performed via check mode)
|
- name: state dump - file name should not exist (since prior dump operation performed via check mode)
|
||||||
file:
|
file:
|
||||||
|
@ -371,11 +371,11 @@
|
||||||
- name: assert that databases exist (since delete via check mode)
|
- name: assert that databases exist (since delete via check mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
- db4_name not in mysql_result.stdout
|
- "'{{ db4_name }}' not in mysql_result.stdout"
|
||||||
- db5_name not in mysql_result.stdout
|
- "'{{ db5_name }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
- name: state dump - file name should not exist (since prior dump operation performed via check mode)
|
- name: state dump - file name should not exist (since prior dump operation performed via check mode)
|
||||||
file:
|
file:
|
||||||
|
@ -403,7 +403,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- dump_result is changed
|
- dump_result is changed
|
||||||
- dump_result.db_list == [db1_name, db2_name, db3_name]
|
- dump_result.db_list == ['{{ db1_name }}', '{{ db2_name }}', '{{ db3_name }}']
|
||||||
|
|
||||||
- name: Run command to list databases like specified database name
|
- name: Run command to list databases like specified database name
|
||||||
command: "{{ mysql_command }} \"-e show databases like 'database%'\""
|
command: "{{ mysql_command }} \"-e show databases like 'database%'\""
|
||||||
|
@ -412,9 +412,9 @@
|
||||||
- name: assert that databases exist
|
- name: assert that databases exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
|
|
||||||
- name: State dump - file name should exist (dump1_file)
|
- name: State dump - file name should exist (dump1_file)
|
||||||
file:
|
file:
|
||||||
|
@ -461,11 +461,11 @@
|
||||||
- name: assert that databases exist
|
- name: assert that databases exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name in mysql_result.stdout
|
- "'{{ db1_name }}' in mysql_result.stdout"
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
- db4_name not in mysql_result.stdout
|
- "'{{ db4_name }}' not in mysql_result.stdout"
|
||||||
- db5_name not in mysql_result.stdout
|
- "'{{ db5_name }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
- name: state dump - file name should exist (dump2_file)
|
- name: state dump - file name should exist (dump2_file)
|
||||||
file:
|
file:
|
||||||
|
@ -501,8 +501,8 @@
|
||||||
- name: assert that databases exist even after deleting (since deleted via check mode)
|
- name: assert that databases exist even after deleting (since deleted via check mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db2_name in mysql_result.stdout
|
- "'{{ db2_name }}' in mysql_result.stdout"
|
||||||
- db3_name in mysql_result.stdout
|
- "'{{ db3_name }}' in mysql_result.stdout"
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Delete multiple databases
|
# Delete multiple databases
|
||||||
|
@ -522,7 +522,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.db_list == [db2_name, db3_name]
|
- result.db_list == ['{{ db2_name }}', '{{ db3_name }}']
|
||||||
|
|
||||||
- name: run command to list databases like specified database name
|
- name: run command to list databases like specified database name
|
||||||
command: "{{ mysql_command }} \"-e show databases like 'database%'\""
|
command: "{{ mysql_command }} \"-e show databases like 'database%'\""
|
||||||
|
@ -531,8 +531,8 @@
|
||||||
- name: assert that databases does not exist
|
- name: assert that databases does not exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db2_name not in mysql_result.stdout
|
- "'{{ db2_name }}' not in mysql_result.stdout"
|
||||||
- db3_name not in mysql_result.stdout
|
- "'{{ db3_name }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Delete non existing databases (check mode)
|
# Delete non existing databases (check mode)
|
||||||
|
@ -561,8 +561,8 @@
|
||||||
- name: assert that databases does not exist since were deleted priorly (check mode)
|
- name: assert that databases does not exist since were deleted priorly (check mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db2_name not in mysql_result.stdout
|
- "'{{ db2_name }}' not in mysql_result.stdout"
|
||||||
- db4_name not in mysql_result.stdout
|
- "'{{ db4_name }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Delete already deleted databases
|
# Delete already deleted databases
|
||||||
|
@ -590,8 +590,8 @@
|
||||||
- name: assert that databases does not exists
|
- name: assert that databases does not exists
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db2_name not in mysql_result.stdout
|
- "'{{ db2_name }}' not in mysql_result.stdout"
|
||||||
- db4_name not in mysql_result.stdout
|
- "'{{ db4_name }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
# ==========================================================================
|
# ==========================================================================
|
||||||
# Delete all databases
|
# Delete all databases
|
||||||
|
@ -622,11 +622,11 @@
|
||||||
- name: assert that specific databases does not exist
|
- name: assert that specific databases does not exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db1_name not in mysql_result.stdout
|
- "'{{ db1_name }}' not in mysql_result.stdout"
|
||||||
- db2_name not in mysql_result.stdout
|
- "'{{ db2_name }}' not in mysql_result.stdout"
|
||||||
- db3_name not in mysql_result.stdout
|
- "'{{ db3_name }}' not in mysql_result.stdout"
|
||||||
- db4_name not in mysql_result.stdout
|
- "'{{ db4_name }}' not in mysql_result.stdout"
|
||||||
- db5_name not in mysql_result.stdout
|
- "'{{ db5_name }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
- name: state dump - dump 1 file name should be removed
|
- name: state dump - dump 1 file name should be removed
|
||||||
file:
|
file:
|
||||||
|
|
|
@ -111,24 +111,11 @@
|
||||||
check_implicit_admin: no
|
check_implicit_admin: no
|
||||||
register: result
|
register: result
|
||||||
|
|
||||||
- name: Dump and Import | Assert successful completion of dump operation for MariaDB and MySQL < 8.2
|
- name: Dump and Import | Assert successful completion of dump operation
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_commands[0] is search(".department --master-data=1 --skip-triggers")
|
- result.executed_commands[0] is search(".department --master-data=1 --skip-triggers")
|
||||||
when:
|
|
||||||
- >
|
|
||||||
db_engine == 'mariadb' or
|
|
||||||
(db_engine == 'mysql' and db_version is version('8.2', '<'))
|
|
||||||
|
|
||||||
- name: Dump and Import | Assert successful completion of dump operation for MySQL >= 8.2
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.executed_commands[0] is search(".department --source-data=1 --skip-triggers")
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.2', '>=')
|
|
||||||
|
|
||||||
- name: Dump and Import | State dump/import - file name should exist (db_file_name)
|
- name: Dump and Import | State dump/import - file name should exist (db_file_name)
|
||||||
file:
|
file:
|
||||||
|
@ -283,7 +270,7 @@
|
||||||
- name: Dump and Import | Assert that db_name2 database does not exist
|
- name: Dump and Import | Assert that db_name2 database does not exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db_name2 not in mysql_result.stdout
|
- "'{{ db_name2 }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
- name: Dump and Import | Test state=import to restore a database from dumped file2 (check mode)
|
- name: Dump and Import | Test state=import to restore a database from dumped file2 (check mode)
|
||||||
mysql_db:
|
mysql_db:
|
||||||
|
@ -309,7 +296,7 @@
|
||||||
- name: Dump and Import | Assert that db_name2 database does not exist (check mode)
|
- name: Dump and Import | Assert that db_name2 database does not exist (check mode)
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db_name2 not in mysql_result.stdout
|
- "'{{ db_name2 }}' not in mysql_result.stdout"
|
||||||
|
|
||||||
- name: Dump and Import | Test state=import to restore a database from multiple database dumped file2
|
- name: Dump and Import | Test state=import to restore a database from multiple database dumped file2
|
||||||
mysql_db:
|
mysql_db:
|
||||||
|
@ -326,7 +313,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- import_result2 is changed
|
- import_result2 is changed
|
||||||
- import_result2.db_list == [db_name2]
|
- import_result2.db_list == ['{{ db_name2 }}']
|
||||||
|
|
||||||
- name: Dump and Import | Run command to list databases
|
- name: Dump and Import | Run command to list databases
|
||||||
command: "{{ mysql_command }} \"-e show databases like 'data%'\""
|
command: "{{ mysql_command }} \"-e show databases like 'data%'\""
|
||||||
|
@ -335,7 +322,7 @@
|
||||||
- name: Dump and Import | Assert that db_name2 database does exist after import
|
- name: Dump and Import | Assert that db_name2 database does exist after import
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db_name2 in mysql_result.stdout
|
- "'{{ db_name2 }}' in mysql_result.stdout"
|
||||||
|
|
||||||
- name: Dump and Import | Test state=dump to backup the database of type {{ format_type }} (expect changed=true)
|
- name: Dump and Import | Test state=dump to backup the database of type {{ format_type }} (expect changed=true)
|
||||||
mysql_db:
|
mysql_db:
|
||||||
|
@ -352,7 +339,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.db == db_name
|
- "result.db =='{{ db_name }}'"
|
||||||
|
|
||||||
# - name: Dump and Import | Assert database was backed up successfully
|
# - name: Dump and Import | Assert database was backed up successfully
|
||||||
# command: "file {{ db_file_name }}"
|
# command: "file {{ db_file_name }}"
|
||||||
|
@ -432,51 +419,6 @@
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
|
|
||||||
########################
|
|
||||||
# Test import with chdir
|
|
||||||
|
|
||||||
- name: Dump and Import | Create dir
|
|
||||||
file:
|
|
||||||
path: ~/subdir
|
|
||||||
state: directory
|
|
||||||
|
|
||||||
- name: Dump and Import | Create test dump
|
|
||||||
shell: 'echo "SOURCE ./subdir_test.sql" > ~/original_test.sql'
|
|
||||||
|
|
||||||
- name: Dump and Import | Create test source
|
|
||||||
shell: 'echo "SELECT 1" > ~/subdir/subdir_test.sql'
|
|
||||||
|
|
||||||
- name: Dump and Import | Try to restore without chdir argument, must fail
|
|
||||||
mysql_db:
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
name: '{{ db_name }}'
|
|
||||||
state: import
|
|
||||||
target: '~/original_test.sql'
|
|
||||||
ignore_errors: yes
|
|
||||||
register: result
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- result is failed
|
|
||||||
- result.msg is search('Failed to open file')
|
|
||||||
|
|
||||||
- name: Dump and Import | Restore with chdir argument, must pass
|
|
||||||
mysql_db:
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
name: '{{ db_name }}'
|
|
||||||
state: import
|
|
||||||
target: '~/original_test.sql'
|
|
||||||
chdir: ~/subdir
|
|
||||||
register: result
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- result is succeeded
|
|
||||||
|
|
||||||
##########
|
##########
|
||||||
# Clean up
|
# Clean up
|
||||||
##########
|
##########
|
||||||
|
@ -487,22 +429,18 @@
|
||||||
login_password: '{{ mysql_password }}'
|
login_password: '{{ mysql_password }}'
|
||||||
login_host: '{{ mysql_host }}'
|
login_host: '{{ mysql_host }}'
|
||||||
login_port: '{{ mysql_primary_port }}'
|
login_port: '{{ mysql_primary_port }}'
|
||||||
name: '{{ cleanup_db }}'
|
name: '{{ item }}'
|
||||||
state: absent
|
state: absent
|
||||||
loop:
|
loop:
|
||||||
- '{{ db_name }}'
|
- '{{ db_name }}'
|
||||||
- '{{ db_name2 }}'
|
- '{{ db_name2 }}'
|
||||||
loop_control:
|
|
||||||
loop_var: cleanup_db
|
|
||||||
|
|
||||||
- name: Dump and Import | Clean up files
|
- name: Dump and Import | Clean up files
|
||||||
file:
|
file:
|
||||||
name: '{{ cleanup_file }}'
|
name: '{{ item }}'
|
||||||
state: absent
|
state: absent
|
||||||
loop:
|
loop:
|
||||||
- '{{ db_file_name }}'
|
- '{{ db_file_name }}'
|
||||||
- '{{ wrong_sql_file }}'
|
- '{{ wrong_sql_file }}'
|
||||||
- '{{ dump_file1 }}'
|
- '{{ dump_file1 }}'
|
||||||
- '{{ dump_file2 }}'
|
- '{{ dump_file2 }}'
|
||||||
loop_control:
|
|
||||||
loop_var: cleanup_file
|
|
||||||
|
|
|
@ -41,10 +41,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.db == db_name
|
- result.db == '{{ db_name }}'
|
||||||
- result.executed_commands == expected_commands
|
- result.executed_commands == ["CREATE DATABASE `{{ db_name }}`"]
|
||||||
vars:
|
|
||||||
expected_commands: ["CREATE DATABASE `{{ db_name }}`"]
|
|
||||||
|
|
||||||
- name: State Present Absent | Run command to test state=present for a database name (expect db_name in stdout)
|
- name: State Present Absent | Run command to test state=present for a database name (expect db_name in stdout)
|
||||||
command: "{{ mysql_command }} -e \"show databases like '{{ db_name | regex_replace(\"([%_\\\\])\", \"\\\\\\1\") }}'\""
|
command: "{{ mysql_command }} -e \"show databases like '{{ db_name | regex_replace(\"([%_\\\\])\", \"\\\\\\1\") }}'\""
|
||||||
|
@ -53,7 +51,7 @@
|
||||||
- name: State Present Absent | Assert database exist
|
- name: State Present Absent | Assert database exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db_name in result.stdout
|
- "'{{ db_name }}' in result.stdout"
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
- name: State Present Absent | Test state=absent for a database name (expect changed=true)
|
- name: State Present Absent | Test state=absent for a database name (expect changed=true)
|
||||||
|
@ -70,10 +68,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.db == db_name
|
- result.db == '{{ db_name }}'
|
||||||
- result.executed_commands == expected_commands
|
- result.executed_commands == ["DROP DATABASE `{{ db_name }}`"]
|
||||||
vars:
|
|
||||||
expected_commands: ["DROP DATABASE `{{ db_name }}`"]
|
|
||||||
|
|
||||||
- name: State Present Absent | Run command to test state=absent for a database name (expect db_name not in stdout)
|
- name: State Present Absent | Run command to test state=absent for a database name (expect db_name not in stdout)
|
||||||
command: "{{ mysql_command }} -e \"show databases like '{{ db_name | regex_replace(\"([%_\\\\])\", \"\\\\\\1\") }}'\""
|
command: "{{ mysql_command }} -e \"show databases like '{{ db_name | regex_replace(\"([%_\\\\])\", \"\\\\\\1\") }}'\""
|
||||||
|
@ -82,7 +78,7 @@
|
||||||
- name: State Present Absent | Assert database does not exist
|
- name: State Present Absent | Assert database does not exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db_name not in result.stdout
|
- "'{{ db_name }}' not in result.stdout"
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
- name: State Present Absent | Test mysql_db encoding param not valid - issue 8075
|
- name: State Present Absent | Test mysql_db encoding param not valid - issue 8075
|
||||||
|
@ -120,9 +116,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_commands == expected_commands
|
- result.executed_commands == ["CREATE DATABASE `en{{ db_name }}` CHARACTER SET 'utf8'"]
|
||||||
vars:
|
|
||||||
expected_commands: ["CREATE DATABASE `en{{ db_name }}` CHARACTER SET 'utf8'"]
|
|
||||||
|
|
||||||
- name: State Present Absent | Test database was created
|
- name: State Present Absent | Test database was created
|
||||||
command: "{{ mysql_command }} -e \"SHOW CREATE DATABASE `en{{ db_name }}`\""
|
command: "{{ mysql_command }} -e \"SHOW CREATE DATABASE `en{{ db_name }}`\""
|
||||||
|
@ -158,9 +152,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_commands == expected_commands
|
- result.executed_commands == ["CREATE DATABASE `en{{ db_name }}` CHARACTER SET 'binary'"]
|
||||||
vars:
|
|
||||||
expected_commands: ["CREATE DATABASE `en{{ db_name }}` CHARACTER SET 'binary'"]
|
|
||||||
|
|
||||||
- name: State Present Absent | Run command to test database was created
|
- name: State Present Absent | Run command to test database was created
|
||||||
command: "{{ mysql_command }} -e \"SHOW CREATE DATABASE `en{{ db_name }}`\""
|
command: "{{ mysql_command }} -e \"SHOW CREATE DATABASE `en{{ db_name }}`\""
|
||||||
|
@ -215,7 +207,7 @@
|
||||||
- name: State Present Absent | Assert database exist
|
- name: State Present Absent | Assert database exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db_user1 in result.stdout
|
- "'{{ db_user1 }}' in result.stdout"
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
- name: State Present Absent | Create user2 to access database with privilege select only
|
- name: State Present Absent | Create user2 to access database with privilege select only
|
||||||
|
@ -253,7 +245,7 @@
|
||||||
- name: State Present Absent | Assert database does not exist
|
- name: State Present Absent | Assert database does not exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db_user2 not in result.stdout
|
- "'{{ db_user2 }}' not in result.stdout"
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
- name: State Present Absent | Delete database using user2 with no privilege to delete (expect failed=true)
|
- name: State Present Absent | Delete database using user2 with no privilege to delete (expect failed=true)
|
||||||
|
@ -280,7 +272,7 @@
|
||||||
- name: State Present Absent | Assert database still exist
|
- name: State Present Absent | Assert database still exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db_user1 in result.stdout
|
- "'{{ db_user1 }}' in result.stdout"
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
- name: State Present Absent | Delete database using user1 with all privilege to delete a database (expect changed=true)
|
- name: State Present Absent | Delete database using user1 with all privilege to delete a database (expect changed=true)
|
||||||
|
@ -298,9 +290,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_commands == expected_commands
|
- result.executed_commands == ["DROP DATABASE `{{ db_user1 }}`"]
|
||||||
vars:
|
|
||||||
expected_commands: ["DROP DATABASE `{{ db_user1 }}`"]
|
|
||||||
|
|
||||||
- name: State Present Absent | Run command to test database was deleted using user1
|
- name: State Present Absent | Run command to test database was deleted using user1
|
||||||
command: "{{ mysql_command }} -e \"show databases like '{{ db_name | regex_replace(\"([%_\\\\])\", \"\\\\\\1\") }}'\""
|
command: "{{ mysql_command }} -e \"show databases like '{{ db_name | regex_replace(\"([%_\\\\])\", \"\\\\\\1\") }}'\""
|
||||||
|
@ -309,100 +299,4 @@
|
||||||
- name: State Present Absent | Assert database does not exist
|
- name: State Present Absent | Assert database does not exist
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- db_user1 not in result.stdout
|
- "'{{ db_user1 }}' not in result.stdout"
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
- set_fact:
|
|
||||||
show_master_status: >-
|
|
||||||
{% if db_engine == 'mariadb' and db_version is version('10.5.2', '>=') %}
|
|
||||||
SHOW BINLOG STATUS
|
|
||||||
{% elif db_engine == 'mysql' and db_version is version('8.4', '>=') %}
|
|
||||||
SHOW BINARY LOG STATUS
|
|
||||||
{% else %}
|
|
||||||
SHOW MASTER STATUS
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
- name: State Present Absent | Capture binlog position
|
|
||||||
command: "{{ mysql_command }} -e \"{{ show_master_status }}\\G\""
|
|
||||||
register: bin_log_position_1
|
|
||||||
|
|
||||||
- name: State Present Absent | Create database with sql_log_bin enabled
|
|
||||||
mysql_db:
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
name: 'sql_bin_on_{{ db_name }}'
|
|
||||||
sql_log_bin: true
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: State Present Absent | Capture binlog position
|
|
||||||
command: "{{ mysql_command }} -e \"{{ show_master_status }}\\G\""
|
|
||||||
register: bin_log_position_2
|
|
||||||
|
|
||||||
- name: State Present Absent | Assert binlog events were written
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- bin_log_position_1.stdout_lines[2] != bin_log_position_2.stdout_lines[2]
|
|
||||||
|
|
||||||
- name: State Present Absent | Remove database with sql_log_bin enabled
|
|
||||||
mysql_db:
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
name: 'sql_bin_on_{{ db_name }}'
|
|
||||||
sql_log_bin: true
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: State Present Absent | Capture binlog position
|
|
||||||
command: "{{ mysql_command }} -e \"{{ show_master_status }}\\G\""
|
|
||||||
register: bin_log_position_3
|
|
||||||
|
|
||||||
- name: State Present Absent | Assert Binlog events were written
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- bin_log_position_2.stdout_lines[2] != bin_log_position_3.stdout_lines[2]
|
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
- name: State Present Absent | Capture binlog position
|
|
||||||
command: "{{ mysql_command }} -e \"{{ show_master_status }}\\G\""
|
|
||||||
register: bin_log_position_4
|
|
||||||
|
|
||||||
- name: State Present Absent | Create database with sql_log_bin disabled
|
|
||||||
mysql_db:
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
name: 'sql_bin_off_{{ db_name }}'
|
|
||||||
sql_log_bin: false
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: State Present Absent | Capture binlog position
|
|
||||||
command: "{{ mysql_command }} -e \"{{ show_master_status }}\\G\""
|
|
||||||
register: bin_log_position_5
|
|
||||||
|
|
||||||
- name: State Present Absent | Assert binlog events were not written
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- bin_log_position_4.stdout_lines[2] == bin_log_position_5.stdout_lines[2]
|
|
||||||
|
|
||||||
- name: State Present Absent | Remove database with sql_log_bin disabled
|
|
||||||
mysql_db:
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
name: 'sql_bin_off_{{ db_name }}'
|
|
||||||
sql_log_bin: false
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: State Present Absent | Capture binlog position
|
|
||||||
command: "{{ mysql_command }} -e \"{{ show_master_status }}\\G\""
|
|
||||||
register: bin_log_position_6
|
|
||||||
|
|
||||||
- name: State Present Absent | Assert Binlog events were not written
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- bin_log_position_5.stdout_lines[2] == bin_log_position_6.stdout_lines[2]
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
DELIMITER //
|
|
||||||
DROP PROCEDURE IF EXISTS users_info_db.get_all_items;
|
|
||||||
CREATE PROCEDURE users_info_db.get_all_items()
|
|
||||||
BEGIN
|
|
||||||
SELECT * from users_info_db.t1;
|
|
||||||
END //
|
|
||||||
DELIMITER ;
|
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
# Added in 3.6.0 in
|
# Added in 1.5.0, 2.4.0 and 3.6.0 in
|
||||||
# https://github.com/ansible-collections/community.mysql/pull/497
|
# https://github.com/ansible-collections/community.mysql/pull/497
|
||||||
|
|
||||||
- name: Connector info | Assert connector_name exists and has expected values
|
- name: Connector info | Assert connector_name exists and has expected values
|
||||||
|
|
|
@ -1,161 +0,0 @@
|
||||||
---
|
|
||||||
|
|
||||||
- module_defaults:
|
|
||||||
community.mysql.mysql_db: &mysql_defaults
|
|
||||||
login_user: "{{ mysql_user }}"
|
|
||||||
login_password: "{{ mysql_password }}"
|
|
||||||
login_host: "{{ mysql_host }}"
|
|
||||||
login_port: "{{ mysql_primary_port }}"
|
|
||||||
community.mysql.mysql_query: *mysql_defaults
|
|
||||||
community.mysql.mysql_info: *mysql_defaults
|
|
||||||
community.mysql.mysql_user: *mysql_defaults
|
|
||||||
|
|
||||||
block:
|
|
||||||
|
|
||||||
# ================================ Prepare ==============================
|
|
||||||
- name: Mysql_info databases | Prepare | Create databases
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
name:
|
|
||||||
- db_tables_count_empty
|
|
||||||
- db_tables_count_1
|
|
||||||
- db_tables_count_2
|
|
||||||
- db_only_views # https://github.com/ansible-Getions/community.mysql/issues/204
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Mysql_info databases | Prepare | Create tables
|
|
||||||
community.mysql.mysql_query:
|
|
||||||
query:
|
|
||||||
- >-
|
|
||||||
CREATE TABLE IF NOT EXISTS db_tables_count_1.t1
|
|
||||||
(id int, name varchar(9))
|
|
||||||
- >-
|
|
||||||
CREATE TABLE IF NOT EXISTS db_tables_count_2.t1
|
|
||||||
(id int, name1 varchar(9))
|
|
||||||
- >-
|
|
||||||
CREATE TABLE IF NOT EXISTS db_tables_count_2.t2
|
|
||||||
(id int, name1 varchar(9))
|
|
||||||
- >-
|
|
||||||
CREATE VIEW db_only_views.v_today (today) AS SELECT CURRENT_DATE
|
|
||||||
|
|
||||||
# ================================== Tests ==============================
|
|
||||||
|
|
||||||
- name: Mysql_info databases | Get all non-empty databases fields
|
|
||||||
community.mysql.mysql_info:
|
|
||||||
filter:
|
|
||||||
- databases
|
|
||||||
register: result
|
|
||||||
failed_when:
|
|
||||||
- >
|
|
||||||
result.databases['db_tables_count_1'].size != 16384 or
|
|
||||||
result.databases['db_tables_count_1'].tables != 1 or
|
|
||||||
result.databases['db_tables_count_2'].size != 32768 or
|
|
||||||
result.databases['db_tables_count_2'].tables != 2 or
|
|
||||||
result.databases['db_only_views'].size != 0 or
|
|
||||||
result.databases['db_only_views'].tables != 1 or
|
|
||||||
'db_tables_count_empty' in result.databases | dict2items
|
|
||||||
| map(attribute='key')
|
|
||||||
|
|
||||||
- name: Mysql_info databases | Get all dbs fields except db_size
|
|
||||||
community.mysql.mysql_info:
|
|
||||||
filter:
|
|
||||||
- databases
|
|
||||||
exclude_fields:
|
|
||||||
- db_size
|
|
||||||
register: result
|
|
||||||
failed_when:
|
|
||||||
- >
|
|
||||||
result.databases['db_tables_count_1'].size is defined or
|
|
||||||
result.databases['db_tables_count_1'].tables != 1 or
|
|
||||||
result.databases['db_tables_count_2'].size is defined or
|
|
||||||
result.databases['db_tables_count_2'].tables != 2 or
|
|
||||||
result.databases['db_only_views'].size is defined or
|
|
||||||
result.databases['db_only_views'].tables != 1 or
|
|
||||||
'db_tables_count_empty' in result.databases | dict2items
|
|
||||||
| map(attribute='key')
|
|
||||||
|
|
||||||
# 'unsupported' element is passed to check that an unsupported value
|
|
||||||
# won't break anything (will be ignored regarding to the module's
|
|
||||||
# documentation).
|
|
||||||
- name: Mysql_info databases | Get all dbs fields with unsupported value
|
|
||||||
community.mysql.mysql_info:
|
|
||||||
filter:
|
|
||||||
- databases
|
|
||||||
exclude_fields:
|
|
||||||
- db_size
|
|
||||||
- unsupported
|
|
||||||
register: result
|
|
||||||
failed_when:
|
|
||||||
- >
|
|
||||||
result.databases['db_tables_count_1'].size is defined or
|
|
||||||
result.databases['db_tables_count_1'].tables != 1 or
|
|
||||||
result.databases['db_tables_count_2'].size is defined or
|
|
||||||
result.databases['db_tables_count_2'].tables != 2 or
|
|
||||||
result.databases['db_only_views'].size is defined or
|
|
||||||
result.databases['db_only_views'].tables != 1 or
|
|
||||||
'db_tables_count_empty' in result.databases | dict2items
|
|
||||||
| map(attribute='key')
|
|
||||||
|
|
||||||
- name: Mysql_info databases | Get all dbs fields except tables
|
|
||||||
community.mysql.mysql_info:
|
|
||||||
filter:
|
|
||||||
- databases
|
|
||||||
exclude_fields:
|
|
||||||
- db_table_count
|
|
||||||
register: result
|
|
||||||
failed_when:
|
|
||||||
- >
|
|
||||||
result.databases['db_tables_count_1'].size != 16384 or
|
|
||||||
result.databases['db_tables_count_1'].tables is defined or
|
|
||||||
result.databases['db_tables_count_2'].size != 32768 or
|
|
||||||
result.databases['db_tables_count_2'].tables is defined or
|
|
||||||
result.databases['db_only_views'].size != 0 or
|
|
||||||
result.databases['db_only_views'].tables is defined or
|
|
||||||
'db_tables_count_empty' in result.databases | dict2items
|
|
||||||
| map(attribute='key')
|
|
||||||
|
|
||||||
- name: Mysql_info databases | Get all dbs even empty ones
|
|
||||||
community.mysql.mysql_info:
|
|
||||||
filter:
|
|
||||||
- databases
|
|
||||||
return_empty_dbs: true
|
|
||||||
register: result
|
|
||||||
failed_when:
|
|
||||||
- >
|
|
||||||
result.databases['db_tables_count_1'].size != 16384 or
|
|
||||||
result.databases['db_tables_count_1'].tables != 1 or
|
|
||||||
result.databases['db_tables_count_2'].size != 32768 or
|
|
||||||
result.databases['db_tables_count_2'].tables != 2 or
|
|
||||||
result.databases['db_only_views'].size != 0 or
|
|
||||||
result.databases['db_only_views'].tables != 1 or
|
|
||||||
result.databases['db_tables_count_empty'].size != 0 or
|
|
||||||
result.databases['db_tables_count_empty'].tables != 0
|
|
||||||
|
|
||||||
- name: Mysql_info databases | Get all dbs even empty ones without size
|
|
||||||
community.mysql.mysql_info:
|
|
||||||
filter:
|
|
||||||
- databases
|
|
||||||
exclude_fields:
|
|
||||||
- db_size
|
|
||||||
return_empty_dbs: true
|
|
||||||
register: result
|
|
||||||
failed_when:
|
|
||||||
- >
|
|
||||||
result.databases['db_tables_count_1'].size is defined or
|
|
||||||
result.databases['db_tables_count_1'].tables != 1 or
|
|
||||||
result.databases['db_tables_count_2'].size is defined or
|
|
||||||
result.databases['db_tables_count_2'].tables != 2 or
|
|
||||||
result.databases['db_only_views'].size is defined or
|
|
||||||
result.databases['db_only_views'].tables != 1 or
|
|
||||||
result.databases['db_tables_count_empty'].size is defined or
|
|
||||||
result.databases['db_tables_count_empty'].tables != 0
|
|
||||||
|
|
||||||
# ================================== Cleanup ============================
|
|
||||||
|
|
||||||
- name: Mysql_info databases | Cleanup databases
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
name:
|
|
||||||
- db_tables_count_empty
|
|
||||||
- db_tables_count_1
|
|
||||||
- db_tables_count_2
|
|
||||||
- db_only_views
|
|
||||||
state: absent
|
|
|
@ -1,334 +0,0 @@
|
||||||
---
|
|
||||||
|
|
||||||
- module_defaults:
|
|
||||||
community.mysql.mysql_db: &mysql_defaults
|
|
||||||
login_user: "{{ mysql_user }}"
|
|
||||||
login_password: "{{ mysql_password }}"
|
|
||||||
login_host: "{{ mysql_host }}"
|
|
||||||
login_port: "{{ mysql_primary_port }}"
|
|
||||||
community.mysql.mysql_query: *mysql_defaults
|
|
||||||
community.mysql.mysql_info: *mysql_defaults
|
|
||||||
community.mysql.mysql_user: *mysql_defaults
|
|
||||||
|
|
||||||
block:
|
|
||||||
|
|
||||||
# ================================ Prepare ==============================
|
|
||||||
- name: Mysql_info users_info | Create databases
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
name:
|
|
||||||
- users_info_db
|
|
||||||
- users_info_db2
|
|
||||||
- users_info_db3
|
|
||||||
state: present
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Create tables
|
|
||||||
community.mysql.mysql_query:
|
|
||||||
query:
|
|
||||||
- >-
|
|
||||||
CREATE TABLE IF NOT EXISTS users_info_db.t1
|
|
||||||
(id int, name varchar(9))
|
|
||||||
- >-
|
|
||||||
CREATE TABLE IF NOT EXISTS users_info_db.T_UPPER
|
|
||||||
(id int, name1 varchar(9), NAME2 varchar(9), Name3 varchar(9))
|
|
||||||
|
|
||||||
# No need for a specific test later. When the module will retrieve the
|
|
||||||
# users privileges, it will fail with an error "1141 - There is no such
|
|
||||||
# grant defined for user 'PUBLIC' on host'%'" if the PUBLIC role is not
|
|
||||||
# handled properly by our module.
|
|
||||||
- name: Mysql_info users_info | Grant to PUBLIC for MariaDB 10.11+
|
|
||||||
community.mysql.mysql_query:
|
|
||||||
query:
|
|
||||||
- >-
|
|
||||||
GRANT SELECT,INSERT,UPDATE,DELETE on users_info_db.* TO PUBLIC
|
|
||||||
when:
|
|
||||||
- db_engine == 'mariadb'
|
|
||||||
- db_version is version('10.11.1', '>=')
|
|
||||||
|
|
||||||
# I failed to create a procedure using community.mysql.mysql_query.
|
|
||||||
# Maybe it's because we must changed the delimiter.
|
|
||||||
- name: Mysql_info users_info | Create procedure SQL file
|
|
||||||
ansible.builtin.template:
|
|
||||||
src: files/users_info_create_procedure.sql
|
|
||||||
dest: /root/create_procedure.sql
|
|
||||||
owner: root
|
|
||||||
group: root
|
|
||||||
mode: '0700'
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Create a procedure
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
name: all
|
|
||||||
state: import
|
|
||||||
target: /root/create_procedure.sql
|
|
||||||
|
|
||||||
# Use a query instead of mysql_user, because we want to catch differences
|
|
||||||
# at the end and a bug in mysql_user would be invisible to this tests
|
|
||||||
- name: Mysql_info users_info | Prepare common tests users
|
|
||||||
community.mysql.mysql_query:
|
|
||||||
query:
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_adm@'users_info.com' IDENTIFIED WITH
|
|
||||||
mysql_native_password AS '*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
- >
|
|
||||||
GRANT ALL ON *.* to users_info_adm@'users_info.com' WITH GRANT
|
|
||||||
OPTION
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_schema@'users_info.com' IDENTIFIED WITH
|
|
||||||
mysql_native_password AS '*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
- >-
|
|
||||||
GRANT SELECT, INSERT, UPDATE, DELETE ON users_info_db.* TO
|
|
||||||
users_info_schema@'users_info.com'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_table@'users_info.com' IDENTIFIED WITH
|
|
||||||
mysql_native_password AS '*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
- >-
|
|
||||||
GRANT SELECT, INSERT, UPDATE ON users_info_db.t1 TO
|
|
||||||
users_info_table@'users_info.com'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_col@'users_info.com' IDENTIFIED WITH
|
|
||||||
mysql_native_password AS '*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
WITH MAX_USER_CONNECTIONS 100
|
|
||||||
- >-
|
|
||||||
GRANT SELECT (id) ON users_info_db.t1 TO
|
|
||||||
users_info_col@'users_info.com'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_proc@'users_info.com' IDENTIFIED WITH
|
|
||||||
mysql_native_password AS '*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
WITH MAX_USER_CONNECTIONS 2 MAX_CONNECTIONS_PER_HOUR 60
|
|
||||||
- >-
|
|
||||||
GRANT EXECUTE ON PROCEDURE users_info_db.get_all_items TO
|
|
||||||
users_info_proc@'users_info.com'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_multi@'users_info.com' IDENTIFIED WITH
|
|
||||||
mysql_native_password AS '*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
- >-
|
|
||||||
GRANT SELECT ON mysql.* TO
|
|
||||||
users_info_multi@'users_info.com'
|
|
||||||
- >-
|
|
||||||
GRANT ALL ON users_info_db.* TO
|
|
||||||
users_info_multi@'users_info.com'
|
|
||||||
- >-
|
|
||||||
GRANT ALL ON users_info_db2.* TO
|
|
||||||
users_info_multi@'users_info.com'
|
|
||||||
- >-
|
|
||||||
GRANT ALL ON users_info_db3.* TO
|
|
||||||
users_info_multi@'users_info.com'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_usage_only@'users_info.com' IDENTIFIED WITH
|
|
||||||
mysql_native_password AS '*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
- >-
|
|
||||||
GRANT USAGE ON *.* TO
|
|
||||||
users_info_usage_only@'users_info.com'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_columns_uppercase@'users_info.com'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
- >-
|
|
||||||
GRANT SELECT,UPDATE(name1,NAME2,Name3) ON users_info_db.T_UPPER TO
|
|
||||||
users_info_columns_uppercase@'users_info.com'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_multi_hosts@'%'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
- GRANT SELECT ON users_info_db.* TO users_info_multi_hosts@'%'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_multi_hosts@'localhost'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
- >-
|
|
||||||
GRANT SELECT ON users_info_db.* TO
|
|
||||||
users_info_multi_hosts@'localhost'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_multi_hosts@'host1'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*6C387FC3893DBA1E3BA155E74754DA6682D04747'
|
|
||||||
- GRANT SELECT ON users_info_db.* TO users_info_multi_hosts@'host1'
|
|
||||||
|
|
||||||
# Different password than the others users_info_multi_hosts
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_multi_hosts@'host2'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*CB3326D5279DE7915FE5D743232165EE887883CA'
|
|
||||||
- GRANT SELECT ON users_info_db.* TO users_info_multi_hosts@'host2'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_tls_none@'host'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*CB3326D5279DE7915FE5D743232165EE887883CA' REQUIRE NONE
|
|
||||||
- GRANT SELECT ON users_info_db.* TO users_info_tls_none@'host'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_tls_ssl@'host'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*CB3326D5279DE7915FE5D743232165EE887883CA' REQUIRE SSL
|
|
||||||
- GRANT SELECT ON users_info_db.* TO users_info_tls_ssl@'host'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_tls_cipher@'host'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*CB3326D5279DE7915FE5D743232165EE887883CA'
|
|
||||||
REQUIRE CIPHER 'ECDH-RSA-AES256-SHA384'
|
|
||||||
- GRANT SELECT ON users_info_db.* TO users_info_tls_cipher@'host'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_tls_x509@'host'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*CB3326D5279DE7915FE5D743232165EE887883CA' REQUIRE X509
|
|
||||||
- GRANT SELECT ON users_info_db.* TO users_info_tls_x509@'host'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_tls_subject@'host'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*CB3326D5279DE7915FE5D743232165EE887883CA'
|
|
||||||
REQUIRE SUBJECT '/CN=Bob/O=MyDom/C=US/ST=Oregon/L=Portland'
|
|
||||||
- GRANT SELECT ON users_info_db.* TO users_info_tls_subject@'host'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_tls_issuer@'host'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*CB3326D5279DE7915FE5D743232165EE887883CA'
|
|
||||||
REQUIRE ISSUER '/C=FI/ST=Somewhere/L=City/
|
|
||||||
O=CompanyX/CN=Bob/emailAddress=bob@companyx.com'
|
|
||||||
- GRANT SELECT ON users_info_db.* TO users_info_tls_issuer@'host'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_tls_subject_issuer@'host'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*CB3326D5279DE7915FE5D743232165EE887883CA'
|
|
||||||
REQUIRE SUBJECT '/CN=Bob/O=MyDom/C=US/ST=Oregon/L=Portland'
|
|
||||||
AND ISSUER '/C=FI/ST=Somewhere/L=City/
|
|
||||||
O=CompanyX/CN=Bob/emailAddress=bob@companyx.com'
|
|
||||||
- >-
|
|
||||||
GRANT SELECT ON users_info_db.*
|
|
||||||
TO users_info_tls_subject_issuer@'host'
|
|
||||||
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_tls_sub_issu_ciph@'host'
|
|
||||||
IDENTIFIED WITH mysql_native_password AS
|
|
||||||
'*CB3326D5279DE7915FE5D743232165EE887883CA'
|
|
||||||
REQUIRE SUBJECT '/CN=Bob/O=MyDom/C=US/ST=Oregon/L=Portland'
|
|
||||||
AND ISSUER '/C=FI/ST=Somewhere/L=City/
|
|
||||||
O=CompanyX/CN=Bob/emailAddress=bob@companyx.com'
|
|
||||||
AND CIPHER 'ECDH-RSA-AES256-SHA384'
|
|
||||||
- >-
|
|
||||||
GRANT SELECT ON users_info_db.*
|
|
||||||
TO users_info_tls_sub_issu_ciph@'host'
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Prepare tests users for MariaDB
|
|
||||||
community.mysql.mysql_query:
|
|
||||||
query:
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_socket@'users_info.com' IDENTIFIED WITH
|
|
||||||
unix_socket
|
|
||||||
- GRANT ALL ON *.* to users_info_socket@'users_info.com'
|
|
||||||
when:
|
|
||||||
- db_engine == 'mariadb'
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Prepare tests users for MySQL
|
|
||||||
community.mysql.mysql_query:
|
|
||||||
query:
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_sha256@'users_info.com' IDENTIFIED WITH
|
|
||||||
sha256_password BY 'msandbox'
|
|
||||||
- GRANT ALL ON *.* to users_info_sha256@'users_info.com'
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Prepare tests users for MySQL 8+
|
|
||||||
community.mysql.mysql_query:
|
|
||||||
query:
|
|
||||||
- >-
|
|
||||||
CREATE USER users_info_caching_sha2@'users_info.com' IDENTIFIED WITH
|
|
||||||
caching_sha2_password BY 'msandbox'
|
|
||||||
- GRANT ALL ON *.* to users_info_caching_sha2@'users_info.com'
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0', '>=')
|
|
||||||
|
|
||||||
# ================================== Tests ==============================
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Collect users_info
|
|
||||||
community.mysql.mysql_info:
|
|
||||||
filter:
|
|
||||||
- users_info
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Recreate users from mysql_info result
|
|
||||||
community.mysql.mysql_user:
|
|
||||||
name: "{{ item.name }}"
|
|
||||||
host: "{{ item.host }}"
|
|
||||||
plugin: "{{ item.plugin | default(omit) }}"
|
|
||||||
plugin_auth_string: "{{ item.plugin_auth_string | default(omit) }}"
|
|
||||||
plugin_hash_string: "{{ item.plugin_hash_string | default(omit) }}"
|
|
||||||
tls_requires: "{{ item.tls_requires | default(omit) }}"
|
|
||||||
priv: "{{ item.priv | default(omit) }}"
|
|
||||||
resource_limits: "{{ item.resource_limits | default(omit) }}"
|
|
||||||
column_case_sensitive: true
|
|
||||||
state: present
|
|
||||||
locked: "{{ item.locked | default(omit) }}"
|
|
||||||
loop: "{{ result.users_info }}"
|
|
||||||
loop_control:
|
|
||||||
label: "{{ item.name }}@{{ item.host }}"
|
|
||||||
register: recreate_users_result
|
|
||||||
failed_when:
|
|
||||||
- >-
|
|
||||||
recreate_users_result is changed or
|
|
||||||
recreate_users_result.msg != 'User unchanged'
|
|
||||||
when:
|
|
||||||
- item.name != 'root'
|
|
||||||
- item.name != 'mysql'
|
|
||||||
- item.name != 'mariadb.sys'
|
|
||||||
- item.name != 'mysql.sys'
|
|
||||||
- item.name != 'mysql.infoschema'
|
|
||||||
- item.name != 'mysql.session'
|
|
||||||
- item.name != 'PUBLIC' # MariaDB roles are not supported
|
|
||||||
|
|
||||||
# ================================== Cleanup ============================
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Cleanup users_info
|
|
||||||
community.mysql.mysql_user:
|
|
||||||
name: "{{ item }}"
|
|
||||||
host_all: true
|
|
||||||
column_case_sensitive: true
|
|
||||||
state: absent
|
|
||||||
loop:
|
|
||||||
- users_info_adm
|
|
||||||
- users_info_schema
|
|
||||||
- users_info_table
|
|
||||||
- users_info_col
|
|
||||||
- users_info_proc
|
|
||||||
- users_info_multi
|
|
||||||
- users_info_db
|
|
||||||
- users_info_usage_only
|
|
||||||
- users_info_columns_uppercase
|
|
||||||
- users_info_multi_hosts
|
|
||||||
- users_info_tls_none
|
|
||||||
- users_info_tls_ssl
|
|
||||||
- users_info_tls_cipher
|
|
||||||
- users_info_tls_x509
|
|
||||||
- users_info_tls_subject
|
|
||||||
- users_info_tls_issuer
|
|
||||||
- users_info_tls_subject_issuer
|
|
||||||
- users_info_tls_sub_issu_ciph
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Cleanup databases
|
|
||||||
community.mysql.mysql_db:
|
|
||||||
name:
|
|
||||||
- users_info_db
|
|
||||||
- users_info_db2
|
|
||||||
- users_info_db3
|
|
||||||
state: absent
|
|
||||||
|
|
||||||
- name: Mysql_info users_info | Cleanup sql file for the procedure
|
|
||||||
ansible.builtin.file:
|
|
||||||
path: /root/create_procedure.sql
|
|
||||||
state: absent
|
|
|
@ -16,6 +16,7 @@
|
||||||
block:
|
block:
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
- name: get server certificate
|
- name: get server certificate
|
||||||
copy:
|
copy:
|
||||||
content: "{{ lookup('pipe', \"openssl s_client -starttls mysql -connect localhost:3307 -showcerts 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'\") }}"
|
content: "{{ lookup('pipe', \"openssl s_client -starttls mysql -connect localhost:3307 -showcerts 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'\") }}"
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
####################################################################
|
####################################################################
|
||||||
|
|
||||||
# Test code for mysql_info module
|
# Test code for mysql_info module
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
###################
|
###################
|
||||||
|
@ -56,7 +56,6 @@
|
||||||
- result.databases != {}
|
- result.databases != {}
|
||||||
- result.engines != {}
|
- result.engines != {}
|
||||||
- result.users != {}
|
- result.users != {}
|
||||||
- result.server_engine == 'MariaDB' or result.server_engine == 'MySQL'
|
|
||||||
|
|
||||||
- name: mysql_info - Test connector informations display
|
- name: mysql_info - Test connector informations display
|
||||||
ansible.builtin.import_tasks:
|
ansible.builtin.import_tasks:
|
||||||
|
@ -132,12 +131,91 @@
|
||||||
- result.global_status is not defined
|
- result.global_status is not defined
|
||||||
- result.users is not defined
|
- result.users is not defined
|
||||||
|
|
||||||
- include_tasks: issue-28.yml
|
# Test exclude_fields: db_size
|
||||||
|
# 'unsupported' element is passed to check that an unsupported value
|
||||||
|
# won't break anything (will be ignored regarding to the module's documentation).
|
||||||
|
- name: Collect info about databases excluding their sizes
|
||||||
|
mysql_info:
|
||||||
|
<<: *mysql_params
|
||||||
|
filter:
|
||||||
|
- databases
|
||||||
|
exclude_fields:
|
||||||
|
- db_size
|
||||||
|
- unsupported
|
||||||
|
register: result
|
||||||
|
|
||||||
- name: Import tasks file to tests tables count in database filter
|
- assert:
|
||||||
ansible.builtin.import_tasks:
|
that:
|
||||||
file: filter_databases.yml
|
- result is not changed
|
||||||
|
- result.databases != {}
|
||||||
|
- result.databases.mysql == {}
|
||||||
|
|
||||||
- name: Import tasks file to tests users_info filter
|
########################################################
|
||||||
ansible.builtin.import_tasks:
|
# Issue #65727, empty databases must be in returned dict
|
||||||
file: filter_users_info.yml
|
#
|
||||||
|
- name: Create empty database acme
|
||||||
|
mysql_db:
|
||||||
|
<<: *mysql_params
|
||||||
|
name: acme
|
||||||
|
|
||||||
|
- name: Collect info about databases
|
||||||
|
mysql_info:
|
||||||
|
<<: *mysql_params
|
||||||
|
filter:
|
||||||
|
- databases
|
||||||
|
return_empty_dbs: true
|
||||||
|
register: result
|
||||||
|
|
||||||
|
# Check acme is in returned dict
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- result is not changed
|
||||||
|
- result.databases.acme.size == 0
|
||||||
|
- result.databases.mysql != {}
|
||||||
|
|
||||||
|
- name: Collect info about databases excluding their sizes
|
||||||
|
mysql_info:
|
||||||
|
<<: *mysql_params
|
||||||
|
filter:
|
||||||
|
- databases
|
||||||
|
exclude_fields:
|
||||||
|
- db_size
|
||||||
|
return_empty_dbs: true
|
||||||
|
register: result
|
||||||
|
|
||||||
|
# Check acme is in returned dict
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- result is not changed
|
||||||
|
- result.databases.acme == {}
|
||||||
|
- result.databases.mysql == {}
|
||||||
|
|
||||||
|
- name: Remove acme database
|
||||||
|
mysql_db:
|
||||||
|
<<: *mysql_params
|
||||||
|
name: acme
|
||||||
|
state: absent
|
||||||
|
|
||||||
|
- include: issue-28.yml
|
||||||
|
|
||||||
|
# https://github.com/ansible-collections/community.mysql/issues/204
|
||||||
|
- name: Create database containing only views
|
||||||
|
mysql_db:
|
||||||
|
<<: *mysql_params
|
||||||
|
name: allviews
|
||||||
|
|
||||||
|
- name: Create view
|
||||||
|
mysql_query:
|
||||||
|
<<: *mysql_params
|
||||||
|
login_db: allviews
|
||||||
|
query: 'CREATE VIEW v_today (today) AS SELECT CURRENT_DATE'
|
||||||
|
|
||||||
|
- name: Fetch info
|
||||||
|
mysql_info:
|
||||||
|
<<: *mysql_params
|
||||||
|
register: result
|
||||||
|
|
||||||
|
- name: Check
|
||||||
|
assert:
|
||||||
|
that:
|
||||||
|
- result.databases.allviews.size == 0
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
block:
|
block:
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
- name: get server certificate
|
- name: get server certificate
|
||||||
copy:
|
copy:
|
||||||
content: "{{ lookup('pipe', \"openssl s_client -starttls mysql -connect localhost:3307 -showcerts 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'\") }}"
|
content: "{{ lookup('pipe', \"openssl s_client -starttls mysql -connect localhost:3307 -showcerts 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'\") }}"
|
||||||
|
|
|
@ -6,4 +6,4 @@
|
||||||
# mysql_query module initial CI tests
|
# mysql_query module initial CI tests
|
||||||
- import_tasks: mysql_query_initial.yml
|
- import_tasks: mysql_query_initial.yml
|
||||||
|
|
||||||
- include_tasks: issue-28.yml
|
- include: issue-28.yml
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
# Test code for mysql_query module
|
# Test code for mysql_query module
|
||||||
# Copyright: (c) 2020, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2020, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
- vars:
|
- vars:
|
||||||
mysql_parameters: &mysql_params
|
mysql_parameters: &mysql_params
|
||||||
|
@ -21,9 +21,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['CREATE DATABASE {{ test_db }}']
|
||||||
vars:
|
|
||||||
expected_queries: ['CREATE DATABASE {{ test_db }}']
|
|
||||||
|
|
||||||
- name: Create {{ test_table1 }}
|
- name: Create {{ test_table1 }}
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -36,10 +34,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['CREATE TABLE {{ test_table1 }} (id int)']
|
||||||
- result.execution_time_ms[0] > 0
|
|
||||||
vars:
|
|
||||||
expected_queries: ['CREATE TABLE {{ test_table1 }} (id int)']
|
|
||||||
|
|
||||||
- name: Insert test data
|
- name: Insert test data
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -56,14 +51,7 @@
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.rowcount == [2, 1]
|
- result.rowcount == [2, 1]
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['INSERT INTO {{ test_table1 }} VALUES (1), (2)', 'INSERT INTO {{ test_table1 }} VALUES (3)']
|
||||||
- result.execution_time_ms[0] > 0
|
|
||||||
- result.execution_time_ms[1] > 0
|
|
||||||
vars:
|
|
||||||
expected_queries: [
|
|
||||||
'INSERT INTO {{ test_table1 }} VALUES (1), (2)',
|
|
||||||
'INSERT INTO {{ test_table1 }} VALUES (3)',
|
|
||||||
]
|
|
||||||
|
|
||||||
- name: Check data in {{ test_table1 }}
|
- name: Check data in {{ test_table1 }}
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -76,13 +64,11 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is not changed
|
- result is not changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['SELECT * FROM {{ test_table1 }}']
|
||||||
- result.rowcount == [3]
|
- result.rowcount == [3]
|
||||||
- result.query_result[0][0].id == 1
|
- result.query_result[0][0].id == 1
|
||||||
- result.query_result[0][1].id == 2
|
- result.query_result[0][1].id == 2
|
||||||
- result.query_result[0][2].id == 3
|
- result.query_result[0][2].id == 3
|
||||||
vars:
|
|
||||||
expected_queries: ['SELECT * FROM {{ test_table1 }}']
|
|
||||||
|
|
||||||
- name: Check data in {{ test_table1 }} using positional args
|
- name: Check data in {{ test_table1 }} using positional args
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -97,11 +83,9 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is not changed
|
- result is not changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ["SELECT * FROM {{ test_table1 }} WHERE id = 1"]
|
||||||
- result.rowcount == [1]
|
- result.rowcount == [1]
|
||||||
- result.query_result[0][0].id == 1
|
- result.query_result[0][0].id == 1
|
||||||
vars:
|
|
||||||
expected_queries: ["SELECT * FROM {{ test_table1 }} WHERE id = 1"]
|
|
||||||
|
|
||||||
- name: Check data in {{ test_table1 }} using named args
|
- name: Check data in {{ test_table1 }} using named args
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -116,11 +100,9 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is not changed
|
- result is not changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ["SELECT * FROM {{ test_table1 }} WHERE id = 1"]
|
||||||
- result.rowcount == [1]
|
- result.rowcount == [1]
|
||||||
- result.query_result[0][0].id == 1
|
- result.query_result[0][0].id == 1
|
||||||
vars:
|
|
||||||
expected_queries: ["SELECT * FROM {{ test_table1 }} WHERE id = 1"]
|
|
||||||
|
|
||||||
- name: Update data in {{ test_table1 }}
|
- name: Update data in {{ test_table1 }}
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -136,10 +118,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['UPDATE {{ test_table1 }} SET id = 0 WHERE id = 1']
|
||||||
- result.rowcount == [1]
|
- result.rowcount == [1]
|
||||||
vars:
|
|
||||||
expected_queries: ['UPDATE {{ test_table1 }} SET id = 0 WHERE id = 1']
|
|
||||||
|
|
||||||
- name: Check the prev update - row with value 1 does not exist anymore
|
- name: Check the prev update - row with value 1 does not exist anymore
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -154,10 +134,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is not changed
|
- result is not changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['SELECT * FROM {{ test_table1 }} WHERE id = 1']
|
||||||
- result.rowcount == [0]
|
- result.rowcount == [0]
|
||||||
vars:
|
|
||||||
expected_queries: ['SELECT * FROM {{ test_table1 }} WHERE id = 1']
|
|
||||||
|
|
||||||
- name: Check the prev update - row with value - exist
|
- name: Check the prev update - row with value - exist
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -172,10 +150,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is not changed
|
- result is not changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['SELECT * FROM {{ test_table1 }} WHERE id = 0']
|
||||||
- result.rowcount == [1]
|
- result.rowcount == [1]
|
||||||
vars:
|
|
||||||
expected_queries: ['SELECT * FROM {{ test_table1 }} WHERE id = 0']
|
|
||||||
|
|
||||||
- name: Update data in {{ test_table1 }} again
|
- name: Update data in {{ test_table1 }} again
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -191,10 +167,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is not changed
|
- result is not changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['UPDATE {{ test_table1 }} SET id = 0 WHERE id = 1']
|
||||||
- result.rowcount == [0]
|
- result.rowcount == [0]
|
||||||
vars:
|
|
||||||
expected_queries: ['UPDATE {{ test_table1 }} SET id = 0 WHERE id = 1']
|
|
||||||
|
|
||||||
- name: Delete data from {{ test_table1 }}
|
- name: Delete data from {{ test_table1 }}
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -209,10 +183,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['DELETE FROM {{ test_table1 }} WHERE id = 0', 'SELECT * FROM {{ test_table1 }} WHERE id = 0']
|
||||||
- result.rowcount == [1, 0]
|
- result.rowcount == [1, 0]
|
||||||
vars:
|
|
||||||
expected_queries: ['DELETE FROM {{ test_table1 }} WHERE id = 0', 'SELECT * FROM {{ test_table1 }} WHERE id = 0']
|
|
||||||
|
|
||||||
- name: Delete data from {{ test_table1 }} again
|
- name: Delete data from {{ test_table1 }} again
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -225,10 +197,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is not changed
|
- result is not changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['DELETE FROM {{ test_table1 }} WHERE id = 0']
|
||||||
- result.rowcount == [0]
|
- result.rowcount == [0]
|
||||||
vars:
|
|
||||||
expected_queries: ['DELETE FROM {{ test_table1 }} WHERE id = 0']
|
|
||||||
|
|
||||||
- name: Truncate {{ test_table1 }}
|
- name: Truncate {{ test_table1 }}
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -243,10 +213,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['TRUNCATE {{ test_table1 }}', 'SELECT * FROM {{ test_table1 }}']
|
||||||
- result.rowcount == [0, 0]
|
- result.rowcount == [0, 0]
|
||||||
vars:
|
|
||||||
expected_queries: ['TRUNCATE {{ test_table1 }}', 'SELECT * FROM {{ test_table1 }}']
|
|
||||||
|
|
||||||
- name: Rename {{ test_table1 }}
|
- name: Rename {{ test_table1 }}
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -259,10 +227,8 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['RENAME TABLE {{ test_table1 }} TO {{ test_table2 }}']
|
||||||
- result.rowcount == [0]
|
- result.rowcount == [0]
|
||||||
vars:
|
|
||||||
expected_queries: ['RENAME TABLE {{ test_table1 }} TO {{ test_table2 }}']
|
|
||||||
|
|
||||||
- name: Check the prev rename
|
- name: Check the prev rename
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -397,27 +363,21 @@
|
||||||
- name: Assert that create table IF NOT EXISTS is not changed with pymysql
|
- name: Assert that create table IF NOT EXISTS is not changed with pymysql
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
# PyMySQL driver throws a warning for version before 0.10.0
|
# PyMySQL driver throws a warning, so the following is correct
|
||||||
- result is not changed
|
- result is not changed
|
||||||
when:
|
when:
|
||||||
- connector_name == 'pymysql'
|
- connector_name == 'pymysql'
|
||||||
- connector_version is version('0.10.0', '<')
|
|
||||||
|
|
||||||
# Issue https://github.com/ansible-collections/community.mysql/issues/268
|
# Issue https://github.com/ansible-collections/community.mysql/issues/268
|
||||||
- name: Assert that create table IF NOT EXISTS is changed with mysqlclient
|
- name: Assert that create table IF NOT EXISTS is changed with mysqlclient
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
# Mysqlclient 2.0.1 and pymysql 0.10.0+ drivers throws no warning,
|
# Mysqlclient 2.0.1, driver throws nothing with mysql, so it's
|
||||||
# so it's impossible to figure out if the state was changed or not.
|
# impossible to figure out if the state was changed or not.
|
||||||
# We assume that it was for DDL queries by default in the code
|
# We assume that it was for DDL queries by default in the code
|
||||||
- result is changed
|
- result is changed
|
||||||
when:
|
when:
|
||||||
- >
|
- connector_name == 'mysqlclient'
|
||||||
connector_name == 'mysqlclient'
|
|
||||||
or (
|
|
||||||
connector_name == 'pymysql'
|
|
||||||
and connector_version is version('0.10.0', '>')
|
|
||||||
)
|
|
||||||
|
|
||||||
- name: Drop db {{ test_db }}
|
- name: Drop db {{ test_db }}
|
||||||
mysql_query:
|
mysql_query:
|
||||||
|
@ -429,9 +389,7 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.executed_queries == expected_queries
|
- result.executed_queries == ['DROP DATABASE {{ test_db }}']
|
||||||
vars:
|
|
||||||
expected_queries: ['DROP DATABASE {{ test_db }}']
|
|
||||||
|
|
||||||
always:
|
always:
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ mysql_replica2_port: 3309
|
||||||
|
|
||||||
test_db: test_db
|
test_db: test_db
|
||||||
test_table: test_table
|
test_table: test_table
|
||||||
test_primary_delay: 60
|
test_master_delay: 60
|
||||||
replication_user: replication_user
|
replication_user: replication_user
|
||||||
replication_pass: replication_pass
|
replication_pass: replication_pass
|
||||||
dump_path: /tmp/dump.sql
|
dump_path: /tmp/dump.sql
|
||||||
|
|
|
@ -1,167 +0,0 @@
|
||||||
---
|
|
||||||
|
|
||||||
- vars:
|
|
||||||
mysql_parameters: &mysql_params
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
block:
|
|
||||||
|
|
||||||
# start replica so it is available for testing
|
|
||||||
|
|
||||||
- name: Start replica
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: startreplica
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == ["START SLAVE"] or result.queries == ["START REPLICA"]
|
|
||||||
|
|
||||||
- name: Drop {{ user_name_1 }} if exists
|
|
||||||
mysql_user:
|
|
||||||
<<: *mysql_params
|
|
||||||
name: '{{ user_name_1 }}'
|
|
||||||
host: '{{ gateway_addr }}'
|
|
||||||
state: absent
|
|
||||||
ignore_errors: yes
|
|
||||||
|
|
||||||
# First test
|
|
||||||
# check if user creation works with force_context and is replicated
|
|
||||||
- name: create user with force_context
|
|
||||||
mysql_user:
|
|
||||||
<<: *mysql_params
|
|
||||||
name: "{{ user_name_1 }}"
|
|
||||||
host: '{{ gateway_addr }}'
|
|
||||||
password: "{{ user_password_1 }}"
|
|
||||||
priv: '*.*:ALL,GRANT'
|
|
||||||
force_context: yes
|
|
||||||
|
|
||||||
- name: attempt connection on replica1 with newly created user (expect success)
|
|
||||||
mysql_replication:
|
|
||||||
mode: getprimary
|
|
||||||
login_user: '{{ user_name_1 }}'
|
|
||||||
login_password: '{{ user_password_1 }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
register: result
|
|
||||||
ignore_errors: yes
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- result is succeeded
|
|
||||||
|
|
||||||
- name: Drop user
|
|
||||||
mysql_user:
|
|
||||||
<<: *mysql_params
|
|
||||||
name: '{{ user_name_1 }}'
|
|
||||||
host: '{{ gateway_addr }}'
|
|
||||||
state: absent
|
|
||||||
force_context: yes
|
|
||||||
|
|
||||||
- name: attempt connection on replica with freshly removed user (expect failure)
|
|
||||||
mysql_replication:
|
|
||||||
mode: getprimary
|
|
||||||
login_user: '{{ user_name_1 }}'
|
|
||||||
login_password: '{{ user_password_1 }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
register: result
|
|
||||||
ignore_errors: yes
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- result is failed
|
|
||||||
|
|
||||||
# Prepare replica1 for testing with a replication filter in place
|
|
||||||
# Stop replication, create a filter and restart replication on replica1.
|
|
||||||
- name: Stop replica
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: stopreplica
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == ["STOP SLAVE"] or result.queries == ["STOP REPLICA"]
|
|
||||||
|
|
||||||
- name: Create replication filter MySQL
|
|
||||||
shell: "echo \"CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = (mysql);\" | {{ mysql_command_wo_port }} -P{{ mysql_replica1_port }}"
|
|
||||||
when: db_engine == 'mysql'
|
|
||||||
|
|
||||||
- name: Create replication filter MariaDB
|
|
||||||
shell: "echo \"SET GLOBAL replicate_ignore_db = 'mysql';\" | {{ mysql_command_wo_port }} -P{{ mysql_replica1_port }}"
|
|
||||||
when: db_engine == 'mariadb'
|
|
||||||
|
|
||||||
- name: Start replica
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: startreplica
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == ["START SLAVE"] or result.queries == ["START REPLICA"]
|
|
||||||
|
|
||||||
# Second test
|
|
||||||
# Filter in place, ready to test if user creation is filtered with force_context
|
|
||||||
- name: create user with force_context
|
|
||||||
mysql_user:
|
|
||||||
<<: *mysql_params
|
|
||||||
name: "{{ user_name_1 }}"
|
|
||||||
host: "{{ gateway_addr }}"
|
|
||||||
password: "{{ user_password_1 }}"
|
|
||||||
priv: '*.*:ALL,GRANT'
|
|
||||||
force_context: yes
|
|
||||||
|
|
||||||
- name: attempt connection on replica with newly created user (expect failure)
|
|
||||||
mysql_replication:
|
|
||||||
mode: getprimary
|
|
||||||
login_user: '{{ user_name_1 }}'
|
|
||||||
login_password: '{{ user_password_1 }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
register: result
|
|
||||||
ignore_errors: yes
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- result is failed
|
|
||||||
|
|
||||||
- name: Drop user
|
|
||||||
mysql_user:
|
|
||||||
<<: *mysql_params
|
|
||||||
name: '{{ user_name_1 }}'
|
|
||||||
host: "{{ gateway_addr }}"
|
|
||||||
state: absent
|
|
||||||
force_context: yes
|
|
||||||
|
|
||||||
# restore normal replica1 operation
|
|
||||||
# Stop replication and remove the filter
|
|
||||||
- name: Stop replica
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: stopreplica
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == ["STOP SLAVE"] or result.queries == ["STOP REPLICA"]
|
|
||||||
|
|
||||||
- name: Remove replication filter MySQL
|
|
||||||
shell: "echo \"CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB = ();\" | {{ mysql_command_wo_port }} -P{{ mysql_replica1_port }}"
|
|
||||||
when: db_engine == 'mysql'
|
|
||||||
|
|
||||||
- name: Remove replication filter MariaDB
|
|
||||||
shell: "echo \"SET GLOBAL replicate_ignore_db = '';\" | {{ mysql_command_wo_port }} -P{{ mysql_replica1_port }}"
|
|
||||||
when: db_engine == 'mariadb'
|
|
|
@ -16,6 +16,7 @@
|
||||||
block:
|
block:
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
- name: get server certificate
|
- name: get server certificate
|
||||||
copy:
|
copy:
|
||||||
content: "{{ lookup('pipe', \"openssl s_client -starttls mysql -connect localhost:3307 -showcerts 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'\") }}"
|
content: "{{ lookup('pipe', \"openssl s_client -starttls mysql -connect localhost:3307 -showcerts 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'\") }}"
|
||||||
|
@ -41,7 +42,7 @@
|
||||||
|
|
||||||
- name: attempt connection with newly created user (expect failure)
|
- name: attempt connection with newly created user (expect failure)
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
mode: getprimary
|
mode: getmaster
|
||||||
login_user: '{{ user_name_1 }}'
|
login_user: '{{ user_name_1 }}'
|
||||||
login_password: '{{ user_password_1 }}'
|
login_password: '{{ user_password_1 }}'
|
||||||
login_host: '{{ mysql_host }}'
|
login_host: '{{ mysql_host }}'
|
||||||
|
@ -64,7 +65,7 @@
|
||||||
|
|
||||||
- name: attempt connection with newly created user ignoring hostname
|
- name: attempt connection with newly created user ignoring hostname
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
mode: getprimary
|
mode: getmaster
|
||||||
login_user: '{{ user_name_1 }}'
|
login_user: '{{ user_name_1 }}'
|
||||||
login_password: '{{ user_password_1 }}'
|
login_password: '{{ user_password_1 }}'
|
||||||
login_host: '{{ mysql_host }}'
|
login_host: '{{ mysql_host }}'
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
---
|
|
||||||
|
|
||||||
- vars:
|
|
||||||
mysql_parameters: &mysql_params
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
block:
|
|
||||||
|
|
||||||
- name: Disable ssl verification
|
|
||||||
community.mysql.mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: changeprimary
|
|
||||||
primary_ssl_verify_server_cert: false
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- name: Assert that changeprimmary is changed and return expected query for MariaDB and MySQL < 8.0.23
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == expected_queries
|
|
||||||
when:
|
|
||||||
- >
|
|
||||||
db_engine == 'mariadb' or
|
|
||||||
(db_engine == 'mysql' and db_version is version('8.0.23', '<'))
|
|
||||||
vars:
|
|
||||||
expected_queries: ["CHANGE MASTER TO MASTER_SSL_VERIFY_SERVER_CERT=0"]
|
|
||||||
|
|
||||||
- name: Assert that changeprimmary is changed and return expected query for MySQL > 8.0.23
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == expected_queries
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.23', '>=')
|
|
||||||
vars:
|
|
||||||
expected_queries: ["CHANGE REPLICATION SOURCE TO SOURCE_SSL_VERIFY_SERVER_CERT=0"]
|
|
||||||
|
|
||||||
- name: Disable ssl verification for MySQL 8.0.23+
|
|
||||||
community.mysql.mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: changereplication
|
|
||||||
primary_ssl_verify_server_cert: false
|
|
||||||
register: result
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.23', '>=')
|
|
||||||
|
|
||||||
- name: Assert that changereplication is changed and return expected query for MySQL > 8.0.23
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == expected_queries
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.23', '>=')
|
|
||||||
vars:
|
|
||||||
expected_queries: ["CHANGE REPLICATION SOURCE TO SOURCE_SSL_VERIFY_SERVER_CERT=0"]
|
|
|
@ -1,37 +1,24 @@
|
||||||
---
|
|
||||||
####################################################################
|
####################################################################
|
||||||
# WARNING: These are designed specifically for Ansible tests #
|
# WARNING: These are designed specifically for Ansible tests #
|
||||||
# and should not be used as examples of how to write Ansible roles #
|
# and should not be used as examples of how to write Ansible roles #
|
||||||
####################################################################
|
####################################################################
|
||||||
|
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# 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
|
- import_tasks: mysql_replication_initial.yml
|
||||||
|
|
||||||
# Tests of replication filters and force_context
|
# Tests of master_delay parameter:
|
||||||
- include_tasks: issue-265.yml
|
- import_tasks: mysql_replication_master_delay.yml
|
||||||
|
|
||||||
# primary_ssl_verify_server_cert
|
|
||||||
# Must run before mysql add channels in mysql_replication_channel.yml
|
|
||||||
- import_tasks: issue-689.yml
|
|
||||||
|
|
||||||
# Tests of primary_delay parameter:
|
|
||||||
- import_tasks: mysql_replication_primary_delay.yml
|
|
||||||
|
|
||||||
# Tests of channel parameter:
|
# Tests of channel parameter:
|
||||||
- import_tasks: mysql_replication_channel.yml
|
- import_tasks: mysql_replication_channel.yml
|
||||||
when:
|
when:
|
||||||
- db_engine == 'mysql' # FIXME: mariadb introduces FOR CHANNEL in 10.7
|
- db_engine == 'mysql' # FIXME: mariadb introduces FOR CHANNEL in 10.7
|
||||||
|
- mysql8022_and_higher == true # FIXME: mysql 5.7 should work, but our tets fails, why?
|
||||||
|
|
||||||
# Tests of resetprimary mode:
|
# Tests of resetmaster mode:
|
||||||
- import_tasks: mysql_replication_resetprimary_mode.yml
|
- import_tasks: mysql_replication_resetmaster_mode.yml
|
||||||
|
|
||||||
- include_tasks: issue-28.yml
|
- include: issue-28.yml
|
||||||
|
|
||||||
# Tests of changereplication mode:
|
|
||||||
- import_tasks: mysql_replication_changereplication_mode.yml
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.23', '>=')
|
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
---
|
|
||||||
|
|
||||||
- vars:
|
|
||||||
mysql_params: &mysql_params
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
|
|
||||||
block:
|
|
||||||
# Get primary log file and log pos:
|
|
||||||
- name: Get primary status
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_primary_port }}'
|
|
||||||
mode: getprimary
|
|
||||||
register: mysql_primary_status
|
|
||||||
|
|
||||||
# Test changereplication mode:
|
|
||||||
- name: Run replication
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: changereplication
|
|
||||||
primary_host: '{{ mysql_host }}'
|
|
||||||
primary_port: '{{ mysql_primary_port }}'
|
|
||||||
primary_user: '{{ replication_user }}'
|
|
||||||
primary_password: '{{ replication_pass }}'
|
|
||||||
primary_log_file: '{{ mysql_primary_status.File }}'
|
|
||||||
primary_log_pos: '{{ mysql_primary_status.Position }}'
|
|
||||||
primary_ssl_ca: ''
|
|
||||||
primary_ssl: no
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- name: Assert that changereplication is changed and return expected query
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == expected_queries
|
|
||||||
vars:
|
|
||||||
expected_queries: ["CHANGE REPLICATION SOURCE TO SOURCE_HOST='{{ mysql_host }}',\
|
|
||||||
SOURCE_USER='{{ replication_user }}',SOURCE_PASSWORD='********',\
|
|
||||||
SOURCE_PORT={{ mysql_primary_port }},SOURCE_LOG_FILE=\
|
|
||||||
'{{ mysql_primary_status.File }}',SOURCE_LOG_POS=\
|
|
||||||
{{ mysql_primary_status.Position }},SOURCE_SSL=0,SOURCE_SSL_CA=''"]
|
|
||||||
|
|
||||||
# Test changereplication mode with channel:
|
|
||||||
- name: Run replication
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: changereplication
|
|
||||||
primary_user: '{{ replication_user }}'
|
|
||||||
primary_password: '{{ replication_pass }}'
|
|
||||||
channel: '{{ test_channel }}'
|
|
||||||
|
|
||||||
register: with_channel_result_queries
|
|
||||||
|
|
||||||
- name: Assert that changereplication is changed and is called correctly with channel
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
- with_channel_result_queries is changed
|
|
||||||
- with_channel_result_queries.queries == expected_queries
|
|
||||||
vars:
|
|
||||||
expected_queries: ["CHANGE REPLICATION SOURCE TO SOURCE_USER='{{ replication_user }}',\
|
|
||||||
SOURCE_PASSWORD='********' FOR CHANNEL '{{ test_channel }}'"]
|
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
- vars:
|
- vars:
|
||||||
|
@ -9,59 +9,33 @@
|
||||||
login_host: '{{ mysql_host }}'
|
login_host: '{{ mysql_host }}'
|
||||||
|
|
||||||
block:
|
block:
|
||||||
# Get primary log file and log pos:
|
# Get master log file and log pos:
|
||||||
- name: Get primary status
|
- name: Get master status
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_primary_port }}'
|
login_port: '{{ mysql_primary_port }}'
|
||||||
mode: getprimary
|
mode: getmaster
|
||||||
register: mysql_primary_status
|
register: mysql_primary_status
|
||||||
|
|
||||||
# Test changeprimary mode:
|
# Test changemaster mode:
|
||||||
- name: Run replication with channel
|
- name: Run replication with channel
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_replica2_port }}'
|
login_port: '{{ mysql_replica2_port }}'
|
||||||
mode: changeprimary
|
mode: changemaster
|
||||||
primary_host: '{{ mysql_host }}'
|
master_host: '{{ mysql_host }}'
|
||||||
primary_port: '{{ mysql_primary_port }}'
|
master_port: '{{ mysql_primary_port }}'
|
||||||
primary_user: '{{ replication_user }}'
|
master_user: '{{ replication_user }}'
|
||||||
primary_password: '{{ replication_pass }}'
|
master_password: '{{ replication_pass }}'
|
||||||
primary_log_file: '{{ mysql_primary_status.File }}'
|
master_log_file: '{{ mysql_primary_status.File }}'
|
||||||
primary_log_pos: '{{ mysql_primary_status.Position }}'
|
master_log_pos: '{{ mysql_primary_status.Position }}'
|
||||||
channel: '{{ test_channel }}'
|
channel: '{{ test_channel }}'
|
||||||
register: result
|
register: result
|
||||||
|
|
||||||
- name: Assert that run replication with channel is changed and query matches for MariaDB and MySQL < 8.0.23
|
- assert:
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.queries == result_query
|
- result.queries == ["CHANGE MASTER TO MASTER_HOST='{{ mysql_host }}',MASTER_USER='{{ replication_user }}',MASTER_PASSWORD='********',MASTER_PORT={{ mysql_primary_port }},MASTER_LOG_FILE='{{ mysql_primary_status.File }}',MASTER_LOG_POS={{ mysql_primary_status.Position }} FOR CHANNEL '{{ test_channel }}'"]
|
||||||
when:
|
|
||||||
- >
|
|
||||||
db_engine == 'mariadb' or
|
|
||||||
(db_engine == 'mysql' and db_version is version('8.0.23', '<'))
|
|
||||||
vars:
|
|
||||||
result_query: ["CHANGE MASTER TO MASTER_HOST='{{ mysql_host }}',\
|
|
||||||
MASTER_USER='{{ replication_user }}',MASTER_PASSWORD='********',\
|
|
||||||
MASTER_PORT={{ mysql_primary_port }},MASTER_LOG_FILE=\
|
|
||||||
'{{ mysql_primary_status.File }}',MASTER_LOG_POS=\
|
|
||||||
{{ mysql_primary_status.Position }} FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
|
|
||||||
- name: Assert that run replication with channel is changed and query matches for MySQL >= 8.0.23
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == result_query
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.23', '>=')
|
|
||||||
vars:
|
|
||||||
result_query: ["CHANGE REPLICATION SOURCE TO SOURCE_HOST='{{ mysql_host }}',\
|
|
||||||
SOURCE_USER='{{ replication_user }}',SOURCE_PASSWORD='********',\
|
|
||||||
SOURCE_PORT={{ mysql_primary_port }},SOURCE_LOG_FILE=\
|
|
||||||
'{{ mysql_primary_status.File }}',SOURCE_LOG_POS=\
|
|
||||||
{{ mysql_primary_status.Position }} FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
|
|
||||||
# Test startreplica mode:
|
# Test startreplica mode:
|
||||||
- name: Start replica with channel
|
- name: Start replica with channel
|
||||||
|
@ -74,11 +48,8 @@
|
||||||
|
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.queries in [result_query, result_query2]
|
- result.queries == ["START SLAVE FOR CHANNEL '{{ test_channel }}'"] or result.queries == ["START REPLICA FOR CHANNEL '{{ test_channel }}'"]
|
||||||
vars:
|
|
||||||
result_query: ["START SLAVE FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
result_query2: ["START REPLICA FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
|
|
||||||
# Test getreplica mode:
|
# Test getreplica mode:
|
||||||
- name: Get standby status with channel
|
- name: Get standby status with channel
|
||||||
|
@ -91,40 +62,27 @@
|
||||||
|
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- replica_status.Is_Replica is truthy(convert_bool=True)
|
- replica_status.Is_Slave == true
|
||||||
- replica_status.Master_Host == mysql_host_value
|
- replica_status.Master_Host == '{{ mysql_host }}'
|
||||||
- replica_status.Exec_Master_Log_Pos == mysql_primary_status.Position
|
- replica_status.Exec_Master_Log_Pos == mysql_primary_status.Position
|
||||||
- replica_status.Master_Port == mysql_primary_port_value
|
- replica_status.Master_Port == {{ mysql_primary_port }}
|
||||||
- replica_status.Last_IO_Errno == 0
|
- replica_status.Last_IO_Errno == 0
|
||||||
- replica_status.Last_IO_Error == ''
|
- replica_status.Last_IO_Error == ''
|
||||||
- replica_status.Channel_Name == test_channel_value
|
- replica_status.Channel_Name == '{{ test_channel }}'
|
||||||
- replica_status is not changed
|
- replica_status is not changed
|
||||||
vars:
|
when: mysql8022_and_higher == false
|
||||||
mysql_host_value: '{{ mysql_host }}'
|
|
||||||
mysql_primary_port_value: '{{ mysql_primary_port }}'
|
|
||||||
test_channel_value: '{{ test_channel }}'
|
|
||||||
when:
|
|
||||||
- >
|
|
||||||
db_engine == 'mariadb' or
|
|
||||||
(db_engine == 'mysql' and db_version is version('8.0.22', '<'))
|
|
||||||
|
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- replica_status.Is_Replica is truthy(convert_bool=True)
|
- replica_status.Is_Slave == true
|
||||||
- replica_status.Source_Host == mysql_host_value
|
- replica_status.Source_Host == '{{ mysql_host }}'
|
||||||
- replica_status.Exec_Source_Log_Pos == mysql_primary_status.Position
|
- replica_status.Exec_Source_Log_Pos == mysql_primary_status.Position
|
||||||
- replica_status.Source_Port == mysql_primary_port_value
|
- replica_status.Source_Port == {{ mysql_primary_port }}
|
||||||
- replica_status.Last_IO_Errno == 0
|
- replica_status.Last_IO_Errno == 0
|
||||||
- replica_status.Last_IO_Error == ''
|
- replica_status.Last_IO_Error == ''
|
||||||
- replica_status.Channel_Name == test_channel_value
|
- replica_status.Channel_Name == '{{ test_channel }}'
|
||||||
- replica_status is not changed
|
- replica_status is not changed
|
||||||
vars:
|
when: mysql8022_and_higher == true
|
||||||
mysql_host_value: '{{ mysql_host }}'
|
|
||||||
mysql_primary_port_value: '{{ mysql_primary_port }}'
|
|
||||||
test_channel_value: '{{ test_channel }}'
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.22', '>=')
|
|
||||||
|
|
||||||
|
|
||||||
# Test stopreplica mode:
|
# Test stopreplica mode:
|
||||||
|
@ -138,11 +96,8 @@
|
||||||
|
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.queries == result_query or result.queries == result_query2
|
- result.queries == ["STOP SLAVE FOR CHANNEL '{{ test_channel }}'"] or result.queries == ["STOP REPLICA FOR CHANNEL '{{ test_channel }}'"]
|
||||||
vars:
|
|
||||||
result_query: ["STOP SLAVE FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
result_query2: ["STOP REPLICA FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
|
|
||||||
# Test reset
|
# Test reset
|
||||||
- name: Reset replica with channel
|
- name: Reset replica with channel
|
||||||
|
@ -155,11 +110,8 @@
|
||||||
|
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.queries == result_query or result.queries == result_query2
|
- result.queries == ["RESET SLAVE FOR CHANNEL '{{ test_channel }}'"] or result.queries == ["RESET REPLICA FOR CHANNEL '{{ test_channel }}'"]
|
||||||
vars:
|
|
||||||
result_query: ["RESET SLAVE FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
result_query2: ["RESET REPLICA FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
|
|
||||||
# Test reset all
|
# Test reset all
|
||||||
- name: Reset replica all with channel
|
- name: Reset replica all with channel
|
||||||
|
@ -172,8 +124,5 @@
|
||||||
|
|
||||||
- assert:
|
- assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.queries == result_query or result.queries == result_query2
|
- result.queries == ["RESET SLAVE ALL FOR CHANNEL '{{ test_channel }}'"] or result.queries == ["RESET REPLICA ALL FOR CHANNEL '{{ test_channel }}'"]
|
||||||
vars:
|
|
||||||
result_query: ["RESET SLAVE ALL FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
result_query2: ["RESET REPLICA ALL FOR CHANNEL '{{ test_channel }}'"]
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
- vars:
|
- vars:
|
||||||
|
@ -9,6 +9,16 @@
|
||||||
login_host: '{{ mysql_host }}'
|
login_host: '{{ mysql_host }}'
|
||||||
|
|
||||||
block:
|
block:
|
||||||
|
- name: Set mysql8022_and_higher
|
||||||
|
set_fact:
|
||||||
|
mysql8022_and_higher: false
|
||||||
|
|
||||||
|
- name: Set mysql8022_and_higher
|
||||||
|
set_fact:
|
||||||
|
mysql8022_and_higher: true
|
||||||
|
when:
|
||||||
|
- db_engine == 'mysql'
|
||||||
|
- db_version is version('8.0.22', '>=')
|
||||||
|
|
||||||
# We use iF NOT EXISTS because the GITHUB Action:
|
# We use iF NOT EXISTS because the GITHUB Action:
|
||||||
# "ansible-community/ansible-test-gh-action" uses "--retry-on-error".
|
# "ansible-community/ansible-test-gh-action" uses "--retry-on-error".
|
||||||
|
@ -67,28 +77,27 @@
|
||||||
{{ mysql_command_wo_port }}
|
{{ mysql_command_wo_port }}
|
||||||
-P{{ mysql_replica2_port }} < {{ dump_path }}
|
-P{{ mysql_replica2_port }} < {{ dump_path }}
|
||||||
|
|
||||||
# Test getprimary mode:
|
# Test getmaster mode:
|
||||||
- name: Get primary status
|
- name: Get master status
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_primary_port }}'
|
login_port: '{{ mysql_primary_port }}'
|
||||||
mode: getprimary
|
mode: getmaster
|
||||||
register: mysql_primary_status
|
register: mysql_primary_status
|
||||||
|
|
||||||
- name: Assert that primary is in expected state
|
- name: Assert that primary is in expected state
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- mysql_primary_status.Is_Primary == true
|
- mysql_primary_status.Is_Master == true
|
||||||
- mysql_primary_status.Position != 0
|
- mysql_primary_status.Position != 0
|
||||||
- mysql_primary_status is not changed
|
- mysql_primary_status is not changed
|
||||||
|
|
||||||
# Test startreplica fails without changeprimary first. This needs fail_on_error
|
# Test startreplica fails without changemaster first. This needs fail_on_error
|
||||||
- name: Start replica and fail because primary is not specified; failing on error as requested
|
- name: Start replica (using deprecated startslave choice) and fail because master is not specified; failing on error as requested
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
login_port: '{{ mysql_replica1_port }}'
|
||||||
mode: startreplica
|
mode: startslave
|
||||||
primary_use_gtid: replica_pos
|
|
||||||
fail_on_error: yes
|
fail_on_error: yes
|
||||||
register: result
|
register: result
|
||||||
ignore_errors: yes
|
ignore_errors: yes
|
||||||
|
@ -126,54 +135,28 @@
|
||||||
that:
|
that:
|
||||||
- result is not failed
|
- result is not failed
|
||||||
|
|
||||||
# primary_ssl_ca will be set as '' to check the module's behaviour for #23976,
|
# Test changemaster mode:
|
||||||
|
# master_ssl_ca will be set as '' to check the module's behaviour for #23976,
|
||||||
# must be converted to an empty string
|
# must be converted to an empty string
|
||||||
- name: Test changeprimary mode with empty primary_ssl_ca
|
- name: Run replication
|
||||||
community.mysql.mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
login_port: '{{ mysql_replica1_port }}'
|
||||||
mode: changeprimary
|
mode: changemaster
|
||||||
primary_host: '{{ mysql_host }}'
|
master_host: '{{ mysql_host }}'
|
||||||
primary_port: '{{ mysql_primary_port }}'
|
master_port: '{{ mysql_primary_port }}'
|
||||||
primary_user: '{{ replication_user }}'
|
master_user: '{{ replication_user }}'
|
||||||
primary_password: '{{ replication_pass }}'
|
master_password: '{{ replication_pass }}'
|
||||||
primary_log_file: '{{ mysql_primary_status.File }}'
|
master_log_file: '{{ mysql_primary_status.File }}'
|
||||||
primary_log_pos: '{{ mysql_primary_status.Position }}'
|
master_log_pos: '{{ mysql_primary_status.Position }}'
|
||||||
primary_ssl_ca: ''
|
master_ssl_ca: ''
|
||||||
primary_ssl: false
|
|
||||||
register: result
|
register: result
|
||||||
|
|
||||||
- name: Assert that changeprimmary is changed and return expected query for MariaDB and MySQL < 8.0.23
|
- name: Assert that changeprimmary is changed and return expected query
|
||||||
ansible.builtin.assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.queries == expected_queries
|
- result.queries == ["CHANGE MASTER TO MASTER_HOST='{{ mysql_host }}',MASTER_USER='{{ replication_user }}',MASTER_PASSWORD='********',MASTER_PORT={{ mysql_primary_port }},MASTER_LOG_FILE='{{ mysql_primary_status.File }}',MASTER_LOG_POS={{ mysql_primary_status.Position }},MASTER_SSL_CA=''"]
|
||||||
when:
|
|
||||||
- >
|
|
||||||
db_engine == 'mariadb' or
|
|
||||||
(db_engine == 'mysql' and db_version is version('8.0.23', '<'))
|
|
||||||
vars:
|
|
||||||
expected_queries: ["CHANGE MASTER TO MASTER_HOST='{{ mysql_host }}',\
|
|
||||||
MASTER_USER='{{ replication_user }}',MASTER_PASSWORD='********',\
|
|
||||||
MASTER_PORT={{ mysql_primary_port }},MASTER_LOG_FILE=\
|
|
||||||
'{{ mysql_primary_status.File }}',MASTER_LOG_POS=\
|
|
||||||
{{ mysql_primary_status.Position }},MASTER_SSL=0,MASTER_SSL_CA=''"]
|
|
||||||
|
|
||||||
- name: Assert that changeprimmary is changed and return expected query for MySQL > 8.0.23
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == expected_queries
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.23', '>=')
|
|
||||||
vars:
|
|
||||||
expected_queries: ["CHANGE REPLICATION SOURCE TO \
|
|
||||||
SOURCE_HOST='{{ mysql_host }}',\
|
|
||||||
SOURCE_USER='{{ replication_user }}',SOURCE_PASSWORD='********',\
|
|
||||||
SOURCE_PORT={{ mysql_primary_port }},SOURCE_LOG_FILE=\
|
|
||||||
'{{ mysql_primary_status.File }}',SOURCE_LOG_POS=\
|
|
||||||
{{ mysql_primary_status.Position }},SOURCE_SSL=0,SOURCE_SSL_CA=''"]
|
|
||||||
|
|
||||||
# Test startreplica mode:
|
# Test startreplica mode:
|
||||||
- name: Start replica
|
- name: Start replica
|
||||||
|
@ -190,47 +173,36 @@
|
||||||
- result.queries == ["START SLAVE"] or result.queries == ["START REPLICA"]
|
- result.queries == ["START SLAVE"] or result.queries == ["START REPLICA"]
|
||||||
|
|
||||||
# Test getreplica mode:
|
# Test getreplica mode:
|
||||||
- name: Get replica status
|
- name: Get replica status using deprecated getslave choice
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
login_port: '{{ mysql_replica1_port }}'
|
||||||
mode: getreplica
|
mode: getslave
|
||||||
register: replica_status
|
register: replica_status
|
||||||
|
|
||||||
- name: Assert that getreplica returns expected values for MySQL older than 8.0.22 and Mariadb
|
- name: Assert that getreplica returns expected values for MySQL older than 8.0.22 and Mariadb
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- replica_status.Is_Replica is truthy(convert_bool=True)
|
- replica_status.Is_Slave == true
|
||||||
- replica_status.Master_Host == mysql_host_value
|
- replica_status.Master_Host == '{{ mysql_host }}'
|
||||||
- replica_status.Exec_Master_Log_Pos == mysql_primary_status.Position
|
- replica_status.Exec_Master_Log_Pos == mysql_primary_status.Position
|
||||||
- replica_status.Master_Port == mysql_primary_port_value
|
- replica_status.Master_Port == {{ mysql_primary_port }}
|
||||||
- replica_status.Last_IO_Errno == 0
|
- replica_status.Last_IO_Errno == 0
|
||||||
- replica_status.Last_IO_Error == ''
|
- replica_status.Last_IO_Error == ''
|
||||||
- replica_status is not changed
|
- replica_status is not changed
|
||||||
vars:
|
when: mysql8022_and_higher == false
|
||||||
mysql_host_value: "{{ mysql_host }}"
|
|
||||||
mysql_primary_port_value: "{{ mysql_primary_port }}"
|
|
||||||
when:
|
|
||||||
- >
|
|
||||||
db_engine == 'mariadb' or
|
|
||||||
(db_engine == 'mysql' and db_version is version('8.0.22', '<'))
|
|
||||||
|
|
||||||
- name: Assert that getreplica returns expected values for MySQL newer than 8.0.22
|
- name: Assert that getreplica returns expected values for MySQL newer than 8.0.22
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- replica_status.Is_Replica is truthy(convert_bool=True)
|
- replica_status.Is_Slave == true
|
||||||
- replica_status.Source_Host == mysql_host_value
|
- replica_status.Source_Host == '{{ mysql_host }}'
|
||||||
- replica_status.Exec_Source_Log_Pos == mysql_primary_status.Position
|
- replica_status.Exec_Source_Log_Pos == mysql_primary_status.Position
|
||||||
- replica_status.Source_Port == mysql_primary_port_value
|
- replica_status.Source_Port == {{ mysql_primary_port }}
|
||||||
- replica_status.Last_IO_Errno == 0
|
- replica_status.Last_IO_Errno == 0
|
||||||
- replica_status.Last_IO_Error == ''
|
- replica_status.Last_IO_Error == ''
|
||||||
- replica_status is not changed
|
- replica_status is not changed
|
||||||
vars:
|
when: mysql8022_and_higher == true
|
||||||
mysql_host_value: "{{ mysql_host }}"
|
|
||||||
mysql_primary_port_value: "{{ mysql_primary_port }}"
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.22', '>=')
|
|
||||||
|
|
||||||
# Create test table and add data to it:
|
# Create test table and add data to it:
|
||||||
- name: Create test table
|
- name: Create test table
|
||||||
|
@ -243,7 +215,7 @@
|
||||||
ansible.builtin.wait_for:
|
ansible.builtin.wait_for:
|
||||||
timeout: 2
|
timeout: 2
|
||||||
|
|
||||||
# Test primary log pos has been changed:
|
# Test master log pos has been changed:
|
||||||
- name: Get replica status
|
- name: Get replica status
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
|
@ -257,18 +229,13 @@
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- replica_status.Exec_Master_Log_Pos != mysql_primary_status.Position
|
- replica_status.Exec_Master_Log_Pos != mysql_primary_status.Position
|
||||||
when:
|
when: mysql8022_and_higher == false
|
||||||
- >
|
|
||||||
db_engine == 'mariadb' or
|
|
||||||
(db_engine == 'mysql' and db_version is version('8.0.22', '<'))
|
|
||||||
|
|
||||||
- name: Assert that getreplica Log_Pos is different for MySQL newer than 8.0.22
|
- name: Assert that getreplica Log_Pos is different for MySQL newer than 8.0.22
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- replica_status.Exec_Source_Log_Pos != mysql_primary_status.Position
|
- replica_status.Exec_Source_Log_Pos != mysql_primary_status.Position
|
||||||
when:
|
when: mysql8022_and_higher == true
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.22', '>=')
|
|
||||||
|
|
||||||
- name: Start replica that is already running
|
- name: Start replica that is already running
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
|
@ -278,21 +245,20 @@
|
||||||
fail_on_error: true
|
fail_on_error: true
|
||||||
register: result
|
register: result
|
||||||
|
|
||||||
# mysqlclient 2.0.1 and pymysql 0.10.0+ always return "changed"
|
# mysqlclient 2.0.1 always return "changed"
|
||||||
- name: Assert that startreplica is not changed
|
- name: Assert that startreplica is not changed
|
||||||
assert:
|
assert:
|
||||||
that:
|
that:
|
||||||
- result is not changed
|
- result is not changed
|
||||||
when:
|
when:
|
||||||
- connector_name == 'pymysql'
|
- connector_name == 'pymysql'
|
||||||
- connector_version is version('0.10.0', '<')
|
|
||||||
|
|
||||||
# Test stopreplica mode:
|
# Test stopreplica mode:
|
||||||
- name: Stop replica
|
- name: Stop replica using deprecated stopslave choice
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
login_port: '{{ mysql_replica1_port }}'
|
||||||
mode: stopreplica
|
mode: stopslave
|
||||||
register: result
|
register: result
|
||||||
|
|
||||||
- name: Assert that stopreplica is changed and returns expected query
|
- name: Assert that stopreplica is changed and returns expected query
|
||||||
|
@ -306,7 +272,7 @@
|
||||||
timeout: 2
|
timeout: 2
|
||||||
|
|
||||||
# Test stopreplica mode:
|
# Test stopreplica mode:
|
||||||
# mysqlclient 2.0.1 and pymysql 0.10.0+ always return "changed"
|
# mysqlclient 2.0.1 always return "changed"
|
||||||
- name: Stop replica that is no longer running
|
- name: Stop replica that is no longer running
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
|
@ -321,22 +287,3 @@
|
||||||
- result is not changed
|
- result is not changed
|
||||||
when:
|
when:
|
||||||
- connector_name == 'pymysql'
|
- connector_name == 'pymysql'
|
||||||
- connector_version is version('0.10.0', '<')
|
|
||||||
|
|
||||||
# master / slave related choices were removed in 3.0.0
|
|
||||||
# https://github.com/ansible-collections/community.mysql/pull/252
|
|
||||||
- name: Test invoking the module with unsupported choice
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: stopslave
|
|
||||||
fail_on_error: true
|
|
||||||
register: result
|
|
||||||
ignore_errors: yes
|
|
||||||
|
|
||||||
- name: Assert that stopslave returns expected error message
|
|
||||||
assert:
|
|
||||||
that:
|
|
||||||
-
|
|
||||||
"result.msg == 'value of mode must be one of: getprimary, getreplica, changeprimary, stopreplica, startreplica, resetprimary, resetreplica, resetreplicaall, changereplication, got: stopslave'"
|
|
||||||
- result is failed
|
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
|
- vars:
|
||||||
|
mysql_params: &mysql_params
|
||||||
|
login_user: '{{ mysql_user }}'
|
||||||
|
login_password: '{{ mysql_password }}'
|
||||||
|
login_host: '{{ mysql_host }}'
|
||||||
|
|
||||||
|
block:
|
||||||
|
|
||||||
|
# Test master_delay mode:
|
||||||
|
- name: Run replication
|
||||||
|
mysql_replication:
|
||||||
|
<<: *mysql_params
|
||||||
|
login_port: '{{ mysql_replica1_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 replica
|
||||||
|
mysql_replication:
|
||||||
|
<<: *mysql_params
|
||||||
|
login_port: '{{ mysql_replica1_port }}'
|
||||||
|
mode: startreplica
|
||||||
|
register: result
|
||||||
|
|
||||||
|
# Check master_delay:
|
||||||
|
- name: Get standby status
|
||||||
|
mysql_replication:
|
||||||
|
<<: *mysql_params
|
||||||
|
login_port: '{{ mysql_replica1_port }}'
|
||||||
|
mode: getreplica
|
||||||
|
register: replica_status
|
||||||
|
|
||||||
|
- assert:
|
||||||
|
that:
|
||||||
|
- replica_status.SQL_Delay == {{ test_master_delay }}
|
||||||
|
- replica_status is not changed
|
|
@ -1,59 +0,0 @@
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
||||||
|
|
||||||
- vars:
|
|
||||||
mysql_params: &mysql_params
|
|
||||||
login_user: '{{ mysql_user }}'
|
|
||||||
login_password: '{{ mysql_password }}'
|
|
||||||
login_host: '{{ mysql_host }}'
|
|
||||||
|
|
||||||
block:
|
|
||||||
|
|
||||||
# Test primary_delay mode:
|
|
||||||
- name: Run replication
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: changeprimary
|
|
||||||
primary_delay: '{{ test_primary_delay }}'
|
|
||||||
register: result
|
|
||||||
|
|
||||||
- name: Assert that run replication is changed and query match expectation for MariaDB and MySQL < 8.0.23
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == ["CHANGE MASTER TO MASTER_DELAY=60"]
|
|
||||||
when:
|
|
||||||
- >
|
|
||||||
db_engine == 'mariadb' or
|
|
||||||
(db_engine == 'mysql' and db_version is version('8.0.23', '<'))
|
|
||||||
|
|
||||||
- name: Assert that run replication is changed and query match expectation for MySQL >= 8.0.23
|
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == ["CHANGE REPLICATION SOURCE TO SOURCE_DELAY=60"]
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.0.23', '>=')
|
|
||||||
|
|
||||||
# Auxiliary step:
|
|
||||||
- name: Start replica
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: startreplica
|
|
||||||
register: result
|
|
||||||
|
|
||||||
# Check primary_delay:
|
|
||||||
- name: Get standby status
|
|
||||||
mysql_replication:
|
|
||||||
<<: *mysql_params
|
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
|
||||||
mode: getreplica
|
|
||||||
register: replica_status
|
|
||||||
|
|
||||||
- assert:
|
|
||||||
that:
|
|
||||||
- replica_status.SQL_Delay == test_primary_delay
|
|
||||||
- replica_status is not changed
|
|
|
@ -1,5 +1,4 @@
|
||||||
---
|
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <aaklychkov@mail.ru>
|
||||||
# Copyright: (c) 2019, Andrew Klychkov (@Andersson007) <andrew.a.klychkov@gmail.com>
|
|
||||||
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
||||||
|
|
||||||
- vars:
|
- vars:
|
||||||
|
@ -23,47 +22,33 @@
|
||||||
login_port: '{{ mysql_replica1_port }}'
|
login_port: '{{ mysql_replica1_port }}'
|
||||||
mode: resetreplicaall
|
mode: resetreplicaall
|
||||||
|
|
||||||
# Get primary initial status:
|
# Get master initial status:
|
||||||
- name: Get primary status
|
- name: Get master status
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_primary_port }}'
|
login_port: '{{ mysql_primary_port }}'
|
||||||
mode: getprimary
|
mode: getmaster
|
||||||
register: mysql_primary_initial_status
|
register: mysql_primary_initial_status
|
||||||
|
|
||||||
# Test resetprimary mode:
|
# Test resetmaster mode:
|
||||||
- name: Reset primary
|
- name: Reset master
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_primary_port }}'
|
login_port: '{{ mysql_primary_port }}'
|
||||||
mode: resetprimary
|
mode: resetmaster
|
||||||
register: result
|
register: result
|
||||||
|
|
||||||
- name: Assert that reset primary is changed and query matches for MariaDB and MySQL < 8.4
|
- assert:
|
||||||
ansible.builtin.assert:
|
|
||||||
that:
|
that:
|
||||||
- result is changed
|
- result is changed
|
||||||
- result.queries == ["RESET MASTER"]
|
- result.queries == ["RESET MASTER"]
|
||||||
when:
|
|
||||||
- >
|
|
||||||
db_engine == 'mariadb' or
|
|
||||||
(db_engine == 'mysql' and db_version is version('8.4.0', '<'))
|
|
||||||
|
|
||||||
- name: Assert that reset primary is changed and query matches for MySQL > 8.4
|
# Get master final status:
|
||||||
ansible.builtin.assert:
|
- name: Get master status
|
||||||
that:
|
|
||||||
- result is changed
|
|
||||||
- result.queries == ["RESET BINARY LOGS AND GTIDS"]
|
|
||||||
when:
|
|
||||||
- db_engine == 'mysql'
|
|
||||||
- db_version is version('8.4.0', '>=')
|
|
||||||
|
|
||||||
# Get primary final status:
|
|
||||||
- name: Get primary status
|
|
||||||
mysql_replication:
|
mysql_replication:
|
||||||
<<: *mysql_params
|
<<: *mysql_params
|
||||||
login_port: '{{ mysql_primary_port }}'
|
login_port: '{{ mysql_primary_port }}'
|
||||||
mode: getprimary
|
mode: getmaster
|
||||||
register: mysql_primary_final_status
|
register: mysql_primary_final_status
|
||||||
|
|
||||||
- assert:
|
- assert:
|
|
@ -1,5 +0,0 @@
|
||||||
---
|
|
||||||
mysql_user: root
|
|
||||||
mysql_password: msandbox
|
|
||||||
mysql_host: '{{ gateway_addr }}'
|
|
||||||
mysql_primary_port: 3307
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue