MySQL je open-source systém pro správu relačních databází. Je to jeden z populárních systémů pro správu relací.
Mysql se běžně instaluje jako součást oblíbeného zásobníku LAMP nebo LEMP (Linux, Apache/Nginx, MySQL/MariaDB, PHP/Python/Perl).
V této příručce budeme používat mysql 8 na Centos 8. Tato příručka funguje také na jiných derivátech RHEL 8, jako je Rocky Linux 8 a Alma Linux 8
Zkontrolujte také:
- Jak nainstalovat a nastavit mysql 8 na Ubuntu 20.04
- Instalace a konfigurace Mysql Server 8 na Centos 8
- Jak nainstalovat a nakonfigurovat Mysql Server 8 na Fedoře 34/35
- Oprávnění Mysql – vytvářet, aktualizovat, mazat uživatele databáze
- Nainstalujte a nastavte Nginx, WordPress a Mysql 8 v Centos 8
- Vytvořte instanci RDS v terraformu s příkladem Mariadb
Požadavky
- Připojení k internetu
- Ansible nainstalován lokálně
Soubor hostitelů
Požadujeme soubor hosts, který bude definovat servery, na které cílíme:
all:
hosts:
db-server:
ansible_ssh_host: 192.168.10.2
ansible_ssh_user: centos
ansible_ssh_private_key_file: ~/.ssh/server_key
Výše uvedený yaml definuje server db-server
který má ip 192.168.10.2
a lze k nim přistupovat pomocí uživatele centos
a ~/.ssh/server_key
.
Otestujte to pomocí:
ssh -i ~/.ssh/server_key [email protected]
Příručka ansible
Než definujeme své úkoly, musíme říci ansible několik věcí:
- 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
Vysvětlení:
name
definuje playbook popisným názvem toho, co dělá, není to povinné.hosts
definuje hostitele, na které se má cílit, jak je definováno vhosts
nebohosts.yaml
soubor definovaný výše.gather_facts
definuje, zda chceme před zpracováním úkolů shromáždit os fakta. v našem případě nechcemebecome
definuje, že chceme provádět své úkoly jako rootvars
definuje proměnné, které chceme znovu použít v našich úkolech. Definovali jsmemysql_root_password
aansible_python_interpreter
v našem případě
Ansible úkoly
Po části výše nyní musíme definovat naše úkoly. Tyto úkoly lze přidat do role nebo zadat jako úkoly. V našem případě je použijeme jako úkoly (úplnou příručku naleznete na konci této příručky).
Ujistěte se, že je nainstalován požadovaný software
Než budeme pokračovat, chceme nainstalovat veškerý software, který bychom potřebovali. Patří mezi ně software mysql-server
specifický pro mysql a mysql-devel
a podpůrný software, jako je software související s pythonem, který bude používat ansible pro připojení a nastavení instance serveru mysql. Používáme ansible dnf
modul k tomu.
- name: Ensure required packages are installed
dnf:
name:
- mysql-server
- mysql-devel
- python39
- python39-devel
- python39-pip
- gcc
state: latest
Nainstalujte požadované moduly pip
Ansible používá PyMySQL
modul v python3 pro připojení a nastavení serveru mysql. Nainstalujte jej pomocí ansible pip
modul
- name: Install Required pip modules
pip:
name:
- PyMySQL
state: present
executable: pip3
Spusťte a povolte službu mysql
Protože se chceme připojit a provádět operace na serveru, začněme jej touto úlohou. Protože centos 8 používá systemd
Chcete-li spravovat dlouho běžící procesy, spusťte a povolte mysqld pomocí ansible systemd
modul:
- name: Ensure mysql service is running
systemd:
name: mysqld
state: started
enabled: yes
Zajistěte, aby se uživatel root mohl přihlásit z místního serveru
root
mysql uživatel je výchozí administrátor, který má oprávnění ke všem prostředkům na serveru. Osvědčeným postupem by bylo povolit přístup pouze prostřednictvím tohoto uživateleroot
v místním systému, když děláme úkoly správce, jinak vytvořte vyhrazeného uživatele pro každé připojení, tj. pro každou aplikaci mějte uživatele, který má přístup pouze k této databázi.
- 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
Ve výše uvedené definici úlohy:
mysql_root_password
proměnná bude vybrána zvars
definované dříveitem
je smyčka hodnot definovaných vwith_items
sekce.check_implicit_admin
říká ansible zkusit se přihlásit bez hesla, což by mělo fungovat, protože se jedná o novou instalaci. Součástí toho jepassword
bude nastaveno pro uživatele root
Přidejte my.cnf
do domácího dir
Nyní, když jsme nastavili heslo ve výše uvedené úloze, chtěli bychom heslo zadat při provádění více úloh jako uživatel root. Můžeme to poskytnout v ~/.my.cnf
, soubor, který se kontroluje na přihlašovací údaje pokaždé, když spustíme příkazy mysql.
Vytvořte soubor my.cnf.j2
v aktuálním adresáři:
[client]
user=root
password={{ mysql_root_password }}
Pak je úkolem zkopírovat do /root/.my.cnf
protože úlohy spouštíme jako uživatel root.
- name: Add .my.cnf to user home
template:
src: my.cnf.j2
dest: /root/.my.cnf
Znovu načíst oprávnění
Spusťte následující úlohu, abyste znovu načetli oprávnění pro změny, které jsme dosud provedli, aby se uplatnily:
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
Odstranit anonymní uživatele
Je to dobrá praxe pro odstranění anonymních uživatelů. Udělejme to pomocí tohoto úkolu:
- name: Remove anonymous users
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- DELETE FROM mysql.user WHERE User=''
changed_when: False
Zakázat rootovi vzdálené přihlášení
Spusťte následující pro odstranění položek v mysql.user
stůl. To zajistí, že uživatel root se může přihlásit pouze lokálně:
- 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
Odstranění testovací databáze a přístup k ní
Protože testovací databázi nepotřebujeme, můžeme ji odstranit pomocí této úlohy:
- 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
Znovu načíst oprávnění
Chcete-li použít změny, které jsme provedli výše, znovu načtěte oprávnění pomocí této úlohy:
- name: Reload privilege tables
command: |
mysql -p{{ mysql_root_password }} -ne "{{ item }}"
with_items:
- FLUSH PRIVILEGES
changed_when: False
Smažte .my.cnf
které jsme zkopírovali.
Z bezpečnostních důvodů odeberte /root/.my.cnf
protože obsahuje root přístup:
- name: Delete .my.conf
file:
path: /root/.my.cnf
state: absent
Celá příručka
Toto je celá příručka se všemi úkoly:
---
- 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
Chcete-li spustit playbook, musíte vytvořit soubor setup-mysql.yaml
s výše uvedeným obsahem a hosts.yaml
s obsahem souboru hosts pak proveďte následující příkaz:
ansible-playbook -i hosts.yaml setup-mysql.yaml -vv
Závěr
V této příručce jsme byli schopni použít ansible k instalaci serveru mysql 8 na hostitele centos 8 pomocí ansible.
Ansible nám dává způsob, jak proces automatizovat. To lze použít k nastavení více instancí předvídatelným způsobem pomocí jediného příkazu.