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í:
namedefinuje playbook popisným názvem toho, co dělá, není to povinné.hostsdefinuje hostitele, na které se má cílit, jak je definováno vhostsnebohosts.yamlsoubor definovaný výše.gather_factsdefinuje, zda chceme před zpracováním úkolů shromáždit os fakta. v našem případě nechcemebecomedefinuje, že chceme provádět své úkoly jako rootvarsdefinuje proměnné, které chceme znovu použít v našich úkolech. Definovali jsmemysql_root_passwordaansible_python_interpreterv 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_passwordproměnná bude vybrána zvarsdefinované dříveitemje smyčka hodnot definovaných vwith_itemssekce.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 jepasswordbude 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.