Предыдущий урок: Ansible практика – урок №6: Оптимизация плейбука с помощью block.
С каждым уроком мы улучшаем наш плейбук. С его помощью мы устанавливаем сервисы и управляем ими. Я вас не удивлю, если скажу, что Ansible так же отлично работает с файлами.
Когда копировать файлы?
В целом, нет никаких ограничений на этот счет, но одно из основных применений данной функции при настройке серверов – импорт файлов конфигураций, для настройки сервисов. Давайте рассмотрим подобный случай в рамках нашей практики.
Копирование файлов на удаленный сервер.
На наших управляемых хостах работают разные сервисы – PHP, NGINX, MariaDB. Но все они используют настройки по умолчанию. Давайте внесем коррективы в настройки MariaDB.
Шаг 1: Небольшая вводная
Настройка сервера базы данных это тема объемная и достойная отдельной статьи, а то и серии уроков. Выбор конкретных значений и лимитов зависит от сервера, ресурсов, нагрузки и прочего. На тестовом окружении это все не имеет значения, а на реальных серверах нужно исходить из реальных условий.
Но есть настройки, который точно будут полезными. Одна из них – логирование медленных запросов. По умолчанию данная функция отключена в MariaDB. Можете проверить на любой Managed Node:
[root@Managed-Node-1 ~]# mariadb -e 'SHOW VARIABLES LIKE "slow_query_log";'
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
[root@Managed-Node-1 ~]#
Такое логирование запросов – очень нужная вещь для веб сервера, давайте включим ее.
Шаг 2: Таск на копирование файла
Создадим директорию roles/mariadb/files:
[root@Control-Node ansible]# mkdir roles/mariadb/files
[root@Control-Node ansible]#
А в ней файл roles/mariadb/files/logs.cnf со следующим содержанием:
[mysqld]
slow_query_log=1
slow_query_log_file=/var/log/mariadb/slow.log
long_query_time = 2
Пояснение:
[mysqld] – секция основных настроек
slow_query_log – включение (1) логирования медленных запросов
slow_query_log_file – файл логов
long_query_time – время в секундах (2), превышение которого запросом, определяет его как медленный
Допишем задачу на копирование данного файла на хосты в файл roles/mariadb/tasks/main.yml:
---
- name: "Role: MariaDB | Block: Installation"
tags:
- installation
- mariadb
block:
- name: "Install MariaDB on CentOS"
ansible.builtin.dnf:
name: mariadb-server
state: latest
when: ansible_distribution == "CentOS"
- name: "Install MariaDB on Ubuntu"
ansible.builtin.apt:
name: mariadb-server
state: latest
when: ansible_distribution == "Ubuntu"
- name: "Ensure MariaDB is started and enabled"
ansible.builtin.service:
name: mariadb
state: started
enabled: true
tags:
- start
- mariadb
- name: "Role: MariaDB | Block: custom config"
tags:
- mariadb
block:
- name: "Copy custom config file to CentOS"
ansible.builtin.copy:
src: logs.cnf
dest: /etc/my.cnf.d/logs.cnf
owner: root
group: root
mode: '0644'
when: ansible_distribution == "CentOS"
- name: "Copy custom config file to Ubuntu"
ansible.builtin.copy:
src: logs.cnf
dest: /etc/mysql/mariadb.conf.d/logs.cnf
owner: root
group: root
mode: '0644'
when: ansible_distribution == "Ubuntu"
- name: "Reload MariaDB to apply changes"
ansible.builtin.service:
name: mariadb
state: restarted
Мы используем модуль ansible.builtin.copy (документация по модулю).
Он скопирует локальный файл logs.cnf на хосты в директорию /etc/my.cnf.d/, из которой MariaDB подгружает настройки. Следующим таском мы перезагружаем сервис, чтобы новые параметры вступили в силу.
Шаг 3: Раскатка плейбука
Давайте запустим Ansible и проверим результат. Ограничим раскатку тегом mariadb, так как остальные части плейбука остались без изменений:
[root@Control-Node ansible]# ansible-playbook install_lemp.yml --tags mariadb
PLAY [all] ******************************************************************************************************************************************************************************************
TASK [Gathering Facts] ******************************************************************************************************************************************************************************
ok: [Managed-Node-2]
ok: [Managed-Node-1]
ok: [Managed-Node-3]
TASK [mariadb : Install MariaDB on CentOS] **********************************************************************************************************************************************************
skipping: [Managed-Node-3]
ok: [Managed-Node-2]
ok: [Managed-Node-1]
TASK [mariadb : Install MariaDB on Ubuntu] **********************************************************************************************************************************************************
skipping: [Managed-Node-1]
skipping: [Managed-Node-2]
ok: [Managed-Node-3]
TASK [mariadb : Ensure MariaDB is started and enabled] **********************************************************************************************************************************************
ok: [Managed-Node-1]
ok: [Managed-Node-2]
ok: [Managed-Node-3]
TASK [mariadb : Copy custom config file to CentOS] **************************************************************************************************************************************************
skipping: [Managed-Node-3]
changed: [Managed-Node-2]
changed: [Managed-Node-1]
TASK [mariadb : Copy custom config file to Ubuntu] **************************************************************************************************************************************************
skipping: [Managed-Node-1]
skipping: [Managed-Node-2]
changed: [Managed-Node-3]
TASK [mariadb : Reload MariaDB to apply changes] ****************************************************************************************************************************************************
changed: [Managed-Node-1]
changed: [Managed-Node-2]
changed: [Managed-Node-3]
PLAY RECAP ******************************************************************************************************************************************************************************************
Managed-Node-1 : ok=5 changed=2 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
Managed-Node-2 : ok=5 changed=2 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
Managed-Node-3 : ok=5 changed=2 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
[root@Control-Node ansible]#
Ansible отработал без ошибок, давайте проверим, включено ли теперь логирование медленных запросов на управляемых нодах:
[root@Managed-Node-1 ~]# mariadb -e 'SHOW VARIABLES LIKE "slow_query_log";'
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | ON |
+----------------+-------+
[root@Managed-Node-1 ~]#
Можете перепроверить на всех серверах, но уверен, там значение тоже сменилось на ON. Теперь если сайт будет долго обрабатывать какой либо SQL запрос, тот попадет в логи и будет доступен для дальнейшего исследования.
Итоги:
Мы научились с помощью Ansible копировать файлы с контрольной машины на управляемые хосты. А благодаря принципу идемпотентности, в случае присутствия копии на хосте, Ansible не станет делать лишнюю работу, копируя файл снова.
Следующий урок: в процессе