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.