提问者:小点点

如何用Ansible授予MySQL服务器管理权限(超级、重新加载……)?


是否有一种方法可以使用可移动的mysql_user模块(或使用任何其他模块)授予MySQL管理权限?我想为用户设置superreloadshow databases特权以及一些其他特定于数据库的特权。

以下基本设置对我很有效:

- name: Set user privileges
  mysql_user:
    user={{ mysql_user }}
    password={{ mysql_password }}
    state=present
    priv={{ item }}
  with_items:
    - 'somedatabase.*:ALL'
    - 'someotherdatabase.*:ALL'

...结果如下:

TASK: [db | Set user privileges]
**********************************************
ok: [dbuser] => (item=somedatabase.*:ALL)
ok: [dbuser] => (item=someotherdatabase.*:ALL)

下面的设置一直说“已更改”,而特权并不是你所期望的:

- name: Set user privileges
  mysql_user:
    user={{ mysql_user }}
    password={{ mysql_password }}
    state=present
    priv={{ item }}
  with_items:
    - '*.*:SUPER,RELOAD,SHOW\ DATABASES'
    - 'somedatabase.*:ALL'
    - 'someotherdatabase.*:ALL'

(重复)运行:

TASK: [db | Set user privileges]
**********************************************
changed: [dbuser] => (item=*.*:SUPER,RELOAD,SHOW\ DATABASES)
changed: [dbuser] => (item=somedatabase.*:ALL)
ok: [dbuser] => (item=someotherdatabase.*:ALL)

结果如下:

mysql> show grants for 'dbuser'@'localhost';
+---------------------------------------------------------------------------------------------------------------+
| Grants for dbuser@localhost                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dbuser'@'localhost' IDENTIFIED BY PASSWORD '*2046D2DDAE359F311435E8B4D3776EFE13FB584C' |
| GRANT ALL PRIVILEGES ON `somedatabase`.* TO 'dbuser'@'localhost'                                              |
| GRANT ALL PRIVILEGES ON `someotherdatabase`.* TO 'dbuser'@'localhost'                                         |
+---------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

有没有人知道如何:

  1. 设置超级重新加载显示数据库管理。特权?
  2. 使配置幂等?

共1个答案

匿名用户

终于找到了优雅的解决方案!首先,特权应该定义为一个列表:

$ cat group_vars/dbservers
mysql_privileges:
  - 'somedatabase.*:ALL'
  - 'someotherdatabase.*:ALL'
  - '*.*:SUPER,RELOAD,SHOW\ DATABASES'

mysql_user插件不需要附加特权,只需使用文档中提到的特权字符串,格式如下:mydb.*:insert,update/anotherdb.*:select/yetanotherdb.*:all

唯一的诀窍是如何将list转换为字符串:

- name: Set user privileges
  mysql_user:
    user={{ mysql_user }}
    password={{ mysql_password }}
    state=present
    priv={{ mysql_privileges|join('/') }}

任务的可重复运行不再显示已更改:

TASK: [db | Set user privileges]
**********************************************
ok: [dbuser]