【问题标题】:GRANT PROCESS with Ansible mysql_user module使用 Ansible mysql_user 模块授予过程
【发布时间】:2020-12-07 21:08:31
【问题描述】:

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

我尝试了很多组合,但都不起作用:

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 GRANT 和 GLOBAL PRIVILEGES 使用不正确

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 服务器版本相对应的手册,以获取在“PROCESS ON ...”附近使用的正确语法。

如何向具有 Ansible mysql_user 的用户授予 PROCESS 权限?

【问题讨论】:

  • @NRE 我对“ALL,GRANT”感到困惑? GRANT 和 PROCESS 一样吗?我希望能够从此用户访问 information_schema 表。

标签: mysql ansible


【解决方案1】:

您的问题来自这样一个事实,即与 the other question your are pointing at 不同,您正试图 GRANT 对特定数据库使用 PROCESS 特权,而这在 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/privileges-provided.html

因此,您必须将GRANTPROCESSALL 分开。


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

可以通过使用正斜杠分隔每个权限来指定多个权限: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)

【讨论】:

    【解决方案2】:

    看起来还不错,但帮助你和调试你的变量并不容易。

    这是我必须创建的 MySQL 用户:

      mysql_user:
        name: "{{ db_user }}"
        host: "{{ item }}"
        login_password: "{{ rootpw }}"
        login_unix_socket: /var/lib/mysql/mysql.sock
        login_user: root
        password: "{{ db_pwd }}"
        priv: '{{ db_name }}.*:ALL,GRANT'
        state: present
    

    【讨论】:

    • 我对“ALL,GRANT”感到困惑? GRANT 和 PROCESS 一样吗?我希望能够从此用户访问 information_schema 表。
    • 不,GRANT 是为了授权用户使用 GRANT 并更改用户/数据库的权限。但是您只需要按过程更改 GRANT。这是语法的一个例子
    • 但最后,PROCESS 是 'ALL PRIVILEGES' 的一部分 所以对你来说:priv: '{{ db_name }}.*:ALL',无需添加 PROCESS
    • 我不这么认为,目前我得到:mysql> SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM information_schema.innodb_lock_waits w INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;错误 1227 (42000):访问被拒绝;您需要(至少其中一项)PROCESS 权限用于此
    • 这是适用于 MySQL 5.7 的 AWS Aurora,但我不认为这会影响它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多