Dimungkinkan untuk mengotomatisasi dan menyederhanakan operasi yang berulang, rumit, dan membosankan. Ini adalah mesin otomatisasi TI yang mengotomatiskan penyediaan cloud, manajemen konfigurasi, penerapan aplikasi, orkestrasi intra-layanan, dan banyak kebutuhan TI lainnya. Tidak memerlukan agen, hanya menggunakan SSH untuk mendorong perubahan dari satu sumber ke beberapa sumber daya jarak jauh tanpa konfigurasi infrastruktur keamanan khusus tambahan dan menggunakan format bahasa sederhana (YAML) untuk menjelaskan tugas otomatisasi.
Menginstal server MySQL mandiri adalah tugas sederhana yang mudah, tetapi ini dapat menjadi masalah jika Anda memiliki beberapa server database, versi, platform, dan lingkungan yang harus didukung. Oleh karena itu, memiliki alat manajemen konfigurasi adalah cara untuk meningkatkan efisiensi, menghilangkan pengulangan, dan mengurangi kesalahan manusia.
Dalam posting blog ini, kami akan memandu Anda melalui dasar-dasar otomatisasi Ansible untuk MySQL, serta manajemen konfigurasi dengan contoh dan penjelasan. Kita akan mulai dengan penerapan MySQL mandiri yang sederhana, seperti yang diilustrasikan dalam diagram tingkat tinggi berikut:
Menginstal Kemungkinan
Untuk panduan ini, kita harus memiliki setidaknya dua host - Satu host untuk Ansible (Anda dapat menggunakan workstation alih-alih server) dan host lainnya adalah host target yang ingin kami gunakan server MySQL.
Untuk menginstal Ansible di CentOS 7, cukup jalankan perintah berikut:
(ansible-host)$ yum install -y epel-release
(ansible-host)$ yum install -y ansible
Untuk distribusi OS lainnya, lihat panduan penginstalan yang memungkinkan.
Menyiapkan SSH Tanpa Kata Sandi
Menggunakan kata sandi selama SSH didukung, tetapi kunci SSH tanpa kata sandi dengan ssh-agent adalah salah satu cara terbaik untuk menggunakan Ansible. Langkah awal adalah mengonfigurasi SSH tanpa kata sandi karena Ansible akan melakukan penerapan hanya oleh saluran ini. Pertama, buat kunci SSH pada host Ansible:
(ansible-host)$ whoami
root
(ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
Anda harus mendapatkan setidaknya file berikut yang dihasilkan:
(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
Untuk mengizinkan SSH tanpa kata sandi, kita perlu menyalin kunci publik SSH (id_rsa.pub) ke host jarak jauh yang ingin kita akses. Kita dapat menggunakan alat yang disebut ssh-copy-id untuk melakukan tugas ini untuk kita. Namun, Anda harus mengetahui kata sandi pengguna dari host target dan otentikasi kata sandi diperbolehkan pada host target:
(ansible-host)$ whoami
root
(ansible-host)$ ssh-copy-id [email protected]
Perintah di atas akan meminta kata sandi root 192.168.0.221, cukup masukkan kata sandi dan kunci SSH untuk pengguna Ansible host saat ini akan disalin ke host target, 192.168.0.221 ke ~/.ssh/authorized_keys, artinya kami mengotorisasi kunci tertentu untuk mengakses server ini dari jarak jauh. Untuk mengujinya, Anda harus dapat menjalankan perintah jarak jauh berikut tanpa kata sandi dari Ansible host:
(ansible-host)$ ssh [email protected] "hostname -I"
192.168.0.221
Jika Anda tidak diizinkan menggunakan pengguna root untuk SSH (misalnya, "PermitRootLogin no" dalam konfigurasi SSH), Anda dapat menggunakan pengguna sudo. Dalam contoh berikut, kami menyiapkan SSH tanpa kata sandi untuk pengguna sudo yang disebut "gelandangan":
(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]
Jika server target tidak mengizinkan otentikasi kata sandi melalui SSH, cukup salin konten kunci publik SSH di ~/.ssh/id_rsa.pub secara manual ke ~/.ssh/authorized_keys host target mengajukan. Misalnya, pada host Ansible, ambil konten kunci publik:
(ansible-host)$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]
Hubungkan ke host target dan tempel kunci publik host Ansible ke ~/.ssh/authorized_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]
Sekarang Anda dapat mencoba menjalankan perintah jarak jauh dari Ansible host untuk memverifikasi dan Anda tidak akan dimintai sandi apa pun. Pada titik ini, SSH tanpa kata sandi kami telah dikonfigurasi.
Menentukan Host Target
Selanjutnya kita perlu menentukan host target, host yang ingin kita kelola menggunakan Ansible. Berdasarkan arsitektur kami, kami hanya akan menggunakan satu server MySQL yaitu 192.168.0.221. Tambahkan baris berikut ke /etc/ansible/hosts:
[db-mysql]
192.168.0.221
Di atas berarti kita mendefinisikan grup yang disebut "db-mysql", yang akan menjadi pengidentifikasi saat kita merujuk ke host target di Playbook Ansible. Kami juga dapat mencantumkan semua alamat IP atau nama host dari host target di bawah grup ini. Pada titik ini, kami hanya memiliki satu server MySQL untuk digunakan, jadi hanya ada satu entri yang ada. Anda juga dapat menentukan aturan pencocokan apa pun untuk mencocokkan host di bawah satu grup, misalnya:
[db-mysql]
192.168.0.[221:223]
Definisi di atas berarti kita memiliki 3 host di bawah grup ini dengan alamat IP berikut:
- 192.168.0.221
- 192.168.0.222
- 192.168.0.223
Ada banyak cara dan aturan untuk mencocokkan dan mengelompokkan host target seperti yang ditunjukkan dalam panduan inventaris yang memungkinkan.
Memilih Peran yang Mungkin
Untuk memberi tahu Ansible apa yang akan di-deploy, kita perlu mendefinisikan langkah-langkah penerapan dalam file berformat YML yang disebut playbook. Seperti yang mungkin Anda ketahui, menginstal server MySQL lengkap memerlukan beberapa langkah untuk memenuhi semua dependensi MySQL, konfigurasi pasca-instalasi, pembuatan skema dan pengguna, dan sebagainya. Ansible telah menyediakan sejumlah modul MySQL yang dapat membantu kami, tetapi kami masih harus menulis pedoman untuk langkah-langkah penerapan.
Untuk menyederhanakan langkah penerapan, kita dapat menggunakan peran Ansible yang ada. Peran yang memungkinkan adalah komponen independen yang memungkinkan penggunaan kembali langkah-langkah konfigurasi umum. Peran Ansible harus digunakan dalam buku pedoman. Ada sejumlah peran MySQL Ansible yang tersedia di Ansible Galaxy, repositori untuk peran Ansible yang tersedia untuk langsung dimasukkan ke dalam buku pedoman Anda.
Jika Anda mencari "mysql", Anda akan mendapatkan banyak peran Ansible untuk MySQL:
Kami akan menggunakan yang paling populer bernama "mysql" oleh geerlingguy. Anda dapat memilih untuk menggunakan peran lain tetapi sebagian besar yang paling banyak diunduh cenderung untuk tujuan umum yang biasanya berfungsi dengan baik dalam banyak kasus.
Pada host Ansible, jalankan perintah berikut untuk mengunduh peran Ansible:
(ansible-host)$ ansible-galaxy install geerlingguy.mysql
Peran akan diunduh ke ~/.ansible/roles/geerlingguy.mysql/ dari pengguna saat ini.
Menulis Playbook yang Mungkin
Dengan melihat peran Readme of the Ansible, kita bisa mengikuti contoh playbook yang sedang disediakan. Pertama, buat file playbook bernama deploy-mysql.yml dan tambahkan baris berikut:
(ansible-host)$ vim ~/deploy-mysql.yml
- hosts: db-mysql
become: yes
vars_files:
- vars/main.yml
roles:
- { role: geerlingguy.mysql }
Pada baris di atas, kita mendefinisikan host target yang merupakan semua host di bawah entri db-mysql di /etc/ansible/hosts. Baris berikutnya (menjadi) memberi tahu Ansible untuk mengeksekusi buku pedoman sebagai pengguna root, yang diperlukan untuk peran tersebut (dinyatakan di sana dalam file Readme). Selanjutnya, kita tentukan lokasi file variabel (var_files) yang terletak di vars/main.yml, relatif terhadap jalur playbook.
Mari kita buat direktori dan file variabel dan tentukan baris berikut:
(ansible-host)$ mkdir vars
(ansible-host)$ vim vars/main.yml
mysql_root_password: "theR00tP455w0rd"
Untuk informasi lebih lanjut, lihat bagian Variabel Peran di file Readme peran ini.
Mulai Penerapan
Sekarang kita siap untuk memulai penerapan MySQL. Gunakan perintah ansible-playbook untuk menjalankan definisi playbook kami:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Anda akan melihat banyak baris muncul di output. Fokus pada baris terakhir yang merangkum penerapan:
PLAY RECAP ***************************************************************************************************************************************
192.168.0.221 : ok=36 changed=8 unreachable=0 failed=0 skipped=16 rescued=0 ignored=0
Jika semuanya berubah menjadi hijau dan OK, Anda dapat memverifikasi pada host database bahwa server MySQL kami sudah diinstal dan dijalankan:
(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
Seperti yang Anda lihat di atas, untuk CentOS 7, instalasi MySQL default adalah MariaDB 5.5 sebagai bagian dari repositori paket standar. Pada titik ini, penerapan kami dianggap selesai, namun, kami ingin menyesuaikan lebih lanjut penerapan kami seperti yang ditunjukkan di bagian berikutnya.
Menyesuaikan Penerapan
Definisi paling sederhana dalam buku pedoman memberi kita instalasi yang sangat mendasar dan menggunakan semua opsi konfigurasi default. Kami selanjutnya dapat menyesuaikan instalasi MySQL dengan memperluas/memodifikasi/menambahkan buku pedoman untuk melakukan hal berikut:
- modifikasi opsi konfigurasi MySQL
- tambahkan pengguna basis data
- tambahkan skema database
- mengonfigurasi hak pengguna
- mengonfigurasi replikasi MySQL
- instal MySQL dari vendor lain
- mengimpor file konfigurasi MySQL khusus
Menginstal MySQL dari repositori Oracle
Secara default, peran akan menginstal paket MySQL default yang disertakan dengan distribusi OS. Adapun CentOS 7, Anda akan menginstal MariaDB 5.5 secara default. Misalkan kita ingin menginstal MySQL dari vendor lain, kita dapat memperluas playbook dengan pre_tasks, tugas yang dijalankan Ansible sebelum menjalankan tugas apa pun yang disebutkan dalam file .yml, seperti yang ditunjukkan pada contoh berikut:
(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"
Jalankan buku pedoman:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Di atas akan menginstal MySQL dari repositori Oracle sebagai gantinya. Versi default yang akan Anda dapatkan adalah MySQL 5.6. Menjalankan pedoman di atas pada host target yang sudah menjalankan versi lama MySQL/MariaDB kemungkinan akan gagal karena ketidakcocokan.
Membuat Database dan Pengguna MySQL
Di dalam vars/main.yml, kita dapat mendefinisikan database MySQL dan pengguna yang ingin kita konfigurasikan di server MySQL kita dengan menggunakan modul mysql_database dan mysql_users, tepat setelah definisi sebelumnya tentang 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"
Definisi tersebut menginstruksikan Ansible untuk membuat dua database, "myshop" dan "sysbench", mengikuti pengguna MySQL masing-masing dengan hak istimewa yang tepat, host dan sandi yang diizinkan.
Jalankan ulang buku pedoman untuk menerapkan perubahan ke server MySQL kami:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Kali ini, Ansible akan mengambil semua perubahan yang kami buat di vars/main.yml untuk diterapkan ke server MySQL kami. Kami dapat memverifikasi di server MySQL dengan perintah berikut:
(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.%' |
+------------------------------------------------------------------------------------------------------------------------+
Mengaktifkan Log Kueri Lambat
Peran ini mendukung pengaktifan log kueri lambat MySQL, kita dapat menentukan lokasi file log serta waktu kueri lambat. Tambahkan variabel yang diperlukan di dalam file 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'
Jalankan kembali buku pedoman untuk menerapkan perubahan:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Playbook akan membuat perubahan yang diperlukan pada opsi terkait permintaan lambat MySQL dan memulai ulang server MySQL secara otomatis untuk memuat konfigurasi baru. Kami kemudian dapat memverifikasi apakah opsi konfigurasi baru dimuat dengan benar di server MySQL:
(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 |
+------------------+-----------------------+-------------------+
Termasuk File Konfigurasi MySQL Kustom
Variabel peran yang memungkinkan dan variabel MySQL adalah dua hal yang berbeda. Penulis peran ini telah membuat sejumlah variabel terkait MySQL yang dapat direpresentasikan dengan variabel peran Ansible. Diambil dari file Readme, berikut beberapa diantaranya:
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*
Jika konfigurasi yang dihasilkan tidak memenuhi persyaratan MySQL kami, kami dapat menyertakan file konfigurasi MySQL khusus ke dalam penerapan dengan menggunakan variabel mysql_config_include_files. Ia menerima larik nilai yang dipisahkan oleh koma, dengan "src" sebagai awalan untuk jalur sebenarnya di Ansible host.
Pertama-tama, kita harus menyiapkan file konfigurasi khusus pada host Ansible. Buat direktori dan file konfigurasi MySQL sederhana:
(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
Misalnya kita memiliki file konfigurasi lain khusus untuk konfigurasi mysqldump:
(ansible-host)$ vim /root/custom-config/mysqldump.cnf
[mysqldump]
max_allowed_packet=128M
Untuk mengimpor file konfigurasi ini ke dalam penerapan kami, tentukan dalam array mysql_config_include_files di file 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'
]
Perhatikan bahwa /root/custom-config/mysqld-severalnines.cnf dan /root/custom-config/mysqldump.cnf ada di dalam Ansible host.
Jalankan kembali buku pedoman:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Playbook akan mengimpor file konfigurasi tersebut dan memasukkannya ke dalam direktori include (tergantung pada OS) yaitu /etc/my.cnf.d/ untuk CentOS 7. Playbook akan memulai ulang secara otomatis Server MySQL untuk memuat opsi konfigurasi baru. Kami kemudian dapat memverifikasi apakah opsi konfigurasi baru dimuat dengan benar:
(mysql-host)$ mysql -uroot -p -e 'select @@max_connections'
250
(mysql-host)$ mysqldump --help | grep ^max-allowed-packet
max-allowed-packet 134217728
Kesimpulan
Ansible dapat digunakan untuk mengotomatisasi penyebaran basis data dan manajemen konfigurasi dengan sedikit pengetahuan tentang skrip. Sementara itu, ClusterControl menggunakan pendekatan SSH tanpa kata sandi yang serupa untuk menerapkan, memantau, mengelola, dan menskalakan klaster database Anda dari A hingga Z, dengan antarmuka pengguna dan tidak memerlukan keahlian tambahan untuk mencapai hasil yang sama.