Ansible: Cara mengubah kata sandi root server MySQL dengan menyediakan kembali server

14

Saya telah menyediakan server saya dengan buku pedoman yang dimungkinkan. Saya telah menggunakan buku pedoman root / bedrock-Ansible .

Salah satu tugasnya adalah mengatur server mysql bersama dengan kata sandi pengguna root mysql.

Sekarang saya sangat perlu mengubah kata sandi ini. Langkah-langkah yang saya ambil:

  1. Saya memperbarui variabel untuk peran yang memungkinkan
  2. Saya menjalankan perintah ansible-playbook -i hosts/staging server.ymluntuk reprovision server

Semua tugas dieksekusi seperti yang diharapkan (tidak ada perubahan), tetapi skrip gagal [mariadb | Set root user password]dengan pesan ini:

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

Dugaan saya adalah bahwa setelah kata sandi root MySQL telah ditetapkan, penyediaan kembali server tidak dapat mengubah kata sandi ini.

Apakah mungkin untuk mengubah kata sandi root MySQL dengan menyediakan kembali server dengan Ansible? Apa pilihan saya?

luqo33
sumber

Jawaban:

15

Masalah yang Anda miliki adalah bahwa Ansible mencoba menggunakan kata sandi root yang sama untuk login seperti yang Anda ingin ubah menjadi:

- 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

Jelas ini tidak akan berhasil jika Anda ingin menggunakan permainan ini untuk mengubahnya.

Alih-alih, Anda harus mengubah permainan di atas menjadi sesuatu seperti:

- 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

Dan kemudian perbarui file inventaris yang relevan untuk menambahkan variabel baru ini.

Jadi group_vars/productionsekarang Anda harus mengandung:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

Sepertinya playbook ini menggunakan kata sandi root di kedua roles/mariadb/tasks/main.ymlplaybook dan juga roles/wordpress-setup/tasks/database.ymljadi Anda mungkin ingin menjalankan seluruh server.ymlplaybook untuk memastikan ini diatur dengan benar.

ydaetskcoR
sumber
Terima kasih banyak atas jawaban yang bagus. Ini jelas cara untuk pergi. Saya akhirnya mengatur ulang kata sandi root di konsol dengan mysqladmin- tapi ini sebelum saya melihat jawaban Anda
luqo33
7

Anda dapat menyalahgunakan ~ / .my.cnf karena dapat mengubah kata sandi mysql-root.

Caranya adalah dengan memiliki tugas "Setel kata sandi root" (nr.1), yang akan mengatur kata sandi. Setelah itu, Anda memiliki tugas, yang menciptakan ~ / .my.cnf dengan kredensial yang benar (nr.2).

Pada sistem baru, ~ / .my.cnf tidak ada. Tugas nr.1 akan membuat pengguna mysql-root-dengan kredensial yang diberikan. Pada sistem yang sekarang, kredensial dari ~ / .my.cnf digunakan untuk login dan mengatur kata sandi ke mysql_root_password . Tugas nr.2 akan membuat ~ / .my.cnf , atau menghapus kredensial lama yang ada ~ / .my.cnf dengan yang baru.

Keuntungan besar dari pendekatan ini adalah hanya memiliki satu variabel "mysql_root_password", yang selalu yang benar dari sudut pandang buku pedoman. Pada sistem yang sekarang, ~ / .my.cnf adalah jenis penyimpanan untuk kredensial mysql lokal saat ini.

- 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

dengan client.my.cnf.j2:

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

Bacaan lebih lanjut

Catatan yang relevan dari dokumentasi-mysql_user_module yang mungkin :

  • Catatan 1:

    Untuk mengamankan pengguna ini sebagai bagian dari buku pedoman idempoten, Anda harus membuat setidaknya dua tugas: yang pertama harus mengubah kata sandi pengguna root, tanpa memberikan detail login_user / login_password. Yang kedua harus menghapus file ~ / .my.cnf yang berisi kredensial root baru. Selanjutnya, playbook akan berhasil dengan membaca kredensial baru dari file tersebut. ansible-mysql_user_module, catatan

  • Catatan 2:

    Login_password dan login_user diperlukan saat Anda memberikan kredensial. Jika tidak ada, modul akan mencoba membaca kredensial dari ~ / .my.cnf, dan akhirnya kembali menggunakan login default MySQL dari 'root' tanpa kata sandi. ansible-mysql_user_module, catatan

Markus Schulte
sumber
Saya sangat menyukai pendekatan ini dan itu jauh lebih baik daripada versi dalam jawaban saya. Mungkin itu seharusnya jawaban yang diterima.
ydaetskcoR
2
Ini berguna, tetapi pada banyak sistem sebenarnya ada 4 pengguna 'root' yang dibuat, dengan Hosts 127.0.0.1, localhost, :: 1, dan apa pun nama host lokalnya. Di atas hanya memodifikasi root @ localhost, meninggalkan tiga akun root lainnya dengan kata sandi kosong.
Robo
Daftar semua pengguna root: mysql --database mysql --execute "select host from user where user = 'root';". Posting ini melakukan hal yang sama dengan jawaban ini tetapi memiliki kode untuk mengatur semua kata sandi.
hlovdal
2

Untuk orang berikutnya yang datang mencari jawaban di sekitar sini. Meskipun jawaban yang diterima benar, Anda harus rajin ekstra jika Anda menggunakan MySQL 5.7 karena tidak ada login anonim diizinkan di mysqld dalam mode daemonized (layanan). Alih-alih, Anda HARUS mengikis /var/log/mysqld.log untuk kata sandi TEMPORARY yang diputuskan seseorang untuk dibuat dan digunakan pada login_password = ydaetskcoR. Ini adalah fitur yang mereka putuskan untuk diterapkan pada versi 5.7 dari repositori dev jadi jika Anda ingin menghindarinya gunakan versi yang lebih lama (5.6).

Dokumentasi di sini: https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_initialize-insecure

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

Einarc
sumber
1

Ada buku pedoman Ansible yang digunakan untuk pengerasan MySQL.

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

Ini tidak hanya mengubah kata sandi root, tetapi juga melakukan beberapa langkah tambahan untuk mengeraskan server.

Lihatlah file readme.

ww12z
sumber
Tidak terlihat menangani perubahan kata sandi root saat kosong.
flickerfly