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:
namemendefinisikan buku pedoman sebagai nama deskriptif tentang apa yang dilakukannya, tidak wajib memilikinya.hostsmendefinisikan host yang akan ditargetkan seperti yang didefinisikan dalamhostsatauhosts.yamlfile yang ditentukan di atas.gather_factsmendefinisikan apakah kita ingin dapat mengumpulkan fakta sebelum memproses tugas. dalam kasus kami, kami tidak inginbecomemendefinisikan bahwa kita ingin menjalankan tugas kita sebagai rootvarsmendefinisikan variabel yang ingin kita gunakan kembali dalam tugas kita. Kami mendefinisikanmysql_root_passworddanansible_python_interpreterdalam 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_passwordvariabel akan diambil darivarsditentukan sebelumnyaitemadalah loop dari nilai yang didefinisikan dalamwith_itemsbagian.check_implicit_adminmemberitahu kemungkinan untuk mencoba masuk tanpa kata sandi yang seharusnya berfungsi karena ini adalah pemasangan baru. Sebagai bagian dari ini,passworddisediakan 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.