如何使用ansible授予MySQL服务器管理权限(SUPER,RELOAD ...)?

Ika*_*ský 8 mysql ansible

有没有办法如何使用Ansible mysql_user模块(或使用任何其他模块)授予MySQL管理权限?我想设置SUPER,RELOADSHOW DATABASES特权用户与其他一些特定的数据库PRIVS一起.

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

- name: Set user privileges
  mysql_user:
    user={{ mysql_user }}
    password={{ mysql_password }}
    state=present
    priv={{ item }}
  with_items:
    - 'somedatabase.*:ALL'
    - 'someotherdatabase.*:ALL'
Run Code Online (Sandbox Code Playgroud)

...结果是:

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

以下设置一直说"已更改",并且权限不是人们所期望的:

- 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'
Run Code Online (Sandbox Code Playgroud)

(重复)运行:

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

结果是:

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)
Run Code Online (Sandbox Code Playgroud)

有谁知道如何:

  1. SUPER,RELOADSHOW DATABASE管理.特权?
  2. 使配置幂等?

Ika*_*ský 14

毕竟找到了优雅的解决方案!首先,应该将某些权限定义为列表:

$ cat group_vars/dbservers
mysql_privileges:
  - 'somedatabase.*:ALL'
  - 'someotherdatabase.*:ALL'
  - '*.*:SUPER,RELOAD,SHOW\ DATABASES'
Run Code Online (Sandbox Code Playgroud)

然后mysql_user插件不需要附加权限,只需使用文档中提到的权限字符串,格式如下:mydb.*:INSERT,UPDATE/anotherdb.*:SELECT/yetanotherdb.*:ALL.

唯一的技巧是如何将列表转换为字符串:

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

任务的可重复运行不再说改变了:

TASK: [db | Set user privileges]
**********************************************
ok: [dbuser]
Run Code Online (Sandbox Code Playgroud)


Ika*_*ský 8

发现当切换我能够授予管理员权限的权限时.特权:

- name: Set user privileges
  mysql_user:
    user={{ mysql_user }}
    password={{ mysql_password }}
    state=present
    append_privs=yes
    priv={{ item }}
  with_items:
    - 'somedatabase.*:ALL'
    - 'someotherdatabase.*:ALL'
    - '*.*:SUPER,RELOAD,SHOW\ DATABASES'
Run Code Online (Sandbox Code Playgroud)

权限按预期设置:

mysql> show grants for 'dbuser'@'localhost';
+---------------------------------------------------------------------------------------------------------------------------------------+
| Grants for dbuser@localhost                                                                                                           |
+---------------------------------------------------------------------------------------------------------------------------------------+
| GRANT RELOAD, SHOW DATABASES, SUPER ON *.* TO 'dbuser'@'localhost' IDENTIFIED BY PASSWORD '*2046D2DDAE359F311435E8B4D3776EFE13FB584C' |
| GRANT ALL PRIVILEGES ON `somedatabase`.* TO 'dbuser'@'localhost'                                                                      |
| GRANT ALL PRIVILEGES ON `someotherdatabase`.* TO 'dbuser'@'localhost'                                                                 |
+---------------------------------------------------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

虽然任务仍然不是幂等的.每次跑步都给了我:

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


Zol*_*tán 5

不需要使用列表技巧,您可以设置多个权限,并用斜杠分隔:

- name: Set user privileges
  mysql_user:
    user: {{ mysql_user }}
    password: {{ mysql_password }}
    state: present
    priv: 'somedatabase.*:ALL/someotherdatabase.*:ALL/*.*:SUPER,RELOAD,SHOW DATABASES'
Run Code Online (Sandbox Code Playgroud)

或更短:

- name: Set user privileges
  mysql_user: user={{ mysql_user }} 
  password={{ mysql_password }} 
  state=present
   priv='somedatabase.*:ALL/someotherdatabase.*:ALL/*.*:SUPER,RELOAD,SHOW DATABASES'
Run Code Online (Sandbox Code Playgroud)

  • 这绝对可以是用例之一,但我需要授予某些数据库的权限列表以及其他一些数据库的权限超集。您的方法将导致重复这些“共享”特权。尽管您的解决方案对于更简单的情况来说已经足够好了;)感谢您的回答! (2认同)