Ansible tự động hóa và đơn giản hóa các hoạt động lặp đi lặp lại, phức tạp và tẻ nhạt. Nó là một công cụ tự động hóa CNTT tự động hóa việc cung cấp đám mây, quản lý cấu hình, triển khai ứng dụng, điều phối dịch vụ nội bộ và nhiều nhu cầu CNTT khác. Nó không yêu cầu tác nhân, chỉ sử dụng SSH để đẩy các thay đổi từ một nguồn duy nhất sang nhiều tài nguyên từ xa mà không cần cấu hình cơ sở hạ tầng bảo mật tùy chỉnh bổ sung và sử dụng định dạng ngôn ngữ đơn giản (YAML) để mô tả các công việc tự động hóa.
Cài đặt một máy chủ MySQL độc lập là một công việc đơn giản dễ hiểu, nhưng điều này có thể gây ra vấn đề nếu bạn có nhiều máy chủ cơ sở dữ liệu, phiên bản, nền tảng và môi trường để hỗ trợ. Do đó, có một công cụ quản lý cấu hình là cách để cải thiện hiệu quả, loại bỏ tính lặp lại và giảm thiểu lỗi do con người gây ra.
Trong bài đăng trên blog này, chúng tôi sẽ hướng dẫn bạn những kiến thức cơ bản về tự động hóa của Ansible cho MySQL, cũng như quản lý cấu hình với các ví dụ và giải thích. Chúng ta sẽ bắt đầu với một triển khai MySQL độc lập đơn giản, như được minh họa trong sơ đồ cấp cao sau:
Cài đặt Ansible
Đối với hướng dẫn này, chúng ta cần có ít nhất hai máy chủ - Một máy chủ dành cho Ansible (bạn có thể sử dụng máy trạm thay vì máy chủ) và một máy chủ khác là máy chủ đích mà chúng tôi muốn triển khai Máy chủ MySQL.
Để cài đặt Ansible trên CentOS 7, chỉ cần chạy các lệnh sau:
(ansible-host)$ yum install -y epel-release
(ansible-host)$ yum install -y ansible
Đối với các bản phân phối HĐH khác, hãy xem hướng dẫn cài đặt Ansible.
Thiết lập SSH không mật khẩu
Sử dụng mật khẩu trong khi SSH được hỗ trợ, nhưng các khóa SSH không cần mật khẩu với ssh-agent là một trong những cách tốt nhất để sử dụng Ansible. Bước đầu tiên là định cấu hình SSH không mật khẩu vì Ansible sẽ thực hiện việc triển khai chỉ bằng kênh này. Đầu tiên, tạo khóa SSH trên máy chủ Ansible:
(ansible-host)$ whoami
root
(ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
Bạn phải tạo ít nhất các tệp sau:
(ansible-host)$ ls -al ~/.ssh/
-rw-------. 1 root root 1679 Jan 14 03:40 id_rsa
-rw-r--r--. 1 root root 392 Jan 14 03:40 id_rsa.pub
Để cho phép SSH không cần mật khẩu, chúng ta cần sao chép khóa công khai SSH (id_rsa.pub) vào máy chủ từ xa mà chúng ta muốn truy cập. Chúng tôi có thể sử dụng một công cụ có tên là ssh-copy-id để thực hiện nhiệm vụ này cho chúng tôi. Tuy nhiên, bạn phải biết mật khẩu của người dùng của máy chủ đích và xác thực mật khẩu được phép trên máy chủ đích:
(ansible-host)$ whoami
root
(ansible-host)$ ssh-copy-id [email protected]
Lệnh trên sẽ nhắc nhập mật khẩu gốc 192.168.0.221, chỉ cần nhập mật khẩu và khóa SSH cho người dùng hiện tại của máy chủ Ansible sẽ được sao chép sang máy chủ đích, 192.168.0.221 thành ~ / .ssh / allow_keys, nghĩa là chúng tôi cho phép khóa cụ thể đó truy cập từ xa vào máy chủ này. Để kiểm tra, bạn có thể chạy lệnh từ xa sau mà không cần mật khẩu từ máy chủ Ansible:
(ansible-host)$ ssh [email protected] "hostname -I"
192.168.0.221
Trong trường hợp bạn không được phép sử dụng người dùng gốc cho SSH (ví dụ:"PermitRootLogin no" trong cấu hình SSH), bạn có thể sử dụng người dùng sudo để thay thế. Trong ví dụ sau, chúng tôi thiết lập SSH không cần mật khẩu cho người dùng sudo có tên "vagrant":
(ansible-host)$ whoami
vagrant
(ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
(ansible-host)$ ls -al ~/.ssh/
-rw-------. 1 vagrant vagrant 1679 Jan 14 03:45 id_rsa
-rw-r--r--. 1 vagrant vagrant 392 Jan 14 03:45 id_rsa.pub
(ansible-host)$ ssh-copy-id [email protected]
Nếu máy chủ đích không cho phép xác thực mật khẩu qua SSH, chỉ cần sao chép nội dung của khóa công khai SSH tại ~ / .ssh / id_rsa.pub vào máy chủ đích '~ / .ssh / allow_keys tập tin. Ví dụ:trên máy chủ Ansible, truy xuất nội dung khóa công khai:
(ansible-host)$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]
Kết nối với máy chủ đích và dán khóa công khai của máy chủ Ansible vào ~ / .ssh / allow_keys:
(target-host)$ whoami
root
(target-host)$ vi ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]
Bây giờ bạn có thể thử chạy lệnh từ xa từ máy chủ Ansible để xác minh và bạn sẽ không được nhắc với bất kỳ mật khẩu nào. Tại thời điểm này, SSH không mật khẩu của chúng tôi đã được định cấu hình.
Xác định Máy chủ Mục tiêu
Tiếp theo, chúng ta cần xác định máy chủ đích, máy chủ mà chúng ta muốn quản lý bằng Ansible. Dựa trên kiến trúc của chúng tôi, chúng tôi sẽ triển khai chỉ một máy chủ MySQL là 192.168.0.221. Thêm các dòng sau vào / etc / ansible / hosts:
[db-mysql]
192.168.0.221
Ở trên chỉ đơn giản là chúng ta đã xác định một nhóm có tên "db-mysql", sẽ là định danh khi chúng ta tham chiếu đến máy chủ đích trong Ansible playbook. Chúng tôi cũng có thể liệt kê tất cả các địa chỉ IP hoặc tên máy chủ của các máy chủ đích trong nhóm này. Tại thời điểm này, chúng tôi chỉ có một máy chủ MySQL để triển khai, do đó chỉ có một mục nhập ở đó. Bạn cũng có thể chỉ định bất kỳ quy tắc đối sánh nào để so khớp các máy chủ trong một nhóm, ví dụ:
[db-mysql]
192.168.0.[221:223]
Định nghĩa trên có nghĩa là chúng ta đang có 3 máy chủ trong chính nhóm này với các địa chỉ IP sau:
- 192.168.0.221
- 192.168.0.222
- 192.168.0.223
Có rất nhiều cách và quy tắc để đối sánh và nhóm các máy chủ mục tiêu như được hiển thị trong hướng dẫn khoảng không quảng cáo Ansible.
Chọn một vai trò có thể phục hồi
Để cho Ansible biết những gì sẽ triển khai, chúng ta cần xác định các bước triển khai trong một tệp có định dạng YML được gọi là playbook. Như bạn có thể biết, việc cài đặt một máy chủ MySQL hoàn chỉnh yêu cầu nhiều bước để đáp ứng tất cả các phụ thuộc MySQL, cấu hình sau cài đặt, tạo người dùng và lược đồ, v.v. Ansible đã cung cấp một số mô-đun MySQL có thể giúp chúng tôi, nhưng chúng tôi vẫn phải viết một playbook cho các bước triển khai.
Để đơn giản hóa các bước triển khai, chúng ta có thể sử dụng các vai trò Ansible hiện có. Ansible role là một thành phần độc lập cho phép sử dụng lại các bước cấu hình chung. Một vai trò Ansible phải được sử dụng trong playbook. Có một số vai trò Ansible của MySQL có sẵn trong Ansible Galaxy, một kho lưu trữ cho các vai trò Ansible có sẵn để đưa trực tiếp vào sách vở của bạn.
Nếu bạn tra cứu "mysql", bạn sẽ nhận được nhiều vai trò Ansible cho MySQL:
Chúng tôi sẽ sử dụng một cái tên phổ biến nhất có tên là "mysql" của geerlingguy. Bạn có thể chọn sử dụng các vai trò khác nhưng hầu hết vai trò được tải xuống nhiều nhất có xu hướng dành cho mục đích chung thường hoạt động tốt trong hầu hết các trường hợp.
Trên máy chủ Ansible, hãy chạy lệnh sau để tải xuống vai trò Ansible:
(ansible-host)$ ansible-galaxy install geerlingguy.mysql
Vai trò sẽ được tải xuống ~ / .ansible / role / geerlingguy.mysql / của người dùng hiện tại.
Viết Playbook Ansible
Bằng cách xem Readme của vai trò Ansible, chúng ta có thể theo dõi playbook mẫu đang được cung cấp. Đầu tiên, tạo một tệp playbook có tên là deploy-mysql.yml và thêm các dòng sau:
(ansible-host)$ vim ~/deploy-mysql.yml
- hosts: db-mysql
become: yes
vars_files:
- vars/main.yml
roles:
- { role: geerlingguy.mysql }
Trong các dòng trên, chúng tôi xác định máy chủ đích là tất cả các máy chủ trong các mục db-mysql trong / etc / ansible / hosts. Dòng tiếp theo (trở thành) yêu cầu Ansible thực thi playbook với tư cách là người dùng root, điều này cần thiết cho vai trò (nó được nêu ở đó trong tệp Readme). Tiếp theo, chúng tôi xác định vị trí của tệp biến (var_files) nằm tại vars / main.yml, liên quan đến đường dẫn playbook.
Hãy tạo thư mục và tệp biến và chỉ định dòng sau:
(ansible-host)$ mkdir vars
(ansible-host)$ vim vars/main.yml
mysql_root_password: "theR00tP455w0rd"
Để biết thêm thông tin, hãy xem phần Biến vai trò trong tệp Readme của vai trò này.
Bắt đầu Triển khai
Bây giờ chúng ta đã sẵn sàng để bắt đầu triển khai MySQL. Sử dụng lệnh ansible-playbook để thực thi các định nghĩa playbook của chúng tôi:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Bạn sẽ thấy một loạt các dòng xuất hiện trong đầu ra. Tập trung vào dòng cuối cùng nơi nó tóm tắt việc triển khai:
PLAY RECAP ***************************************************************************************************************************************
192.168.0.221 : ok=36 changed=8 unreachable=0 failed=0 skipped=16 rescued=0 ignored=0
Nếu mọi thứ chuyển sang màu xanh lục và OK, bạn có thể xác minh trên máy chủ cơ sở dữ liệu rằng máy chủ MySQL của chúng tôi đã được cài đặt và đang chạy:
(mysql-host)$ rpm -qa | grep -i maria
mariadb-server-5.5.64-1.el7.x86_64
mariadb-libs-5.5.64-1.el7.x86_64
mariadb-5.5.64-1.el7.x86_64
(mysql-host)$ mysqladmin -uroot -p ping
Enter password:
mysqld is alive
Như bạn có thể thấy ở trên, đối với CentOS 7, cài đặt MySQL mặc định là MariaDB 5.5 như một phần của kho lưu trữ gói tiêu chuẩn. Tại thời điểm này, việc triển khai của chúng tôi được coi là hoàn tất, tuy nhiên, chúng tôi muốn tùy chỉnh thêm việc triển khai của mình như được hiển thị trong các phần tiếp theo.
Tùy chỉnh Triển khai
Định nghĩa đơn giản nhất trong playbook cung cấp cho chúng ta một cài đặt rất cơ bản và sử dụng tất cả các tùy chọn cấu hình mặc định. Chúng tôi có thể tùy chỉnh thêm cài đặt MySQL bằng cách mở rộng / sửa đổi / gắn thêm playbook để thực hiện những việc sau:
- sửa đổi các tùy chọn cấu hình MySQL
- thêm người dùng cơ sở dữ liệu
- thêm giản đồ cơ sở dữ liệu
- định cấu hình các đặc quyền của người dùng
- định cấu hình sao chép MySQL
- cài đặt MySQL từ các nhà cung cấp khác
- nhập tệp cấu hình MySQL tùy chỉnh
Cài đặt MySQL từ kho lưu trữ Oracle
Theo mặc định, role sẽ cài đặt gói MySQL mặc định đi kèm với bản phân phối hệ điều hành. Đối với CentOS 7, bạn sẽ được cài đặt MariaDB 5.5 theo mặc định. Giả sử chúng ta muốn cài đặt MySQL từ một nhà cung cấp khác, chúng ta có thể mở rộng playbook với pre_tasks, một tác vụ mà Ansible thực thi trước khi thực hiện bất kỳ tác vụ nào được đề cập trong bất kỳ tệp .yml nào, như được hiển thị trong ví dụ sau:
(ansible-host)$ vim deploy-mysql.yml
- hosts: db-mysql
become: yes
vars_files:
- vars/main.yml
roles:
- { role: geerlingguy.mysql }
pre_tasks:
- name: Install the MySQL repo.
yum:
name: http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
state: present
when: ansible_os_family == "RedHat"
- name: Override variables for MySQL (RedHat).
set_fact:
mysql_daemon: mysqld
mysql_packages: ['mysql-server']
mysql_log_error: /var/lib/mysql/error.log
mysql_syslog_tag: mysqld
mysql_pid_file: /var/run/mysqld/mysqld.pid
mysql_socket: /var/lib/mysql/mysql.sock
when: ansible_os_family == "RedHat"
Thực thi playbook:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Ở trên sẽ cài đặt MySQL từ kho lưu trữ Oracle. Phiên bản mặc định bạn sẽ nhận được là MySQL 5.6. Việc thực thi playbook ở trên trên máy chủ đích đã chạy phiên bản MySQL / MariaDB cũ hơn có thể sẽ không thành công do không tương thích.
Tạo Cơ sở dữ liệu MySQL và Người dùng
Bên trong vars / main.yml, chúng tôi có thể xác định cơ sở dữ liệu MySQL và người dùng mà chúng tôi muốn Ansible định cấu hình trên máy chủ MySQL của chúng tôi bằng cách sử dụng mô-đun mysql_database và mysql_users, ngay sau định nghĩa trước của chúng tôi về mysql_root_password:
(ansible-host)$ vim vars/main.yml
mysql_root_password: "theR00tP455w0rd"
mysql_databases:
- name: myshop
encoding: latin1
collation: latin1_general_ci
- name: sysbench
encoding: latin1
collation: latin1_general_ci
mysql_users:
- name: myshop_user
host: "%"
password: mySh0pPassw0rd
priv: "myshop.*:ALL"
- name: sysbench_user
host: "192.168.0.%"
password: sysBenchPassw0rd
priv: "sysbench.*:ALL"
Định nghĩa hướng dẫn Ansible tạo hai cơ sở dữ liệu, "myshop" và "sysbench", theo sau người dùng MySQL tương ứng của nó với các đặc quyền thích hợp, máy chủ được phép và mật khẩu.
Thực thi lại playbook để áp dụng thay đổi vào máy chủ MySQL của chúng tôi:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Lần này, Ansible sẽ chọn tất cả các thay đổi mà chúng tôi đã thực hiện trong vars / main.yml để áp dụng cho máy chủ MySQL của chúng tôi. Chúng tôi có thể xác minh trong máy chủ MySQL bằng các lệnh sau:
(mysql-host)$ mysql -uroot -p -e 'SHOW DATABASES'
Enter password:
+--------------------+
| Database |
+--------------------+
| information_schema |
| myshop |
| mysql |
| performance_schema |
| sysbench |
+--------------------+
(mysql-host)$ mysql -uroot -p -e 'SHOW GRANTS FOR [email protected]"192.168.0.%"'
Enter password:
+------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'sysbench_user'@'192.168.0.%' IDENTIFIED BY PASSWORD '*4AC2E8AD02562E8FAAF5A958DC2AEA4C47451B5C' |
| GRANT ALL PRIVILEGES ON `sysbench`.* TO 'sysbench_user'@'192.168.0.%' |
+------------------------------------------------------------------------------------------------------------------------+
Bật nhật ký truy vấn chậm
Vai trò này hỗ trợ bật nhật ký truy vấn chậm MySQL, chúng ta có thể xác định vị trí của tệp nhật ký cũng như thời gian truy vấn chậm. Thêm các biến cần thiết bên trong tệp vars / main.yml:
mysql_root_password: "theR00tP455w0rd"
mysql_databases:
- name: example_db
encoding: latin1
collation: latin1_general_ci
- name: sysbench
encoding: latin1
collation: latin1_general_ci
mysql_users:
- name: example_user
host: "%"
password: similarly-secure-password
priv: "example_db.*:ALL"
- name: sysbench_user
host: "192.168.0.%"
password: sysBenchPassw0rd
priv: "sysbench.*:ALL"
mysql_slow_query_log_enabled: true
mysql_slow_query_log_file: 'slow_query.log'
mysql_slow_query_time: '5.000000'
Chạy lại playbook để áp dụng các thay đổi:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Playbook sẽ thực hiện các thay đổi cần thiết đối với các tùy chọn liên quan đến truy vấn chậm MySQL và tự động khởi động lại máy chủ MySQL để tải các cấu hình mới. Sau đó, chúng tôi có thể xác minh xem các tùy chọn cấu hình mới có được tải đúng trên máy chủ MySQL hay không:
(mysql-host)$ mysql -uroot -p -e 'SELECT @@slow_query_log, @@slow_query_log_file, @@long_query_time'
+------------------+-----------------------+-------------------+
| @@slow_query_log | @@slow_query_log_file | @@long_query_time |
+------------------+-----------------------+-------------------+
| 1 | slow_query.log | 5.000000 |
+------------------+-----------------------+-------------------+
Bao gồm Tệp Cấu hình MySQL Tùy chỉnh
Biến vai trò có thể kiểm soát được và biến MySQL là hai thứ khác nhau. Tác giả của vai trò này đã tạo ra một số biến liên quan đến MySQL có thể được biểu diễn bằng các biến vai trò Ansible. Lấy từ tệp Readme, đây là một số trong số chúng:
mysql_port: "3306"
mysql_bind_address: '0.0.0.0'
mysql_datadir: /var/lib/mysql
mysql_socket: *default value depends on OS*
mysql_pid_file: *default value depends on OS*
mysql_log_file_group: mysql *adm on Debian*
mysql_log: ""
mysql_log_error: *default value depends on OS*
mysql_syslog_tag: *default value depends on OS*
Nếu cấu hình được tạo không đáp ứng yêu cầu MySQL của chúng tôi, chúng tôi có thể đưa các tệp cấu hình MySQL tùy chỉnh vào triển khai bằng cách sử dụng biến mysql_config_include_files. Nó chấp nhận một mảng giá trị được phân tách bằng dấu phẩy, với "src" làm tiền tố cho đường dẫn thực trên máy chủ Ansible.
Trước hết, chúng ta phải chuẩn bị các tệp cấu hình tùy chỉnh trên máy chủ Ansible. Tạo một thư mục và một tệp cấu hình MySQL đơn giản:
(ansible-host)$ mkdir /root/custom-config/
(ansible-host)$ vim /root/custom-config/my-severalnines.cnf
[mysqld]
max_connections=250
log_bin=binlog
expire_logs_days=7
Giả sử chúng ta có một tệp cấu hình khác dành riêng cho cấu hình mysqldump:
(ansible-host)$ vim /root/custom-config/mysqldump.cnf
[mysqldump]
max_allowed_packet=128M
Để nhập các tệp cấu hình này vào triển khai của chúng tôi, hãy xác định chúng trong mảng mysql_config_include_files trong tệp vars / main.yml:
mysql_root_password: "theR00tP455w0rd"
mysql_databases:
- name: example_db
encoding: latin1
collation: latin1_general_ci
- name: sysbench
encoding: latin1
collation: latin1_general_ci
mysql_users:
- name: example_user
host: "%"
password: similarly-secure-password
priv: "example_db.*:ALL"
- name: sysbench_user
host: "192.168.0.%"
password: sysBenchPassw0rd
priv: "sysbench.*:ALL"
mysql_slow_query_log_enabled: true
mysql_slow_query_log_file: slow_query.log
mysql_slow_query_time: 5
mysql_config_include_files: [
src: '/root/custom-config/my-severalnines.cnf',
src: '/root/custom-config/mysqldump.cnf'
]
Lưu ý rằng /root/custom-config/mysqld-severalnines.cnf và /root/custom-config/mysqldump.cnf tồn tại bên trong máy chủ Ansible.
Chạy lại playbook:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Playbook sẽ nhập các tệp cấu hình đó và đưa chúng vào thư mục bao gồm (tùy thuộc vào hệ điều hành) là /etc/my.cnf.d/ dành cho CentOS 7. Playbook sẽ tự động khởi động lại Máy chủ MySQL để tải các tùy chọn cấu hình mới. Sau đó, chúng tôi có thể xác minh xem các tùy chọn cấu hình mới có được tải chính xác hay không:
(mysql-host)$ mysql -uroot -p -e 'select @@max_connections'
250
(mysql-host)$ mysqldump --help | grep ^max-allowed-packet
max-allowed-packet 134217728
Kết luận
Ansible có thể được sử dụng để tự động hóa việc triển khai cơ sở dữ liệu và quản lý cấu hình với một chút kiến thức về kịch bản. Trong khi đó, ClusterControl sử dụng cách tiếp cận SSH không cần mật khẩu tương tự để triển khai, giám sát, quản lý và mở rộng cụm cơ sở dữ liệu của bạn từ A đến Z, với giao diện người dùng và không cần thêm kỹ năng để đạt được kết quả tương tự.