sql >> Databáze >  >> RDS >> MariaDB

Úvod do nasazení MySQL pomocí Ansible role

Ansible automatizuje a zjednodušuje opakující se, složité a únavné operace. Jedná se o stroj pro automatizaci IT, který automatizuje poskytování cloudu, správu konfigurace, nasazení aplikací, orchestraci v rámci služeb a mnoho dalších potřeb IT. Nevyžaduje žádné agenty, používá pouze SSH k přenášení změn z jednoho zdroje do více vzdálených zdrojů bez další konfigurace vlastní bezpečnostní infrastruktury a k popisu automatizačních úloh používá jednoduchý jazykový formát (YAML).

Instalace samostatného serveru MySQL je jednoduchý a přímočarý úkol, ale může to být problematické, pokud máte k dispozici více databázových serverů, verzí, platforem a prostředí. Nástroj pro správu konfigurace je tedy způsob, jak zlepšit efektivitu, odstranit opakování a omezit lidské chyby.

V tomto příspěvku na blogu vás provedeme základy automatizace Ansible pro MySQL a také správou konfigurace s příklady a vysvětleními. Začneme jednoduchým samostatným nasazením MySQL, jak je znázorněno na následujícím diagramu na vysoké úrovni:

Instalace Ansible

Pro tento návod potřebujeme mít alespoň dva hostitele – jeden hostitel je pro Ansible (můžete použít pracovní stanici místo serveru) a další je cílový hostitel, kterého chceme nasadit MySQL server.

Chcete-li nainstalovat Ansible na CentOS 7, jednoduše spusťte následující příkazy:

(ansible-host)$ yum install -y epel-release

(ansible-host)$ yum install -y ansible

Pro jiné distribuce OS se podívejte na instalační příručku Ansible.

Nastavení SSH bez hesla

Používání hesla během SSH je podporováno, ale klíče SSH bez hesla s ssh-agent jsou jedním z nejlepších způsobů použití Ansible. Prvním krokem je konfigurace SSH bez hesla, protože Ansible provede nasazení výhradně tímto kanálem. Nejprve vygenerujte klíč SSH na hostiteli Ansible:

(ansible-host)$ whoami

root

(ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa

Měli byste získat vygenerované alespoň následující soubory:

(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

Aby bylo povoleno SSH bez hesla, musíme zkopírovat veřejný klíč SSH (id_rsa.pub) na vzdálený hostitel, ke kterému chceme přistupovat. K provedení tohoto úkolu můžeme použít nástroj ssh-copy-id. Musíte však znát heslo uživatele cílového hostitele a na cílovém hostiteli je povoleno ověřování heslem:

(ansible-host)$ whoami

root

(ansible-host)$ ssh-copy-id [email protected]

Výše uvedený příkaz vás vyzve k zadání hesla uživatele root 192.168.0.221, stačí zadat heslo a klíč SSH pro aktuálního uživatele hostitele Ansible bude zkopírován do cílového hostitele, 192.168.0.221 do ~/.ssh/authorized_keys, což znamená, že autorizujeme tento konkrétní klíč pro vzdálený přístup k tomuto serveru. Chcete-li to vyzkoušet, měli byste být schopni spustit následující vzdálený příkaz bez hesla z hostitele Ansible:

(ansible-host)$ ssh [email protected] "hostname -I"

192.168.0.221

V případě, že nemáte povoleno používat uživatele root pro SSH (např. "PermitRootLogin no" v konfiguraci SSH), můžete místo toho použít uživatele sudo. V následujícím příkladu jsme nastavili SSH bez hesla pro uživatele sudo s názvem „vagrant“:

(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]

Pokud cílový server neumožňuje ověření hesla pomocí SSH, jednoduše zkopírujte obsah veřejného klíče SSH na adrese ~/.ssh/id_rsa.pub ručně do ~/.ssh/authorized_keys cílového hostitele soubor. Například na hostiteli Ansible načtěte obsah veřejného klíče:

(ansible-host)$ cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]

Připojte se k cílovému hostiteli a vložte veřejný klíč hostitele Ansible do ~/.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]

Nyní můžete zkusit spustit vzdálený příkaz z hostitele Ansible pro ověření a neměli byste být vyzváni k zadání žádného hesla. V tomto okamžiku je nakonfigurováno naše SSH bez hesla.

Definování cílového hostitele

Dále musíme definovat cílového hostitele, hostitele, kterého chceme spravovat pomocí Ansible. Na základě naší architektury se chystáme nasadit pouze jeden MySQL server, který je 192.168.0.221. Přidejte následující řádky do /etc/ansible/hosts:

[db-mysql]

192.168.0.221

Výše uvedené jednoduše znamená, že jsme definovali skupinu nazvanou "db-mysql", která bude identifikátorem, když budeme odkazovat na cílového hostitele v Ansible playbooku. Můžeme také vypsat všechny IP adresy nebo názvy hostitelů cílových hostitelů v této skupině. V tuto chvíli máme k nasazení pouze jeden server MySQL, takže existuje pouze jeden záznam. Můžete také zadat libovolné pravidlo pro shodu hostitelů v jedné skupině, například:

