提问者:小点点

使用可移动的mysql_user模块授予进程


我需要将特定数据库的所有特权以及进程权限授予mysql用户。

我试过很多种组合,但都不奏效:

mysql_user: priv="{{ item.name | regex_replace ('[.-]', '_') }}.*:ALL/PROCESS" login_host="{{mysql.endpoint.address}}" login_port=3306 login_user="{{mysql_root_user}}" login_password="{{mysql_root_password}}" name="{{item.user}}" password="{{item.password}}" host=% state=present

结果:“无效特权字符串:列表索引超出范围”

mysql_user: priv="{{ item.name | regex_replace ('[.-]','_') }}.*:ALL/{{ item.name | regex_replace ('[.-]','_') }}.*:PROCESS" login_host="{{mysql.endpoint.address}}" login_port=3306 login_user="{{mysql_root_user}}" login_password="{{mysql_root_password}}" name="{{item.user}}" password="{{item.password}}" host=%  state=present

结果:DB授予权限和全局权限的使用不正确

mysql_user: priv="{{ item.name | regex_replace ('[.-'_') }}.*:ALL,PROCESS" login_host="{{mysql.endpoint.address}}" login_port=3306 login_user="{{mysql_root_user}}" login_password="{{mysql_root_password}}" name="{{item.user}}" password="{{item.password}}" host=%  state=present

(摘自https://stackoverflow.com/A/50785241/123594-我感到绝望)

结果:您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以获得使用near'Process ON...

如何将进程权限授予具有可移动mysql_user的用户?


共1个答案

匿名用户

您的问题来自这样一个事实,即与您所指出的其他问题不同,您试图将授予特定数据库的进程特权,而这在MySQL中是不可能的。

一个来自MySQL命令行的示例:

mysql> GRANT PROCESS ON my_db.* TO usr;
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

发生这种情况的原因是process特权是全局特权,因此只能将其授予*.*

管理权限使用户能够管理MySQL服务器的操作。这些特权是全局的,因为它们不特定于特定的数据库。

来源:https://dev.mysql.com/doc/refman/5.7/en/priviles-provided.html

因此必须将processallgrant分开。

这仍然可以通过使用以下语法在单个任务中实现:

可以通过使用正斜杠来分隔每个特权来指定多个特权:db.table:priv/db.table:priv

来源:https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_user_module.html#parameter-priv

因此您的特权最终为:

"{{ item.name | regex_replace ('[.-]', '_') }}.*:ALL/*.*:PROCESS" 

下面是一本演示这一点的剧本:

- hosts: all
  gather_facts: no
      
  tasks:
    - mysql_user: 
        priv: >-
          {{ item.name | regex_replace ('[.-]', '_') }}.*:ALL/ 
          *.*:PROCESS 
        login_host: "{{ mysql.endpoint.address }}" 
        login_port: 3306 
        login_user: "{{ mysql_root_user }}" 
        login_password: "{{ mysql_root_password }}" 
        name: "{{ item.user }}" 
        password: "{{ item.password }}" 
        host: "%" 
        state: present
      loop: 
        - name: my.db
          user: usr
          password: pwd
      vars: 
        mysql_root_user: root
        mysql_root_password: root
        mysql:
          endpoint:
            address: mysql

其中给出了概述:

PLAY [all] **********************************************************************************************************

TASK [mysql_user] ***************************************************************************************************
changed: [localhost] => (item={'name': 'my.db', 'user': 'usr', 'password': 'pwd'})

PLAY RECAP **********************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

并具有以下特权:

mysql> show grants for usr;
+------------------------------------------------+
| Grants for usr@%                               |
+------------------------------------------------+
| GRANT PROCESS ON *.* TO `usr`@`%`              |
| GRANT ALL PRIVILEGES ON `my_db`.* TO `usr`@`%` |
+------------------------------------------------+
2 rows in set (0.00 sec)