From 930a5a5d4983137333698a86ba8f2b2e9cca1274 Mon Sep 17 00:00:00 2001 From: Andrew Klychkov Date: Tue, 24 Jan 2023 14:53:29 +0100 Subject: [PATCH 1/2] mysql_user: add session_vars argument (#489) * mysql_user: add session_vars argument * Update tests/integration/targets/test_mysql_user/tasks/main.yml Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com> Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com> --- .../fragments/0_mysql_user_session_vars.yml | 2 ++ plugins/module_utils/mysql.py | 12 +++++++++++ plugins/modules/mysql_user.py | 21 ++++++++++++++++++- .../targets/test_mysql_user/tasks/main.yml | 20 ++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 changelogs/fragments/0_mysql_user_session_vars.yml diff --git a/changelogs/fragments/0_mysql_user_session_vars.yml b/changelogs/fragments/0_mysql_user_session_vars.yml new file mode 100644 index 0000000..55bcd6c --- /dev/null +++ b/changelogs/fragments/0_mysql_user_session_vars.yml @@ -0,0 +1,2 @@ +minor_changes: +- 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). diff --git a/plugins/module_utils/mysql.py b/plugins/module_utils/mysql.py index d256599..18e34e0 100644 --- a/plugins/module_utils/mysql.py +++ b/plugins/module_utils/mysql.py @@ -34,6 +34,8 @@ mysql_driver_fail_msg = ('A MySQL module is required: for Python 2.7 either PyMy 'Consider setting ansible_python_interpreter to use ' 'the intended Python version.') +from ansible_collections.community.mysql.plugins.module_utils.database import mysql_quote_identifier + def parse_from_mysql_config_file(cnf): # Default values of comment_prefix is '#' and ';'. @@ -149,3 +151,13 @@ def get_server_version(cursor): version_str = result[0] return version_str + + +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)) diff --git a/plugins/modules/mysql_user.py b/plugins/modules/mysql_user.py index bd488b0..e1808c8 100644 --- a/plugins/modules/mysql_user.py +++ b/plugins/modules/mysql_user.py @@ -149,6 +149,12 @@ options: - Used when I(state=present), ignored otherwise. type: dict version_added: '0.1.0' + session_vars: + description: + - "Dictionary of session variables in form of C(variable: value) to set at the beginning of module execution." + - Cannot be used to set global variables, use the M(community.mysql.mysql_variables) module instead. + type: dict + version_added: '3.6.0' notes: - "MySQL server installs with default I(login_user) of C(root) and no password. @@ -208,12 +214,15 @@ EXAMPLES = r''' priv: '*.*:ALL' state: present +# Set session var wsrep_on=off before creating the user - name: Create database user with password and all database privileges and 'WITH GRANT OPTION' community.mysql.mysql_user: name: bob password: 12345 priv: '*.*:ALL,GRANT' state: present + session_vars: + wsrep_on: off - name: Create user with password, all database privileges and 'WITH GRANT OPTION' in db1 and db2 community.mysql.mysql_user: @@ -341,7 +350,11 @@ RETURN = '''#''' from ansible.module_utils.basic import AnsibleModule from ansible_collections.community.mysql.plugins.module_utils.database import SQLParseError 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, + set_session_vars, ) from ansible_collections.community.mysql.plugins.module_utils.user import ( convert_priv_dict_to_str, @@ -385,6 +398,7 @@ def main(): plugin_auth_string=dict(default=None, type='str'), resource_limits=dict(type='dict'), force_context=dict(type='bool', default=False), + session_vars=dict(type='dict'), ) module = AnsibleModule( argument_spec=argument_spec, @@ -419,6 +433,8 @@ def main(): plugin_hash_string = module.params["plugin_hash_string"] plugin_auth_string = module.params["plugin_auth_string"] resource_limits = module.params["resource_limits"] + session_vars = module.params["session_vars"] + if priv and not isinstance(priv, (str, dict)): module.fail_json(msg="priv parameter must be str or dict but %s was passed" % type(priv)) @@ -447,6 +463,9 @@ def main(): if not sql_log_bin: cursor.execute("SET SQL_LOG_BIN=0;") + if session_vars: + set_session_vars(module, cursor, session_vars) + get_impl(cursor) if priv is not None: diff --git a/tests/integration/targets/test_mysql_user/tasks/main.yml b/tests/integration/targets/test_mysql_user/tasks/main.yml index ef21c55..d829322 100644 --- a/tests/integration/targets/test_mysql_user/tasks/main.yml +++ b/tests/integration/targets/test_mysql_user/tasks/main.yml @@ -62,6 +62,8 @@ name: '{{user_name_1}}' password: '{{user_password_1}}' state: present + session_vars: + sort_buffer_size: 1024 register: result - name: assert output message mysql user was not created @@ -69,6 +71,24 @@ that: - result is not changed + # Try to set wrong session variable, must fail + - name: create mysql user trying to set global variable which is forbidden + mysql_user: + <<: *mysql_params + name: '{{user_name_1}}' + password: '{{user_password_1}}' + state: present + session_vars: + max_connections: 1000 + register: result + ignore_errors: true + + - name: we cannot set a global variable + assert: + that: + - result is failed + - result.msg is search('is a GLOBAL variable') + # ============================================================ # remove mysql user and verify user is removed from mysql database # From 00fa058a18c82e395a1064e7fd7f41d0dc259fdd Mon Sep 17 00:00:00 2001 From: "Jorge Rodriguez (A.K.A. Tiriel)" Date: Tue, 24 Jan 2023 19:12:35 +0200 Subject: [PATCH 2/2] 491-CI-fix-tarball-download (#491) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix mariadb test setup * Update mysql src URL * Add changelog fragment * Update 491_fix_download_url.yaml Sanity test failed because minor_changes in not an element of a list. * Fix casing Co-authored-by: Laurent Indermühle --- .github/workflows/ansible-test-plugins.yml | 16 ++++++---------- changelogs/fragments/491_fix_download_url.yaml | 3 +++ .../targets/setup_mysql/vars/main.yml | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) create mode 100644 changelogs/fragments/491_fix_download_url.yaml diff --git a/.github/workflows/ansible-test-plugins.yml b/.github/workflows/ansible-test-plugins.yml index 27c657f..ea6ae8e 100644 --- a/.github/workflows/ansible-test-plugins.yml +++ b/.github/workflows/ansible-test-plugins.yml @@ -47,8 +47,6 @@ jobs: - mysql_5.7.31 - mysql_8.0.22 - mariadb_10.3.34 - # When adding later versions below, - # also change the "Set MariaDB URL sub dir" task - mariadb_10.8.3 ansible: - stable-2.12 @@ -99,14 +97,12 @@ jobs: DB_ENGINE_PRETTY=$([[ "${DB_ENGINE}" == 'mysql' ]] && echo 'MySQL' || echo 'MariaDB'); >&2 echo Matrix factor for the DB is ${{ matrix.db_engine_version }}...; >&2 echo Setting ${DB_ENGINE_PRETTY} version to ${DB_VERSION}...; - sed -i -e "s/^${DB_ENGINE}_version:.*/${DB_ENGINE}_version: $DB_VERSION/g" -e 's/^mariadb_install: false/mariadb_install: true/g' '${{ env.mysql_version_file }}'; - ${{ - matrix.db_engine_version == 'mariadb_10.8.3' - && format( - '>&2 echo Set MariaDB v10.8.3 URL sub dir...; sed -i -e "s/^mariadb_url_subdir:.*/mariadb_url_subdir: linux-systemd/g" "{0}";', env.connector_version_file - ) - || '' - }} + sed -i -e "s/^${DB_ENGINE}_version:.*/${DB_ENGINE}_version: $DB_VERSION/g" '${{ env.mysql_version_file }}'; + if [[ ${{ matrix.db_engine_version }} == mariadb* ]]; + then + echo Set MariaDB install flag...; sed -i -e "s/^mariadb_install: false/mariadb_install: true/g" '${{ env.mysql_version_file }}'; + echo Set MariaDB v10.8.3 URL sub dir...; sed -i -e "s/^mariadb_url_subdir:.*/mariadb_url_subdir: linux-systemd/g" '${{ env.connector_version_file }}'; + fi; >&2 echo Setting Connector version to ${{ matrix.connector }}...; sed -i 's/^python_packages:.*/python_packages: [${{ matrix.connector }}]/' ${{ env.connector_version_file }} target-python-version: ${{ matrix.python }} diff --git a/changelogs/fragments/491_fix_download_url.yaml b/changelogs/fragments/491_fix_download_url.yaml new file mode 100644 index 0000000..27628bb --- /dev/null +++ b/changelogs/fragments/491_fix_download_url.yaml @@ -0,0 +1,3 @@ +--- +minor_changes: + - setup_mysql - update MySQL tarball URL (https://github.com/ansible-collections/community.mysql/pull/491). diff --git a/tests/integration/targets/setup_mysql/vars/main.yml b/tests/integration/targets/setup_mysql/vars/main.yml index 4aa52a2..8fbcd90 100644 --- a/tests/integration/targets/setup_mysql/vars/main.yml +++ b/tests/integration/targets/setup_mysql/vars/main.yml @@ -24,7 +24,7 @@ install_python_prereqs: - build-essential mysql_tarball: "mysql-{{ mysql_version }}-linux-glibc2.12-x86_64.tar.{{ mysql_compression_extension }}" -mysql_src: "https://dev.mysql.com/get/Downloads/MySQL-{{ mysql_major_version }}/{{ mysql_tarball }}" +mysql_src: "https://cdn.mysql.com/archives/mysql-{{ mysql_major_version }}/{{ mysql_tarball }}" mariadb_url_subdir: "linux" mariadb_tarball: "mariadb-{{ mariadb_version }}-{{ mariadb_url_subdir }}-x86_64.tar.gz" mariadb_src: "https://downloads.mariadb.com/MariaDB/mariadb-{{ mariadb_version }}/bintar-{{ mariadb_url_subdir }}-x86_64/{{ mariadb_tarball }}"