[db-mysql]

192.168.0.[221:223]

Výše uvedená definice znamená, že v této skupině máme 3 hostitele s následujícími IP adresami:

  • 192.168.0.221
  • 192.168.0.222
  • 192.168.0.223

Existuje mnoho způsobů a pravidel, jak přiřadit a seskupit cílové hostitele, jak je uvedeno v průvodci inventářem Ansible.

Výběr ansible role

Abychom Ansible řekli, co má nasadit, musíme definovat kroky nasazení v souboru ve formátu YML zvaném playbook. Jak možná víte, instalace kompletního serveru MySQL vyžaduje několik kroků k uspokojení všech závislostí MySQL, konfigurace po instalaci, vytvoření uživatele a schématu a tak dále. Společnost Ansible poskytla řadu modulů MySQL, které nám mohou pomoci, ale přesto musíme napsat příručku pro kroky nasazení.

Pro zjednodušení kroků nasazení můžeme použít existující role Ansible. Ansible role je nezávislá komponenta, která umožňuje opakované použití běžných konfiguračních kroků. V playbooku musí být použita role Ansible. V Ansible Galaxy je k dispozici řada rolí MySQL Ansible, což je úložiště rolí Ansible, které lze vložit přímo do vašich příruček.

Pokud vyhledáte "mysql", získáte spoustu rolí Ansible pro MySQL:

Použijeme ten nejoblíbenější s názvem „mysql“ od geerlingguye. Můžete se rozhodnout používat jiné role, ale většinou ta nejstahovanější bývá pro obecné účely, což ve většině případů obvykle funguje dobře.

Na hostiteli Ansible spusťte následující příkaz ke stažení role Ansible:

(ansible-host)$ ansible-galaxy install geerlingguy.mysql

Role bude stažena do ~/.ansible/roles/geerlingguy.mysql/ aktuálního uživatele.

Psaní příručky Ansible

Když se podíváme na soubor Readme role Ansible, můžeme postupovat podle vzorové příručky, kterou poskytujeme. Nejprve vytvořte soubor playbook s názvem deploy-mysql.yml a přidejte následující řádky:

(ansible-host)$ vim ~/deploy-mysql.yml

- hosts: db-mysql

  become: yes

  vars_files:

    - vars/main.yml

  roles:

    - { role: geerlingguy.mysql }

Ve výše uvedených řádcích definujeme cílového hostitele, což jsou všichni hostitelé pod položkami db-mysql v /etc/ansible/hosts. Další řádek (stane se) říká Ansible spustit playbook jako uživatel root, což je pro roli nezbytné (je to tam uvedeno v souboru Readme). Dále definujeme umístění souboru proměnných (var_files) umístěného na adrese vars/main.yml vzhledem k cestě k playbooku.

Vytvořme adresář a soubor proměnné a zadejte následující řádek:

(ansible-host)$ mkdir vars

(ansible-host)$ vim vars/main.yml

mysql_root_password: "theR00tP455w0rd"

Další informace naleznete v části Proměnné role v souboru Readme této role.

Spusťte implementaci

Nyní jsme připraveni zahájit nasazení MySQL. Použijte příkaz ansible-playbook k provedení našich definic playbooku:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Ve výstupu byste měli vidět spoustu řádků. Zaměřte se na poslední řádek, kde shrnuje nasazení:

PLAY RECAP ***************************************************************************************************************************************

192.168.0.221              : ok=36 changed=8 unreachable=0    failed=0 skipped=16 rescued=0 ignored=0

Pokud se vše rozsvítí zeleně a je v pořádku, můžete na hostiteli databáze ověřit, zda je náš server MySQL již nainstalován a spuštěn:

