Ansible mysql_variables模块无法获取WSREP变量的解决方法问询
Ansible获取MySQL WSREP状态变量的可行方案
问题背景
使用Ansible的mysql_variables模块尝试获取WSREP相关状态变量(如wsrep_ready)时失败,报错信息:
FAILED! => {"changed": false, "msg": "Variable not available \"wsrep_ready\""}
但该模块能正常获取普通系统变量(如wait_timeout),且直接在MySQL客户端执行show global status like 'wsrep_ready'可正常返回结果。
原因分析
mysql_variables模块仅针对MySQL的系统变量(对应SHOW VARIABLES语句),而WSREP的wsrep_ready属于全局状态变量(对应SHOW GLOBAL STATUS语句),因此该模块无法识别这类变量。
可行解决方案
方案1:使用mysql_query模块直接执行SQL查询
通过mysql_query模块执行状态变量查询语句,直接获取结果:
- name: 查询wsrep_ready全局状态变量 mysql_query: login_user: '{{ mysql_root_user }}' login_password: '{{ mysql_root_pwd }}' query: "SHOW GLOBAL STATUS LIKE 'wsrep_ready'" register: wsrep_ready_result become_user: mysql - name: 输出wsrep_ready的值 debug: msg: "wsrep_ready: {{ wsrep_ready_result.query_result[0].Value }}"
执行后可从wsrep_ready_result.query_result中提取对应字段的值。
方案2:通过command模块调用MySQL客户端
直接使用命令行执行查询,解析输出结果:
- name: 通过命令行获取wsrep_ready command: mysql -u{{ mysql_root_user }} -p{{ mysql_root_pwd }} -e "SHOW GLOBAL STATUS LIKE 'wsrep_ready'" -N register: wsrep_ready_cmd become_user: mysql no_log: true # 避免密码泄露到日志中 - name: 解析结果并设置变量 set_fact: wsrep_ready_value: "{{ wsrep_ready_cmd.stdout.split()[1] }}" - name: 显示wsrep_ready的值 debug: msg: "wsrep_ready: {{ wsrep_ready_value }}"
参数说明:
-N:关闭表头输出,简化结果解析no_log: true:防止包含密码的命令被记录到Ansible日志
内容的提问来源于stack exchange,提问作者Srikanth Lingala
相关产品推荐
相关产品推荐

