2014-04-09 21 views
8

Czy istnieje sposób udzielania uprawnień do administrowania MySQL przy użyciu modułu Ansys mysql_user (lub przy użyciu dowolnego innego modułu)? Chcę ustawić dla użytkownika uprawnienia SUPER, RELOAD i SHOW DATABASES wraz z niektórymi innymi prawami specyficznymi dla bazy danych.Jak nadać uprawnienia administratora serwera MySQL (SUPER, RELOAD ...) z ansible?

Po podstawowy konfiguracja działa dobrze dla mnie:

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

... skutkuje:

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

Po instalacji powtarza "zmienił" i przywileje nie są tym, co można się spodziewać:

- 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' 

(powtarzane) run:

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

skutkuje:

mysql> show grants for 'dbuser'@'localhost'; 
+---------------------------------------------------------------------------------------------------------------+ 
| Grants for [email protected]                     | 
+---------------------------------------------------------------------------------------------------------------+ 
| 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) 

Czy ktoś wie, w jaki sposób:

  1. ustawić SUPER, RELOAD i SHOW DATABASE administratora. przywileje?
  2. dokonać konfiguracji idempotent?

Odpowiedz

12

Mimo wszystko znalazłem eleganckie rozwiązanie! Przede wszystkim przywilejów powinny zostać zdefiniowane gdzieś jako lista:

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

następnie plugin mysql_user nie musi dołączyć przywileje, wystarczy użyć ciąg przywilejów określonych w documentation w następującym formacie: mydb.*:INSERT,UPDATE/anotherdb.*:SELECT/yetanotherdb.*:ALL.

Jedyną sztuką jest jak listy konwersji do napisu:

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

powtarzalny przebieg zadania nie mówi zmienił już:

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

Okazało się, że po zmianie kolejności uprawnień jestem w stanie przyznać wspomnianego administratora. Przywileje:

- 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' 

przywileje są ustawione zgodnie z oczekiwaniami:

mysql> show grants for 'dbuser'@'localhost'; 
+---------------------------------------------------------------------------------------------------------------------------------------+ 
| Grants for [email protected]                           | 
+---------------------------------------------------------------------------------------------------------------------------------------+ 
| 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'                 | 
+---------------------------------------------------------------------------------------------------------------------------------------+ 

choć zadanie nie jest jeszcze idempotent. Każdy bieg daje mi:

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

Dzięki za wspomnieć 'append_privs' – oblalex

1

Nie ma potrzeby sztuczek list, możesz ustawić wiele uprawnień oddzielonych ukośnikiem:

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

lub krócej:

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

To na pewno może być jednym z przypadków użycia, ale musiałem przyznać listę przywilejów dla niektórych baz danych i super zestaw przywilejów dla innych bazy danych. Twoje podejście doprowadziłoby do powtórzenia tych "wspólnych" uprawnień. Chociaż twoje rozwiązanie jest wystarczająco dobre dla prostszych przypadków;) Dziękuję za odpowiedź! –

Powiązane problemy