Типовой проект Ansible
С ansible моя жизнь тесно связана уже на протяжении нескольких лет. Написано много ролей, выполняющих типовые разворачивания. Кроме того, автоматизированы сборки и генерации отчетов из SQL БД. Написаны роли по резервному копированию. В общем всё, что требует автоматизации, делается средствами ansible. Конечно, в случае сборки отчетов и резервных копий просто ansible неудобен, но в связке, например с Jenkins, подходит для решения поставленных задач. Исходя из всего вышесказанного, я для себя определил как должен выглядеть типовой проект Ansible. Об этом и пойдет речь в данной статье. Кстати, с документаций у ansible все в порядке, описание модулей можно найти по ссылке: https://docs.ansible.com/ansible/latest/collections/index.html
В процессе использования этого инструмента я выбрал для себя определенный шаблон, по которому строю все проекты. Скорее всего ничего нового для знающих людей не скажу. А для новичков информация может быть полезна. Кроме того, по моему мнению, линейное выполнение задач через tasks (выполнение задач без вызова ролей в том же блоке, где описаны хосты) затрудняет читабельность кода и ломает структуру. Хотя на вкус и цвет, как говорится, товарищей нет.
Итак, моя структура проекта выглядит следующим образом:
Папка group_vars необходима для задания переменных, как для всех серверов, так и для выбранной группы:
- group_vars/all — описываются переменные, применение которых возможно в любой роли;
- group_vars/for_custom_group — тут собираются переменные, специфичные для нескольких серверов из группы выполнения.
В папке host_vars — определяются переменные, которые специфичны только для указанного хоста. Такие как IP адрес, возможно какой-то нестандартный путь к логам или путь к файлам сайта. Больше про уровни и приоритеты переменных можно прочитать по ссылке.
Директория roles содержит написанные роли. Структура роли не сложная:
- defaults/main.yml — используется для определения переменных по умолчанию. Я использую для описания того, какие в принципе есть переменные в роли, предварительно закомментировав их. Всё-таки считаю, что рабочие переменные должны быть определены в group_vars и host_vars, это упрощает поиск связности;
- handlers/main.yml — необходим для описания обработчиков. Например, в задачах описано изменение нескольких конфигурационных файлов. Вполне возможно, что конфиги вообще не изменились. Для того, что бы избежать ненужной перезагрузки и используются обработчики. То есть, если файл конфига изменился, ansible запоминает, что необходимо запустить такой-то обработчик и запустит его в самом конце playbook. В случае отсутствия изменений обработчик не запустится и состояние сервиса не изменится;
- tasks/main.yml — основной файл в котором описывается список задач;
- templates/template.j2 — в этой папке хранятся шаблоны файлов из которых в tasks будут формироваться готовые конфиги, применяя переменные;
- files/file.file — используется для хранения статических файлов. Стараюсь не использовать, так как они занимают место в репозитории. Если нужен какой-то стаческий файл, выкладываю в локальное хранилище и скачиваю от туда внутри задачи. Кстати, как развернуть локальный репозиторий на Nginx можно почитать перейдя по ссылке.
Файл ansible.cfg — позволяет задавать настройки окружения ansible. Например, в блоке defaults я определил следующее:
[defaults]
inventory=./hosts # путь до фала хостов
remote_tmp=$HOME/.ansible/tmp #папка, для выполнения ansible скриптов на исполняемом хосте
forks=50 # количество потоков
library = library/modules # путь до папки собственных модулей
hosts — файл, в котором описаны все хосты, на которых должно выполниться действие с указанием группы. Мне больше по душе yaml формат, но возможно использование и ini.
all:
children:
mariadb_servers:
hosts:
cms_wp:
sc_cms_wp:
webservers:
hosts:
cms_wp:
sc_cms_wp:
Последний файл, run_playbook.yml. Тут нет ничего связанного с выполняемыми задачами, только запуски нужных ролей на группах хостов:
- name: "Initial MariaDB"
become: yes
hosts: mariadb_servers
gather_facts: yes
roles:
- mariadb
Так выглядит мой типовой проект Ansible, ничего сложного, если потратить немного времени и вникнуть в структуру.