MySQL adalah sistem manajemen basis data relasional sumber terbuka. Ini adalah salah satu sistem manajemen relasional yang populer.
Mysql biasanya diinstal sebagai bagian dari tumpukan LAMP atau LEMP (Linux, Apache/Nginx, MySQL/MariaDB, PHP/Python/Perl) yang populer.
Dalam panduan ini kita akan menggunakan mysql 8 pada Centos 8. Panduan ini juga bekerja pada turunan RHEL 8 lainnya seperti Rocky Linux 8 dan Alma Linux 8
Cek juga:
- Cara Menginstal dan Mengatur mysql 8 di Ubuntu 20.04
- Instalasi dan Konfigurasi Mysql Server 8 di Centos 8
- Cara menginstal dan Konfigurasi Mysql Server 8 di Fedora 34/35
- Izin MySQL – Buat, Perbarui, Hapus Pengguna Basis Data
- Instal dan Setup Nginx, WordPress dan Mysql 8 di Centos 8
- Buat instance RDS di terraform dengan Contoh Mariadb
Persyaratan
- Koneksi internet
- Dapat dipasang secara lokal
File host
Kami memerlukan file host yang akan menentukan server yang kami targetkan:
all:
hosts:
db-server:
ansible_ssh_host: 192.168.10.2
ansible_ssh_user: centos
ansible_ssh_private_key_file: ~/.ssh/server_key
Yaml di atas mendefinisikan server db-server
yang memiliki ip 192.168.10.2
dan dapat diakses menggunakan pengguna centos
dan ~/.ssh/server_key
.
Uji dengan:
ssh -i ~/.ssh/server_key [email protected]
Panduan yang memungkinkan
Sebelum kita mendefinisikan tugas kita, kita harus memberi tahu kemungkinan beberapa hal:
- name: Install mysql server 8 and initialize
hosts: db-server
gather_facts: false
become: true
vars:
mysql_root_password: 'secure-root-pw'
ansible_python_interpreter: /usr/bin/python3
Penjelasan:
name
mendefinisikan buku pedoman sebagai nama deskriptif tentang apa yang dilakukannya, tidak wajib memilikinya.hosts
mendefinisikan host yang akan ditargetkan seperti yang didefinisikan dalamhosts
atauhosts.yaml
file yang ditentukan di atas.gather_facts
mendefinisikan apakah kita ingin dapat mengumpulkan fakta sebelum memproses tugas. dalam kasus kami, kami tidak inginbecome
mendefinisikan bahwa kita ingin menjalankan tugas kita sebagai rootvars
mendefinisikan variabel yang ingin kita gunakan kembali dalam tugas kita. Kami mendefinisikanmysql_root_password
danansible_python_interpreter
dalam kasus kami
Tugas yang memungkinkan
Setelah bagian di atas, sekarang kita perlu mendefinisikan tugas kita. Tugas-tugas ini dapat ditambahkan dalam peran atau ditentukan sebagai tugas. Dalam kasus kami, kami akan menggunakannya sebagai tugas (periksa akhir panduan ini untuk buku pedoman lengkap).
Pastikan perangkat lunak yang diperlukan telah diinstal
Sebelum melanjutkan, kami ingin menginstal semua perangkat lunak yang kami perlukan. Ini termasuk perangkat lunak khusus mysql mysql-server
dan mysql-devel
dan perangkat lunak pendukung seperti perangkat lunak terkait python yang akan digunakan oleh memungkinkan untuk terhubung ke dan mengatur instance server mysql. Kami menggunakan dnf
yang memungkinkan modul untuk melakukan ini.
- name: Ensure required packages are installed
dnf:
name:
- mysql-server
- mysql-devel
- python39
- python39-devel
- python39-pip
- gcc
state: latest
Instal modul pip yang diperlukan
Ansible menggunakan PyMySQL
modul di python3 untuk menghubungkan dan mengatur server mysql. Instal menggunakan pip
yang memungkinkan modul
- name: Install Required pip modules
pip:
name:
- PyMySQL
state: present
executable: pip3
Mulai dan aktifkan layanan mysql
Karena kita ingin terhubung dan melakukan operasi di server, mari kita mulai dengan tugas ini. Karena centos 8 menggunakan systemd
untuk mengelola proses yang berjalan lama, mari mulai dan aktifkan mysqld menggunakan systemd
yang memungkinkan modul:
- name: Ensure mysql service is running
systemd:
name: mysqld
state: started
enabled: yes
Pastikan pengguna root dapat login dari server lokal
root
mysql pengguna adalah pengguna admin default yang memiliki izin untuk semua sumber daya di server. Praktik terbaik adalah dengan hanya mengaktifkan akses melalui pengguna iniroot
di sistem lokal saat kita melakukan tugas admin, jika tidak, buat pengguna khusus untuk setiap koneksi, yaitu untuk setiap aplikasi, miliki pengguna yang memiliki akses ke db itu saja.
- name: Ensure root user can only login from localhost
mysql_user:
login_password: "{{ mysql_root_password }}"
check_implicit_admin: yes
name: root
host: "{{ item }}"
password: "{{ mysql_root_password }}"
state: present
with_items:
- localhost
- 127.0.0.1
- ::1
Dalam definisi tugas di atas:
mysql_root_password
variabel akan diambil darivars
ditentukan sebelumnyaitem
adalah loop dari nilai yang didefinisikan dalamwith_items
bagian.check_implicit_admin
memberitahu kemungkinan untuk mencoba masuk tanpa kata sandi yang seharusnya berfungsi karena ini adalah pemasangan baru. Sebagai bagian dari ini,password
disediakan akan disetel untuk pengguna root
Tambahkan my.cnf
ke direktori rumah
Sekarang kita telah mengatur kata sandi dalam tugas di atas, kami ingin memberikan kata sandi saat melakukan lebih banyak tugas sebagai pengguna root. Kami dapat menyediakan ini di ~/.my.cnf
, file yang diperiksa kredensialnya setiap kali kita menjalankan perintah mysql.
Buat file my.cnf.j2
di direktori saat ini:
[client]
user=root
password={{ mysql_root_password }}
Kemudian ini adalah tugas untuk menyalin ke /root/.my.cnf
karena kami menjalankan tugas sebagai pengguna root.
- name: Add .my.cnf to user home
template:
src: my.cnf.j2
dest: /root/.my.cnf
Muat ulang hak istimewa
Jalankan tugas berikut untuk memuat ulang hak istimewa untuk perubahan yang telah kami buat sejauh ini untuk diterapkan:
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
Hapus pengguna anonim
Ini adalah praktik yang baik untuk menghapus pengguna anonim. Mari kita lakukan dengan tugas ini:
- name: Remove anonymous users
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User=''
changed_when: False
Larang root untuk login dari jarak jauh
Jalankan perintah berikut untuk menghapus entri di mysql.user
meja. Ini memastikan bahwa pengguna root hanya dapat masuk secara lokal:
- name: Disallow root login remotely
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')
changed_when: False
Hapus database pengujian dan akses ke sana
Karena kita tidak memerlukan database pengujian, kita dapat menghapusnya dengan tugas ini:
- name: Remove test database and access to it
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DROP DATABASE IF EXISTS test
- DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'
changed_when: False
Muat ulang hak istimewa
Untuk menerapkan perubahan yang telah kami buat di atas, muat ulang hak istimewa dengan tugas ini:
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
Hapus .my.cnf
yang kami salin.
Demi keamanan, mari hapus /root/.my.cnf
file karena berisi akses root:
- name: Delete .my.conf
file:
path: /root/.my.cnf
state: absent
Seluruh buku pedoman
Ini adalah keseluruhan buku pedoman dengan semua tugas:
---
- name: Install mysql server 8 and initialize
hosts: db-server
gather_facts: false
become: true
vars:
mysql_root_password: 'secure-root-pw'
ansible_python_interpreter: /usr/bin/python3
tasks:
- name: Ensure required packages are installed
dnf:
name:
- mysql-server
- mysql-devel
- python39
- python39-devel
- python39-pip
- gcc
state: latest
- name: Install Required pip modules
pip:
name:
- PyMySQL
state: present
executable: pip3
- name: Ensure mysql service is running
systemd:
name: mysqld
state: restarted
enabled: yes
- name: Ensure root user can only login from localhost
mysql_user:
login_password: "{{ mysql_root_password }}"
check_implicit_admin: yes
name: root
host: "{{ item }}"
password: "{{ mysql_root_password }}"
state: present
with_items:
- localhost
- 127.0.0.1
- ::1
- name: Add .my.cnf to user home
template:
src: my.cnf.j2
dest: /root/.my.cnf
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
- name: Remove anonymous users
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User=''
changed_when: False
- name: Disallow root login remotely
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')
changed_when: False
- name: Remove test database and access to it
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DROP DATABASE IF EXISTS test
- DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'
changed_when: False
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
- name: Delete .my.conf
file:
path: /root/.my.cnf
state: absent
Untuk menjalankan playbook, Anda perlu membuat file setup-mysql.yaml
dengan konten di atas dan hosts.yaml
dengan konten file host kemudian gunakan perintah berikut untuk mengeksekusi:
ansible-playbook -i hosts.yaml setup-mysql.yaml -vv
Kesimpulan
Dalam panduan ini, kami dapat menggunakan ansible untuk menginstal mysql server 8 pada host centos 8 menggunakan ansible.
Ansible memberi kita cara untuk mengotomatisasi proses. Ini dapat digunakan untuk menyiapkan beberapa instance dengan cara yang dapat diprediksi menggunakan satu perintah.