MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Въведение в внедряването на MySQL с помощта на Ansible роля

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 подход без парола за разгръщане, наблюдение, управление и мащабиране на клъстера на вашата база данни от А до Я, с потребителски интерфейс и не се нуждае от допълнителни умения за постигане на същия резултат.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB Единици за дата и време

  2. Разбиране на индексите в MySQL:Част втора

  3. Как DATE_SUB() работи в MariaDB

  4. Как работи CURTIME() в MariaDB

  5. 7 опции за активиране на тръби (||) като оператор за конкатенация в MariaDB