SaltStack执行mysql_grants.present报错但权限实际生效如何解决
问题根因
- 你的Salt 2015.8.0版本缺少MySQL操作核心依赖,从提供的Salt版本信息可以看到
mysql-python状态为未安装,依赖缺失会导致MySQL相关模块逻辑出现异常。 - Salt 2015.8.0的
mysql_grants模块和MariaDB 10.3+存在兼容性bug:老版本模块的权限校验逻辑仅适配MySQL 5.5/5.6版本,MariaDB 10.3返回的权限格式发生变化,导致模块误判授权失败,实际权限已经成功写入数据库。 - 你的State配置缺失用户创建步骤,且未显式指定
grant_option参数,老版本模块未传入该参数时会出现逻辑判断错误。
修复步骤
第一步:安装MySQL依赖
在对应minion节点执行以下命令安装Salt操作MySQL的依赖:yum install MySQL-python -y
第二步:修正State配置
修正后的完整State如下:
mybd: mysql_database.present: - connection_user: root - connection_host: localhost - connection_pass: '' - connection_unix_socket: /tmp/mysql.sock - connection_charset: utf8 # 先确保MySQL用户存在 user22_localhost: mysql_user.present: - name: user22 - host: localhost - password: '' # 若用户有密码替换为对应明文/加密密码即可 - connection_user: root - connection_host: localhost - connection_pass: '' - connection_unix_socket: /tmp/mysql.sock - connection_charset: utf8 - require: - mysql_database: mybd # 授予权限 user22_grants: mysql_grants.present: - grant: ALL PRIVILEGES - database: mybd.* - user: user22 - host: localhost - grant_option: False # 显式指定不授予GRANT权限,解决老版本模块判断bug - connection_user: root - connection_host: localhost - connection_pass: '' - connection_unix_socket: /tmp/mysql.sock - connection_charset: utf8 - require: - mysql_user: user22_localhost
临时规避方案
如果修正State后仍有误报失败的情况,可直接使用命令行模式执行授权,绕开模块兼容问题:
grant_user22: cmd.run: - name: mysql -uroot -S /tmp/mysql.sock -e "GRANT ALL PRIVILEGES ON mybd.* TO user22@localhost; FLUSH PRIVILEGES;" - unless: mysql -uroot -S /tmp/mysql.sock -e "SHOW GRANTS FOR user22@localhost" | grep "ALL PRIVILEGES ON \`mybd\`.* TO 'user22'@'localhost'"
长期建议
Salt 2015.8.0是2015年发布的历史版本,已经停止维护多年,对新的数据库、操作系统兼容性极差,建议升级到Salt 300x以上的长期支持版本,从根源避免这类兼容bug。
内容的提问来源于stack exchange,提问作者IMD-Aj
相关产品推荐
相关产品推荐

