在Ansible AWX中使用community.mysql.mysql_user模块遇语法错误
问题
本地Ansible环境中运行正常的MariaDB用户创建Playbook,在Ansible AWX执行时出现语法错误,报错信息如下:
"module_stdout": "Traceback (most recent call last):\r\n File \"/home/ansible/.ansible/tmp/ansible-tmp-1685691063.0199862-220-69171919718447/AnsiballZ_mysql_user.py\", line 107, in \r\n _ansiballz_main()\r\n File \"/home/ansible/.ansible/tmp/ansible-tmp-1685691063.0199862-220-69171919718447/AnsiballZ_mysql_user.py\", line 99, in _ansiballz_main\r\n invoke_module(zipped_mod, temp_path, ANSIBALLZ_PARAMS)\r\n File \"/home/ansible/.ansible/tmp/ansible-tmp-1685691063.0199862-220-69171919718447/AnsiballZ_mysql_user.py\", line 48, in invoke_module\r\n run_name='__main__', alter_sys=True)\r\n File \"/usr/lib/python3.5/runpy.py\", line 205, in run_module\r\n return _run_module_code(code, init_globals, run_name, mod_spec)\r\n File \"/usr/lib/python3.5/runpy.py\", line 96, in _run_module_code\r\n mod_name, mod_spec, pkg_name, script_name)\r\n File \"/usr/lib/python3.5/runpy.py\", line 85, in _run_code\r\n exec(code, run_globals)\r\n File \"/tmp/ansible_community.mysql.mysql_user_payload_r3e02o87/ansible_community.mysql.mysql_user_payload.zip/ansible_collections/community/mysql/plugins/modules/mysql_user.py\", line 352, in \r\n File \"\", line 969, in _find_and_load\r\n File \"\", line 958, in _find_and_load_unlocked\r\n File \"\", line 664, in _load_unlocked\r\n File \"\", line 634, in _load_backward_compatible\r\n File \"/tmp/ansible_community.mysql.mysql_user_payload_r3e02o87/ansible_community.mysql.mysql_user_payload.zip/ansible_collections/community/mysql/plugins/module_utils/mysql.py\", line 22, in \r\n File \"/usr/local/lib/python3.5/dist-packages/pymysql/__init__.py\", line 59, in \r\n from . import connections # noqa: E402\r\n File \"/usr/local/lib/python3.5/dist-packages/pymysql/connections.py\", line 206\r\n ):\r\n ^\r\nSyntaxError: invalid syntax\r\n"
对应的Playbook任务代码:
- name : Create mariadb user community.mysql.mysql_user: login_user: root login_password: \"{{ root_password }}\" name: user password: \"{{ mariadb_user_pw }}\" priv: \"*.*:PROCESS,SELECT,CREATE,CREATE TABLESPACE,INSERT\" state: present
解决方案
错误原因分析
报错指向pymysql/connections.py的语法错误,结合执行环境的Python版本(Python3.5),核心原因是新版本pymysql已不再支持Python3.5,而AWX执行节点安装的pymysql版本超出了Python3.5的兼容范围,导致语法解析失败。
具体解决步骤
降级pymysql到兼容版本
安装支持Python3.5的pymysql版本,比如pymysql<1.1.0(1.1.0及以上版本放弃了对Python3.5的支持)。可以通过以下方式实现:- 在AWX的执行环境中预安装指定版本:通过自定义执行环境镜像,在Dockerfile中添加
pip install pymysql==1.0.2 - 在Playbook开头添加任务,先安装兼容版本:
- name: Install compatible pymysql version pip: name: pymysql<1.1.0 state: present
- 在AWX的执行环境中预安装指定版本:通过自定义执行环境镜像,在Dockerfile中添加
升级执行节点Python版本(可选)
如果AWX执行节点允许升级Python,将其升级到3.6及以上版本,即可兼容最新版pymysql,从根源解决版本兼容问题。规范Playbook语法(优化项)
原任务代码中变量的转义引号\"属于冗余写法,YAML中可以直接使用双引号包裹变量,或者省略引号,修正后的代码如下:- name : Create mariadb user community.mysql.mysql_user: login_user: root login_password: "{{ root_password }}" name: user password: "{{ mariadb_user_pw }}" priv: "*.*:PROCESS,SELECT,CREATE,CREATE TABLESPACE,INSERT" state: present该优化虽不直接解决当前报错,但能避免后续潜在的语法问题。
内容的提问来源于stack exchange,提问作者Ror
相关产品推荐
相关产品推荐

