Ansible практика – урок №7: Копирование файлов на удаленный сервер.

Предыдущий урок: 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 не станет делать лишнюю работу, копируя файл снова.

Следующий урок: Ansible практика – урок №8: Использование notify и handler.