Ansible: come modificare la password di root del server MySQL eseguendo nuovamente il provisioning del server


14

Ho eseguito il provisioning del mio server con Playbook Ansible. Ho usato il playbook root / bedrock-Ansible .

Una delle attività era quella di configurare il server mysql insieme alla password dell'utente root di mysql.

Ora devo urgentemente cambiare questa password. I passi che ho preso:

  1. Ho aggiornato le variabili per i ruoli Ansible
  2. Ho eseguito il comando ansible-playbook -i hosts/staging server.ymlper riprovisionare il server

Tutte le attività sono state eseguite come previsto (nessuna modifica), ma lo script non è riuscito [mariadb | Set root user password]con questo messaggio:

msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials

La mia ipotesi è che una volta impostata la password di root di MySQL, il riprovisioning del server non può cambiare questa password.

È possibile cambiare la password di root di MySQL eseguendo nuovamente il provisioning del server con Ansible? Quali sono le mie opzioni?

Risposte:


15

Il problema che hai è che Ansible sta provando a usare la stessa password di root per accedere come vuoi cambiarla in:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_root_password }}"
              state=present

Ovviamente questo non funzionerà mai se vuoi usare questo gioco per cambiarlo.

Invece dovresti cambiare il gioco sopra per essere qualcosa di simile:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_old_root_password }}"
              state=present

E quindi aggiorna i file di inventario pertinenti per aggiungere questa nuova variabile.

Quindi group_vars/productionora dovresti contenere:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

Sembra che questo playbook utilizzi la password di root sia nel roles/mariadb/tasks/main.ymlplaybook che roles/wordpress-setup/tasks/database.ymlquindi potresti voler eseguire l'intero server.ymlplaybook per assicurarti che sia impostato correttamente.


Grazie mille per un'ottima risposta. Questa è sicuramente la strada da percorrere. Ho finito per ripristinare la password di root nella console con mysqladmin- ma questo era prima che vedessi la tua risposta
luqo33

7

È possibile utilizzare in modo improprio ~ / .my.cnf per essere in grado di modificare la password mysql-root.

Il trucco è avere un'attività "Imposta password di root" (n. 1), che imposterà la password. Successivamente, hai un'attività che crea un ~ / .my.cnf con le credenziali corrette (nr.2).

Su un nuovo sistema, ~ / .my.cnf non è presente. L'attività n. 1 creerà mysql-root-user con le credenziali fornite. Su un sistema attuale, le credenziali da ~ / .my.cnf vengono utilizzate per accedere e impostare la password su mysql_root_password . L'attività n. 2 creerà ~ / .my.cnf o sovrascriverà le vecchie credenziali esistenti ~ / .my.cnf con nuove.

Il grande vantaggio di questo approccio è avere solo una variabile "mysql_root_password", che è sempre quella corretta dal punto di vista di un playbook. Nel presente sistema (i), ~ / .my.cnf è un tipo di archiviazione per le credenziali mysql locali correnti.

- name: Set root user password
  # If .my.cnf already exists, this will cause an mysql-root-password update.
  mysql_user:
    name: root
    password: "{{ mysql_root_password}}"
    check_implicit_admin: true

- name: Create .my.cnf
  template:
   src: "client.my.cnf.j2"
   dest: "/root/.my.cnf"
   owner: root
   group: root
   mode: 0600

con client.my.cnf.j2:

[client]
user=root
password={{ mysql_root_password }}

Ulteriori letture

Note rilevanti dalla documentazione di ansible-mysql_user_module :

  • Nota 1:

    Per proteggere questo utente come parte di un playbook idempotente, è necessario creare almeno due attività: la prima deve cambiare la password dell'utente root, senza fornire dettagli login_user / login_password. Il secondo deve rilasciare un file ~ / .my.cnf contenente le nuove credenziali di root. Le successive esecuzioni del playbook avranno esito positivo leggendo le nuove credenziali dal file. ansible-mysql_user_module, note

  • Nota 2:

    Sia login_password che login_user sono richiesti quando si passano le credenziali. Se non sono presenti, il modulo tenterà di leggere le credenziali da ~ / .my.cnf e infine tornerà a utilizzare il login predefinito MySQL di 'root' senza password. ansible-mysql_user_module, note


Mi piace molto questo approccio ed è molto meglio della versione nella mia risposta. Probabilmente dovrebbe essere la risposta accettata.
ydaetskcoR,

2
Questo è utile, ma su molti sistemi in realtà ci sono 4 utenti 'root' creati, con Hosts 127.0.0.1, localhost, :: 1 e qualunque sia il nome host locale. Quanto sopra modifica solo root @ localhost, lasciando altri tre account root con password vuote.
robo,

Elencare tutti gli utenti root: mysql --database mysql --execute "select host from user where user = 'root';". Questo post ha lo stesso significato di questa risposta ma ha un codice per impostare tutte le password.
hlovdal,

2

Per la prossima persona che viene in cerca di risposte da queste parti. Mentre la risposta accettata è vera, devi essere molto diligente se stai usando MySQL 5.7 perché non è consentito l'accesso anonimo in mysqld in modalità demone (servizio). Invece DEVI grattare il file /var/log/mysqld.log per una password TEMPORANEA che qualcuno ha deciso di creare e usare su login_password = ydaetskcoR. Questa era una caratteristica che hanno deciso di implementare sulla versione 5.7 del repository dev quindi se si desidera evitarlo utilizzare una versione precedente (5.6).

Documentazione qui: https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_initialize-insecure

http://mysqlserverteam.com/initialize-your-mysql-5-7-instances-with-ease/


1

Esiste un playbook Ansible utilizzato per rafforzare MySQL.

https://github.com/dev-sec/ansible-mysql-hardening

Questo non solo ha modificato la password di root, ma esegue anche alcuni passaggi aggiuntivi per rafforzare il server.

Dai un'occhiata al file Leggimi.


Non sembra che gestisca la modifica della password di root quando è vuota.
flickerfly,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.