Ansible: Cách thay đổi mật khẩu gốc của máy chủ MySQL bằng cách xác nhận lại máy chủ


14

Tôi đã cung cấp máy chủ của mình với Playbook Ansible. Tôi đã sử dụng playbook gốc / bedrock-Ansible .

Một trong những nhiệm vụ là thiết lập máy chủ mysql cùng với mật khẩu người dùng root mysql.

Bây giờ tôi rất cần thay đổi mật khẩu này. Các bước tôi đã thực hiện:

  1. Tôi đã cập nhật các biến cho vai trò Ansible
  2. Tôi đã thực thi lệnh ansible-playbook -i hosts/staging server.ymlđể phê duyệt máy chủ

Tất cả các tác vụ đã được thực hiện như mong đợi (không có thay đổi), nhưng tập lệnh thất bại [mariadb | Set root user password]với thông báo này:

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

Tôi đoán là một khi mật khẩu root của MySQL đã được thiết lập, việc phê duyệt lại máy chủ không thể thay đổi mật khẩu này.

Có thể thay đổi mật khẩu root của MySQL bằng cách xác nhận lại máy chủ với Ansible không? Những lựa chọn của tôi là gì?

Câu trả lời:


15

Vấn đề bạn gặp phải là Ansible đang cố gắng sử dụng cùng một mật khẩu gốc để đăng nhập khi bạn muốn thay đổi nó thành:

- 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

Rõ ràng điều này sẽ không bao giờ hoạt động nếu bạn muốn sử dụng lối chơi này để thay đổi nó.

Thay vào đó, bạn nên thay đổi cách chơi ở trên thành một cái gì đó như:

- 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

Và sau đó cập nhật các tệp kiểm kê có liên quan để thêm biến mới này.

Vì vậy, group_vars/productionbây giờ bạn nên chứa:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

Có vẻ như playbook này sử dụng mật khẩu gốc trong cả roles/mariadb/tasks/main.ymlplaybook và roles/wordpress-setup/tasks/database.ymlvì vậy bạn có thể muốn chạy toàn bộ server.ymlplaybook để đảm bảo rằng nó được thiết lập đúng.


Cảm ơn rất nhiều cho một câu trả lời tuyệt vời. Điều này chắc chắn là con đường để đi. mysqladmin
Cuối

7

Bạn có thể sử dụng sai ~ / .my.cnf để có thể thay đổi mật khẩu gốc mysql.

Mẹo nhỏ là có một nhiệm vụ "Đặt mật khẩu gốc" (nr.1), sẽ đặt mật khẩu. Sau đó, bạn có một nhiệm vụ, tạo ra một ~ / .my.cnf với thông tin xác thực chính xác (nr.2).

Trên một hệ thống mới, ~ / .my.cnf không có mặt. Tác vụ nr.1 sẽ tạo người dùng gốc mysql với thông tin xác thực. Trên một hệ thống hiện tại, thông tin đăng nhập từ ~ / .my.cnf được sử dụng để đăng nhập và đặt mật khẩu thành mysql_root_password . Nhiệm vụ nr.2 sẽ tạo ~ / .my.cnf , hoặc ghi lại các thông tin cũ hiện có ~ / .my.cnf với các thông tin mới.

Ưu điểm lớn của phương pháp này là chỉ có một biến "mysql_root_password", đây luôn là biến chính xác theo quan điểm của một cuốn sách. Trên (các) hệ thống hiện tại, ~ / .my.cnf là loại lưu trữ cho thông tin xác thực mysql hiện tại.

- 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

với client.my.cnf.j2:

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

đọc thêm

Các ghi chú có liên quan từ tài liệu ansible-mysql_user_module :

  • Lưu ý1:

    Để bảo mật người dùng này như một phần của một playbook bình thường, bạn phải tạo ít nhất hai tác vụ: đầu tiên phải thay đổi mật khẩu của người dùng root, mà không cung cấp bất kỳ chi tiết login_user / login_password nào. Thứ hai phải loại bỏ tệp ~ / .my.cnf chứa thông tin xác thực gốc mới. Các lần chạy tiếp theo của playbook sau đó sẽ thành công bằng cách đọc thông tin đăng nhập mới từ tệp. ansible-mysql_user_module, ghi chú

  • Lưu ý 2:

    Cả login_password và login_user đều được yêu cầu khi bạn chuyển thông tin đăng nhập. Nếu không có mặt, mô-đun sẽ cố gắng đọc thông tin đăng nhập từ ~ / .my.cnf, và cuối cùng quay lại sử dụng thông tin đăng nhập mặc định của 'root' không có mật khẩu. ansible-mysql_user_module, ghi chú


Tôi khá thích cách tiếp cận này và nó tốt hơn nhiều so với phiên bản trong câu trả lời của tôi. Nó có lẽ nên là câu trả lời được chấp nhận.
ydaetskcoR

2
Điều này rất tiện lợi, nhưng trên nhiều hệ thống thực sự có 4 người dùng 'root' được tạo, với Hosts 127.0.0.1, localhost, :: 1 và bất kể tên máy chủ cục bộ là gì. Ở trên chỉ sửa đổi root @ localhost, để lại ba tài khoản root khác với mật khẩu trống.
robo

Liệt kê tất cả người dùng root : mysql --database mysql --execute "select host from user where user = 'root';". Bài đăng này thực hiện giống như câu trả lời này nhưng có mã để đặt tất cả mật khẩu.
hlovdal

2

Đối với người tiếp theo đang tìm kiếm câu trả lời xung quanh đây. Mặc dù câu trả lời được chấp nhận là đúng, bạn phải siêng năng hơn nếu bạn đang sử dụng MySQL 5.7 vì không có thông tin đăng nhập ẩn danh nào được phép trong mysqld ở chế độ (dịch vụ). Thay vào đó, bạn PHẢI cạo /var/log/mysqld.log để lấy mật khẩu TẠM THỜI mà ai đó đã quyết định tạo và sử dụng mật khẩu đó trên login_password = ydaetskcoR. Đây là một tính năng mà họ quyết định triển khai trên phiên bản 5.7 của kho dev, vì vậy nếu bạn muốn tránh nó, hãy sử dụng phiên bản cũ hơn (5.6).

Tài liệu ở đây: 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

Có một Playbook Ansible được sử dụng để làm cứng MySQL.

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

Điều này không chỉ thay đổi mật khẩu gốc mà còn thực hiện một số bước bổ sung để làm cứng máy chủ.

Có một cái nhìn vào các tập tin readme.


Không có vẻ như nó xử lý thay đổi mật khẩu gốc khi nó trống.
flickerfly
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.