Ansible: วิธีการเปลี่ยนรหัสผ่านรูทเซิร์ฟเวอร์ MySQL โดยทำซ้ำเซิร์ฟเวอร์อีกครั้ง


14

ฉันได้จัดเตรียมเซิร์ฟเวอร์ของฉันด้วยเพลย์บุ๊ค Ansible ฉันใช้เพลย์เยอร์ root / ข้อเท็จจริง - Ansibleแล้ว

หนึ่งในภารกิจคือการตั้งค่าเซิร์ฟเวอร์ mysql พร้อมกับรหัสผ่านผู้ใช้รูท mysql

ตอนนี้ฉันต้องเปลี่ยนรหัสผ่านนี้อย่างเร่งด่วน ขั้นตอนที่ฉันทำ:

  1. ฉันอัปเดตตัวแปรสำหรับบทบาท Ansible
  2. ฉันดำเนินการคำสั่งansible-playbook -i hosts/staging server.ymlเพื่อทำซ้ำเซิร์ฟเวอร์

งานทั้งหมดถูกดำเนินการตามที่คาดไว้ (ไม่มีการเปลี่ยนแปลง) แต่สคริปต์ล้มเหลว [mariadb | Set root user password]ด้วยข้อความนี้:

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

ฉันเดาว่าเมื่อตั้งรหัสผ่านรูทของ MySQL แล้วการทำซ้ำเซิร์ฟเวอร์จะไม่สามารถเปลี่ยนรหัสผ่านนี้ได้

เป็นไปได้ไหมที่จะเปลี่ยนรหัสผ่านรูทของ MySQL ด้วยการทำเซิฟเวอร์ใหม่ด้วย Ansible? ตัวเลือกของฉันคืออะไร?

คำตอบ:


15

ปัญหาที่คุณมีคือ Ansible กำลังพยายามใช้รหัสผ่านรูทเดียวกันเพื่อเข้าสู่ระบบตามที่คุณต้องการเปลี่ยนเป็น:

- 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

เห็นได้ชัดว่านี่จะไม่ทำงานหากคุณต้องการใช้การเล่นนี้เพื่อเปลี่ยน

คุณควรเปลี่ยนการเล่นด้านบนให้เป็นดังนี้:

- 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

จากนั้นอัปเดตไฟล์คลังโฆษณาที่เกี่ยวข้องเพื่อเพิ่มตัวแปรใหม่นี้

ดังนั้นgroup_vars/productionตอนนี้คุณควรมี:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

ดูเหมือนว่า playbook นี้ใช้รหัสผ่านรูททั้งในroles/mariadb/tasks/main.ymlplaybook และroles/wordpress-setup/tasks/database.ymlดังนั้นคุณอาจต้องการเรียกใช้server.ymlplaybook ทั้งหมดเพื่อให้แน่ใจว่าตั้งค่าไว้อย่างถูกต้อง


ขอบคุณมากสำหรับคำตอบที่ดี นี่คือวิธีที่จะไปแน่นอน ฉันสิ้นสุดการรีเซ็ตรหัสผ่านรูทในคอนโซลด้วยmysqladmin- แต่ก่อนหน้านี้ฉันเห็นคำตอบของคุณ
luqo33

7

คุณสามารถใช้~ / .my.cnfในทางที่ผิดเพื่อให้สามารถเปลี่ยน mysql-root-password

เคล็ดลับคือการมีงาน "ตั้งค่ารหัสผ่านรูท" (nr.1) ซึ่งจะตั้งรหัสผ่าน หลังจากนั้นคุณมีงานซึ่งสร้าง~ / .my.cnfด้วยข้อมูลรับรองที่ถูกต้อง (nr.2)

บนระบบใหม่~ / .my.cnfไม่มีอยู่ ภารกิจที่ nr.1 จะสร้างผู้ใช้ mysql-root-user ที่ได้รับหนังสือรับรอง บนระบบปัจจุบันข้อมูลประจำตัวจาก~ / .my.cnfจะใช้ในการเข้าสู่ระบบและตั้งรหัสผ่านเพื่อmysql_root_password ภารกิจ nr.2 จะสร้าง~ / .my.cnf หรือเขียนทับข้อมูลประจำตัวเก่าที่มีอยู่~ / .my.cnfด้วยใหม่