(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

Jak můžete vidět z výše uvedeného, ​​pro CentOS 7 je výchozí instalací MySQL MariaDB 5.5 jako součást standardního úložiště balíčků. V tuto chvíli je naše nasazení považováno za dokončené, rádi bychom však naše nasazení dále přizpůsobili, jak je uvedeno v dalších částech.

Přizpůsobení nasazení

Nejjednodušší definice v playbooku nám poskytuje velmi základní instalaci a používá všechny výchozí možnosti konfigurace. Instalaci MySQL můžeme dále přizpůsobit rozšířením/úpravou/připojením playbooku, aby bylo možné provést následující:

  • upravit možnosti konfigurace MySQL
  • přidat uživatele databáze
  • přidat schéma databáze
  • nakonfigurujte uživatelská oprávnění
  • nakonfigurujte replikaci MySQL
  • nainstalujte MySQL od jiných dodavatelů
  • importujte vlastní konfigurační soubor MySQL

Instalace MySQL z úložiště Oracle

Ve výchozím nastavení role nainstaluje výchozí balíček MySQL, který je součástí distribuce OS. Pokud jde o CentOS 7, ve výchozím nastavení byste si nainstalovali MariaDB 5.5. Předpokládejme, že chceme nainstalovat MySQL od jiného dodavatele, můžeme rozšířit playbook o pre_tasks, což je úloha, kterou Ansible provede před provedením jakékoli úlohy uvedené v libovolném souboru .yml, jak ukazuje následující příklad:

(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"

Spustit příručku:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Výše uvedené místo toho nainstaluje MySQL z úložiště Oracle. Výchozí verze, kterou byste získali, je MySQL 5.6. Spuštění výše uvedené příručky na cílovém hostiteli, který již má spuštěnou starší verzi MySQL/MariaDB, by pravděpodobně selhalo kvůli nekompatibilitě.

Vytváření databází MySQL a uživatelů

Uvnitř vars/main.yml můžeme definovat databázi MySQL a uživatele, které chceme, aby Ansible konfiguroval na našem serveru MySQL pomocí modulů mysql_database a mysql_users, hned po naší předchozí definici na 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"

Definice přikazuje Ansible vytvořit dvě databáze, "myshop" a "sysbench", následovat svého příslušného uživatele MySQL se správnými oprávněními, povoleným hostitelem a heslem.

Znovu spusťte příručku, aby se změna uplatnila na našem serveru MySQL:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Tentokrát Ansible vyzvedne všechny změny, které jsme provedli v vars/main.yml, aby je použil na náš server MySQL. Můžeme ověřit na serveru MySQL pomocí následujících příkazů:

(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.%'                                                  |

+------------------------------------------------------------------------------------------------------------------------+

Povolení protokolu pomalého dotazování

Tato role podporuje povolení protokolu pomalých dotazů MySQL, můžeme definovat umístění souboru protokolu a také dobu pomalého dotazování. Přidejte potřebné proměnné do souboru 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'

Znovu spusťte příručku, abyste použili změny:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Příručka provede nezbytné změny v možnostech souvisejících s pomalým dotazem MySQL a automaticky restartuje server MySQL, aby se načetly nové konfigurace. Poté můžeme ověřit, zda jsou nové možnosti konfigurace správně načteny na serveru 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 |

+------------------+-----------------------+-------------------+

Včetně vlastního konfiguračního souboru MySQL

Proměnné role Ansible a proměnné MySQL jsou dvě různé věci. Autor této role vytvořil řadu proměnných souvisejících s MySQL, které lze reprezentovat proměnnými role Ansible. Převzato ze souboru Readme, zde jsou některé z nich:

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*

Pokud vygenerovaná konfigurace nesplňuje naše požadavky na MySQL, můžeme do nasazení zahrnout vlastní konfigurační soubory MySQL pomocí proměnné mysql_config_include_files. Přijímá pole hodnot oddělených čárkou s "src" jako předponou pro skutečnou cestu na hostiteli Ansible.

Nejprve musíme připravit vlastní konfigurační soubory na hostiteli Ansible. Vytvořte adresář a jednoduchý konfigurační soubor MySQL:

(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

Řekněme, že máme další konfigurační soubor speciálně pro konfiguraci mysqldump:

(ansible-host)$ vim /root/custom-config/mysqldump.cnf

[mysqldump]

max_allowed_packet=128M

Chcete-li tyto konfigurační soubory importovat do našeho nasazení, definujte je v poli mysql_config_include_files v souboru 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'

]

Všimněte si, že /root/custom-config/mysqld-severalnines.cnf a /root/custom-config/mysqldump.cnf existují uvnitř hostitele Ansible.

Znovu spusťte příručku:

(ansible-host)$ ansible-playbook deploy-mysql.yml

Příručka importuje tyto konfigurační soubory a umístí je do adresáře include (v závislosti na operačním systému), kterým je /etc/my.cnf.d/ pro CentOS 7. Příručka automaticky restartuje Server MySQL načte nové možnosti konfigurace. Poté můžeme ověřit, zda jsou nové možnosti konfigurace správně načteny:

(mysql-host)$ mysql -uroot -p -e 'select @@max_connections'

250

(mysql-host)$ mysqldump --help | grep ^max-allowed-packet

max-allowed-packet                134217728

Závěr

Ansible lze použít k automatizaci nasazení databáze a správy konfigurace s trochou znalostí skriptování. Mezitím ClusterControl používá podobný přístup SSH bez hesla k nasazení, monitorování, správě a škálování vašeho databázového clusteru od A do Z s uživatelským rozhraním a nepotřebuje žádné další dovednosti k dosažení stejného výsledku.


  1. Vložit data z jedné tabulky do druhé v MySQL

  2. Využití mezipaměti contrib's pg_prewarm a pg_hibernator v PostgreSQL 9.4.

  3. Vývojářské nástroje pro přímý přístup k databázím

  4. Začínáme s SQL Server 2017 na Linuxu na Azure Portal