Ansible автоматизира и опростява повтарящи се, сложни и досадни операции. Това е машина за ИТ автоматизация, която автоматизира предоставянето на облак, управлението на конфигурацията, внедряването на приложения, оркестрацията в рамките на услугата и много други ИТ нужди. Не изисква агенти, използвайки само SSH за изпращане на промени от един източник към множество отдалечени ресурси без допълнителна персонализирана конфигурация на инфраструктурата за сигурност и използване на прост езиков формат (YAML) за описване на задачите за автоматизация.
Инсталирането на самостоятелен MySQL сървър е проста и ясна задача, но това може да бъде проблематично, ако имате множество сървъри на бази данни, версии, платформи и среди за поддръжка. По този начин наличието на инструмент за управление на конфигурацията е начинът да се подобри ефективността, премахването на повтаряемостта и намаляването на човешките грешки.
В тази публикация в блога ще ви преведем през основите на автоматизацията на Ansible за MySQL, както и управлението на конфигурацията с примери и обяснения. Ще започнем с просто самостоятелно внедряване на MySQL, както е илюстрирано в следната диаграма на високо ниво:
Инсталиране на Ansible
За това ръководство трябва да имаме поне два хоста - един хост е за Ansible (можете да използвате работна станция вместо сървър), а друг е целевият хост, който искаме да разположим MySQL сървър.
За да инсталирате Ansible на CentOS 7, просто изпълнете следните команди:
(ansible-host)$ yum install -y epel-release
(ansible-host)$ yum install -y ansible
За други дистрибуции на ОС вижте ръководството за инсталиране на Ansible.
Настройване на SSH без парола
Поддържа се използването на парола по време на SSH, но SSH ключовете без парола със ssh-agent са един от най-добрите начини за използване на Ansible. Първоначалната стъпка е да конфигурирате SSH без парола, тъй като Ansible ще извърши внедряването само от този канал. Първо, генерирайте SSH ключ на хоста Ansible:
(ansible-host)$ whoami
root
(ansible-host)$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
Трябва да генерирате поне следните файлове:
(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
За да разрешим SSH без парола, трябва да копираме публичния ключ на SSH (id_rsa.pub) на отдалечения хост, до който искаме да имаме достъп. Можем да използваме инструмент, наречен ssh-copy-id, за да изпълним тази задача вместо нас. Трябва обаче да знаете паролата на потребителя на целевия хост и удостоверяването на паролата е разрешено на целевия хост:
(ansible-host)$ whoami
root
(ansible-host)$ ssh-copy-id [email protected]
Горената команда ще изкани root парола от 192.168.0.221, просто въведете паролата и SSH ключът за текущия потребител на хост Ansible ще бъде копиран на целевия хост, 192.168.0.221 в ~/.ssh/authorized_keys, което означава, че упълномощаваме този конкретен ключ за отдалечен достъп до този сървър. За да тествате, трябва да можете да изпълните следната отдалечена команда без парола от Ansible хост:
(ansible-host)$ ssh [email protected] "hostname -I"
192.168.0.221
В случай, когато не ви е позволено да използвате root потребител за SSH (напр. „PermitRootLogin no“ в SSH конфигурация), вместо това можете да използвате sudo потребител. В следващия пример настроихме SSH без парола за потребител на sudo, наречен "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]
Ако целевият сървър не позволява удостоверяване с парола чрез SSH, просто копирайте съдържанието на публичния ключ SSH в ~/.ssh/id_rsa.pub ръчно в ~/.ssh/authorized_keys на целевите хостове файл. Например, на хост Ansible, извлечете съдържанието на публичния ключ:
(ansible-host)$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC5MZjufN0OiKyKa2OG0EPBEF/w23FnOG2x8qpAaYYuqHlVc+ZyRugtGm+TdTJDfLA1Sr/rtZpXmPDuLUdlAvPmmwqIhgiatKiDw5t2adNUwME0sVgAlBv/KvbusTTdtpFQ1o+Z9CltGiENDCFytr2nVeBFxImoZu2H0ilZed/1OY2SZejUviXTQ0Dh0QYdIeiQHkMf1CiV2sNYs8j8+ULV26OOKCd8c1h1O9M5Dr4P6kt8E1lVSl9hbd4EOHQmeZ3R3va5zMesLk1A+iadIGJCJNCVOA2RpxDHmmaX28zQCwrpCliH00g9iCRixlK+cB39d1coUWVGy7SeaI8bzfv3 [email protected]
Свържете се с целевия хост и поставете публичния ключ на хоста на Ansible в ~/.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]
Сега можете да опитате да изпълните отдалечена команда от Ansible хост, за да проверите и не трябва да получавате подкана за парола. В този момент нашият SSH без парола е конфигуриран.
Дефиниране на целевия хост
След това трябва да дефинираме целевия хост, хоста, който искаме да управляваме с Ansible. Въз основа на нашата архитектура, ние ще разположим само един MySQL сървър, който е 192.168.0.221. Добавете следните редове в /etc/ansible/hosts:
[db-mysql]
192.168.0.221
Говорното просто означава, че сме дефинирали група, наречена "db-mysql", която ще бъде идентификаторът, когато се позоваваме на целевия хост в Ansible playbook. Можем също да изброим всички IP адреси или имена на хостове на целевите хостове в тази група. В този момент имаме само един MySQL сървър за внедряване, така че има само един запис. Можете също да посочите всяко правило за съвпадение, за да съответства на хостовете в една група, например:
[db-mysql]
192.168.0.[221:223]
Горната дефиниция означава, че имаме 3 хоста под тази група със следните IP адреси:
- 192.168.0.221
- 192.168.0.222
- 192.168.0.223
Има много начини и правила за съпоставяне и групиране на целевите хостове, както е показано в ръководството за инвентаризация на Ansible.
Избор на Ansible роля
За да кажем на Ansible какво да разположи, трябва да дефинираме стъпките за внедряване в YML форматиран файл, наречен playbook. Както може би знаете, инсталирането на пълен MySQL сървър изисква множество стъпки за задоволяване на всички MySQL зависимости, конфигурация след инсталиране, създаване на потребител и схема и така нататък. Ansible предостави редица MySQL модули, които могат да ни помогнат, но все пак трябва да напишем книга за стъпките за внедряване.
За да опростим стъпките за внедряване, можем да използваме съществуващите роли на Ansible. Ansible ролята е независим компонент, който позволява повторно използване на общи стъпки за конфигуриране. Ролята Ansible трябва да се използва в учебника. Има редица MySQL Ansible роли, налични в Ansible Galaxy, хранилище за Ansible роли, които са достъпни за пускане директно във вашите учебници.
Ако потърсите "mysql", ще получите много Ansible роли за MySQL:
Ще използваме най-популярния, наречен "mysql" от geerlingguy. Можете да изберете да използвате други роли, но най-често най-изтегляната е за общо предназначение, което обикновено работи добре в повечето случаи.
На хоста Ansible изпълнете следната команда, за да изтеглите ролята на Ansible:
(ansible-host)$ ansible-galaxy install geerlingguy.mysql
Ролята ще бъде изтеглена в ~/.ansible/roles/geerlingguy.mysql/ на текущия потребител.
Написване на Ansible Playbook
Като разгледаме Readme на ролята Ansible, можем да проследим предоставената примерна игра. Първо, създайте файл за игра, наречен deploy-mysql.yml и добавете следните редове:
(ansible-host)$ vim ~/deploy-mysql.yml
- hosts: db-mysql
become: yes
vars_files:
- vars/main.yml
roles:
- { role: geerlingguy.mysql }
В горните редове ние дефинираме целевия хост, който е всички хостове под db-mysql записи в /etc/ansible/hosts. Следващият ред (become) казва на Ansible да изпълни playbook като root потребител, което е необходимо за ролята (това е посочено там във файла Readme). След това дефинираме местоположението на файла с променливи (var_files), намиращ се на vars/main.yml, спрямо пътя на книгата.
Нека създадем директорията и файла с променливата и да посочим следния ред:
(ansible-host)$ mkdir vars
(ansible-host)$ vim vars/main.yml
mysql_root_password: "theR00tP455w0rd"
За повече информация вижте секцията Ролеви променливи във файла Readme на тази роля.
Стартирайте внедряването
Сега сме готови да започнем внедряването на MySQL. Използвайте командата ansible-playbook, за да изпълните дефинициите на нашата книга:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Трябва да видите куп редове, които се появяват в изхода. Фокусирайте се върху последния ред, където обобщава внедряването:
PLAY RECAP ***************************************************************************************************************************************
192.168.0.221 : ok=36 changed=8 unreachable=0 failed=0 skipped=16 rescued=0 ignored=0
Ако всичко стане зелено и е наред, можете да проверите на хоста на базата данни, че нашият MySQL сървър вече е инсталиран и работи:
(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
Както можете да видите от горното, за CentOS 7 MySQL инсталацията по подразбиране е MariaDB 5.5 като част от стандартното хранилище на пакети. На този етап внедряването ни се счита за завършено, но бихме искали да персонализираме допълнително внедряването си, както е показано в следващите раздели.
Персонализиране на внедряването
Най-простата дефиниция в playbook ни дава много основна инсталация и използва всички опции за конфигурация по подразбиране. Можем допълнително да персонализираме инсталацията на MySQL, като разширим/модифицираме/добавим книгата за игри, за да направим следното:
- променете опциите за конфигурация на MySQL
- добавете потребител на базата данни
- добавете схема на база данни
- конфигуриране на потребителски привилегии
- конфигуриране на MySQL репликация
- инсталирайте MySQL от други доставчици
- импортирайте персонализиран конфигурационен файл на MySQL
Инсталиране на MySQL от хранилището на Oracle
По подразбиране ролята ще инсталира пакета MySQL по подразбиране, който идва с дистрибуцията на ОС. Що се отнася до CentOS 7, ще получите инсталиран MariaDB 5.5 по подразбиране. Да предположим, че искаме да инсталираме MySQL от друг доставчик, можем да разширим книгата с pre_tasks, задача, която Ansible изпълнява преди да изпълни задачи, споменати във всеки .yml файл, както е показано в следния пример:
(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"
Изпълнете учебника:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Вместо това горното ще инсталира MySQL от хранилището на Oracle. Версията по подразбиране, която ще получите, е MySQL 5.6. Изпълнението на горната книга за изпълнение на целеви хост, който вече има работеща по-стара версия на MySQL/MariaDB, вероятно ще се провали поради несъвместимостта.
Създаване на MySQL бази данни и потребители
Вътре vars/main.yml можем да дефинираме MySQL базата данни и потребителите, които искаме Ansible да конфигурира на нашия MySQL сървър, като използваме модулите mysql_database и mysql_users, веднага след предишната ни дефиниция за 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"
Дефиницията инструктира Ansible да създаде две бази данни, "myshop" и "sysbench", следвайки съответния потребител на MySQL с подходящи привилегии, разрешен хост и парола.
Изпълнете отново учебника, за да приложите промяната в нашия MySQL сървър:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Този път Ansible ще вземе всички промени, които направихме в vars/main.yml, за да бъдат приложени към нашия MySQL сървър. Можем да проверим в MySQL сървъра със следните команди:
(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.%' |
+------------------------------------------------------------------------------------------------------------------------+
Активиране на бавен регистър на заявките
Тази роля поддържа активиране на MySQL бавен дневник на заявките, можем да дефинираме местоположението на регистрационния файл, както и времето за бавна заявка. Добавете необходимите променливи във файла 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'
Повторно стартирайте учебника, за да приложите промените:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Наръчникът ще направи необходимите промени в опциите, свързани с бавните заявки на MySQL, и автоматично ще рестартира MySQL сървъра, за да зареди новите конфигурации. След това можем да проверим дали новите опции за конфигурация са заредени правилно на 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 |
+------------------+-----------------------+-------------------+
Включително персонализиран конфигурационен файл на MySQL
Ansible ролевите променливи и MySQL променливите са две различни неща. Авторът на тази роля е създал редица свързани с MySQL променливи, които могат да бъдат представени с променливи на ролята Ansible. Взети от файла Readme, ето някои от тях:
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*
Ако генерираната конфигурация не удовлетворява нашето MySQL изискване, можем да включим персонализирани MySQL конфигурационни файлове в внедряването, като използваме променливата mysql_config_include_files. Той приема масив от стойности, разделени със запетая, с "src" като префикс за действителния път на Ansible хоста.
На първо място, трябва да подготвим персонализираните конфигурационни файлове на хоста Ansible. Създайте директория и прост конфигурационен файл на 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
Да приемем, че имаме друг конфигурационен файл специално за конфигурация на mysqldump:
(ansible-host)$ vim /root/custom-config/mysqldump.cnf
[mysqldump]
max_allowed_packet=128M
За да импортирате тези конфигурационни файлове в нашето внедряване, дефинирайте ги в масива mysql_config_include_files във файла 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'
]
Обърнете внимание, че /root/custom-config/mysqld-severalnines.cnf и /root/custom-config/mysqldump.cnf съществуват в хоста Ansible.
Повторно стартирайте учебника:
(ansible-host)$ ansible-playbook deploy-mysql.yml
Книгата за изпълнение ще импортира тези конфигурационни файлове и ще ги постави в директорията за включване (в зависимост от операционната система), която е /etc/my.cnf.d/ за CentOS 7. Играта ще рестартира автоматично MySQL сървър за зареждане на новите опции за конфигурация. След това можем да проверим дали новите опции за конфигурация са заредени правилно:
(mysql-host)$ mysql -uroot -p -e 'select @@max_connections'
250
(mysql-host)$ mysqldump --help | grep ^max-allowed-packet
max-allowed-packet 134217728
Заключение
Ansible може да се използва за автоматизиране на внедряването на базата данни и управлението на конфигурацията с малко познания по скриптове. Междувременно ClusterControl използва подобен SSH подход без парола за разгръщане, наблюдение, управление и мащабиране на клъстера на вашата база данни от А до Я, с потребителски интерфейс и не се нуждае от допълнителни умения за постигане на същия резултат.