2014-04-09 7 views
8

Esiste un modo per concedere i privilegi di amministrazione MySQL utilizzando il modulo mysql_user di Ansible (o utilizzando qualsiasi altro modulo)? Voglio impostare i privilegi SUPER, RELOAD e SHOW DATABASES per l'utente insieme ad altri privilegi specifici del database.Come concedere i privilegi di amministrazione del server MySQL (SUPER, RELOAD ...) con ansible?

seguito base di installazione funziona bene per me:

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

... si traduce in:

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

seguente configurazione continua a dire "cambiato" e dei privilegi non sono quello che ci si aspetterebbe:

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

(ripetuto) run:

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

risultati in:

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) 

Qualcuno sa come:

  1. set SUPER, RELOAD e SHOW DATABASE admin. privilegi?
  2. rendere idempotente la configurazione?

risposta

12

Dopo tutto, ho trovato l'elegante soluzione! Prima di tutto i privilegi dovrebbero essere definite da qualche parte come un elenco:

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

poi il plugin mysql_user non ha bisogno di accodamento i privilegi, è sufficiente utilizzare la stringa privilegi menzionato nel documentation nel seguente formato: mydb.*:INSERT,UPDATE/anotherdb.*:SELECT/yetanotherdb.*:ALL.

L'unico trucco è come convertire lista alla stringa:

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

Il percorso ripetibile del compito non dice cambiato più:

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

Scoperto che quando si passa l'ordine dei privilegi sono in grado di concedere l'amministratore menzionato. privilegi:

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

privilegi sono impostati come previsto:

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

anche se l'operazione non è ancora idempotente. Ogni corsa mi dà:

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

Grazie per ricordare 'append_privs' – oblalex

1

Non c'è bisogno di trucchi con elenchi, è possibile impostare più privilegi separati da una barra:

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

o più corto:

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

Questo sicuramente può essere uno dei casi d'uso, ma avevo bisogno di concedere un elenco di privilegi per alcuni database e un super-set di privilegi per qualche altro banche dati. Il tuo approccio porterebbe alla ripetizione di quei privilegi "condivisi". Anche se la tua soluzione è abbastanza buona per i casi più semplici;) Grazie per la risposta! –

Problemi correlati