我需要将特定数据库的所有特权以及进程权限授予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的用户?
您的问题来自这样一个事实,即与您所指出的其他问题不同,您试图将授予
特定数据库的进程
特权,而这在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
因此必须将process
和all
的grant
分开。
这仍然可以通过使用以下语法在单个任务中实现:
可以通过使用正斜杠来分隔每个特权来指定多个特权: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)