ข้อได้เปรียบที่ยิ่งใหญ่ของวิธีการนี้คือการมีเพียงหนึ่งตัวแปร "mysql_root_password" ซึ่งเป็นวิธีที่ถูกต้องเสมอจากมุมมองของ playbook บนระบบปัจจุบัน~ / .my.cnfเป็นที่เก็บข้อมูลสำหรับ mysql-credentials โลคัลปัจจุบัน

- 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

กับ client.my.cnf.j2:

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

อ่านเพิ่มเติม

บันทึกที่เกี่ยวข้องจากansible-mysql_user_module-document :

  • หมายเหตุ 1:

    ในการรักษาความปลอดภัยผู้ใช้รายนี้เป็นส่วนหนึ่งของ playbook idempotent คุณต้องสร้างงานอย่างน้อยสองงาน: อันดับแรกจะต้องเปลี่ยนรหัสผ่านของผู้ใช้รูทโดยไม่ต้องให้รายละเอียด login_user / login_password ใด ๆ อันดับที่สองจะต้องวางไฟล์ ~ / .my.cnf ที่มีข้อมูลรับรองรูทใหม่ การเล่นครั้งต่อมาของ playbook จะสำเร็จโดยการอ่านข้อมูลประจำตัวใหม่จากไฟล์ ansible-mysql_user_module, บันทึก

  • โน้ต 2:

    จำเป็นต้องใช้ทั้ง login_password และ login_user เมื่อคุณส่งหนังสือรับรอง หากไม่มีอยู่โมดูลจะพยายามอ่านหนังสือรับรองจาก ~ / .my.cnf และในที่สุดก็กลับไปใช้การเข้าสู่ระบบเริ่มต้น MySQL ของ 'root' โดยไม่มีรหัสผ่าน ansible-mysql_user_module, บันทึก


ฉันค่อนข้างชอบวิธีการนี้และดีกว่าเวอร์ชันในคำตอบของฉัน มันน่าจะเป็นคำตอบที่ยอมรับได้
ydaetskcoR

2
สิ่งนี้มีประโยชน์ แต่ในหลาย ๆ ระบบมีผู้ใช้ 'รูท' 4 คนสร้างขึ้นด้วยโฮสต์ 127.0.0.1, localhost, :: 1 และชื่อโฮสต์ในระบบคืออะไร ด้านบนจะแก้ไข root @ localhost เท่านั้นโดยปล่อยให้บัญชี root อีกสามบัญชีด้วยรหัสผ่านว่างเปล่า
robo

รายชื่อผู้ใช้รูททั้งหมด: mysql --database mysql --execute "select host from user where user = 'root';". โพสต์นี้ทำเหมือนกับคำตอบนี้ แต่มีรหัสสำหรับตั้งรหัสผ่านทั้งหมด
hlovdal

2

สำหรับคนต่อไปที่กำลังมองหาคำตอบอยู่แถวนี้ ในขณะที่คำตอบที่ยอมรับนั้นเป็นความจริงคุณต้องขยันมากถ้าคุณใช้ MySQL 5.7 เพราะไม่มีการลงชื่อเข้าใช้แบบไม่ระบุชื่อใน mysqld ในโหมด daemonized (บริการ) แต่คุณต้องขูด /var/log/mysqld.log สำหรับรหัสผ่านชั่วคราวที่มีคนตัดสินใจที่จะสร้างและใช้งานบน login_password = ydaetskcoR นี่เป็นคุณสมบัติที่พวกเขาตัดสินใจที่จะนำไปใช้กับเวอร์ชั่น 5.7 ของที่เก็บ dev ดังนั้นหากคุณต้องการหลีกเลี่ยงมันก็จะใช้เวอร์ชั่นที่เก่ากว่า (5.6)

เอกสารที่นี่: 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

มีเพลย์บุ๊ค Ansible ที่ใช้สำหรับการทำให้ MySQL แข็งตัว

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

สิ่งนี้ไม่เพียงเปลี่ยนรหัสผ่านรูท แต่ยังดำเนินขั้นตอนเพิ่มเติมบางอย่างเพื่อทำให้เซิร์ฟเวอร์แข็งขึ้น

ลองดูที่ไฟล์ readme


ดูเหมือนว่าจะจัดการการเปลี่ยนรหัสผ่านรูทเมื่อมันว่างเปล่า
flickerfly
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.