Введение
Когда вы только начинаете работать с Ansible, хранить всё в одном большом файле playbook.yml вполне нормально. Но по мере роста автоматизации до сотен строк этот файл превращается в беспорядок.
Решение — роли Ansible.
Роли похожи на папки в картотечном шкафу. Вместо одного огромного документа вы разделяете содержимое на логические папки: отдельную папку для задач «Веб-сервер», отдельную — для задач «База данных» и так далее.
Роли важны, потому что автоматизация со временем превращается в разработку программного обеспечения. Когда плейбуки выходят за рамки нескольких задач, структура, именование и повторное использование становятся не менее важными, чем успешный первый запуск.
В этой лабораторной работе вы:
- Создадите стандартизированную структуру роли с помощью
ansible-galaxy. - Перенесёте задачи в эту роль.
- Запустите роль из простого «главного плейбука».
Роли важны, потому что масштабируемой автоматизации нужна структура. По мере роста кодовой базы организация становится столь же важной, как и первый успешный запуск.
Инициализация роли
Сначала создадим структуру каталогов. Вы можете создать все каталоги вручную, но в Ansible есть инструмент ansible-galaxy, который сделает это за вас.
Такая стандартная структура полезна, потому что для задач, переменных, файлов, шаблонов и обработчиков в каждой роли предусмотрены предсказуемые места. Когда структура остаётся единообразной, командам проще читать автоматизацию друг друга.
Перейдите в каталог проекта:
cd ~/project
Создайте каталог для хранения ролей:
mkdir roles
Теперь создайте новую роль с именем myrole. Представьте, что вы создаёте «пакет» или «модуль» для своей автоматизации.
ansible-galaxy init roles/myrole
Посмотрим, что было создано:
ls -R roles/myrole
Вы увидите несколько каталогов (tasks, handlers, vars и другие).
- tasks: здесь находятся сами шаги — установка, запуск, копирование.
- vars: здесь находятся переменные.
- files: здесь находятся статические файлы, например изображения.
Сегодня мы сосредоточимся на каталоге tasks.
Определение задач роли
Теперь добавим в роль рабочие действия. Основной список задач роли находится в tasks/main.yml.
Мы создадим простую задачу, которая устанавливает команду tree — полезную утилиту для просмотра структуры каталогов.
Откройте файл с задачами роли:
nano roles/myrole/tasks/main.yml
Добавьте следующее содержимое. Обратите внимание: здесь не нужно начинать с tasks:, потому что вы уже находитесь внутри файла задач.
---
## tasks file for roles/myrole
- name: Ensure tree is installed
apt:
name: tree
state: present
become: yes
Главное отличие: в обычном плейбуке есть раздел tasks:. В роли сам файл является списком задач, поэтому задачи сразу перечисляются в нём.
Такое разделение — одна из причин, по которой роли повышают повторное использование. Роль отвечает за отдельную, чётко определённую часть логики автоматизации, а плейбук решает, когда и где её подключить.
Сохраните файл и выйдите из редактора.
Создание главного плейбука
Теперь у вас есть роль, но сама по себе роль не запускается. Нужен «главный плейбук», который её подключит.
Создайте файл с именем site.yml в основном каталоге проекта:
nano ~/project/site.yml
Этот плейбук будет очень коротким. Он просто сообщает: «На этих узлах запустите эту роль».
Теперь плейбук становится скорее оркестратором, чем контейнером для всех подробностей. Именно такое архитектурное изменение и призваны обеспечить роли.
---
- hosts: localhost
connection: local
roles:
- myrole
Разбор кода:
roles:: вместо спискаtasks:мы указываем список ролей.- myrole: Ansible ищет каталог с именемmyroleвнутри каталогаroles/и выполняет всё, что находится вtasks/main.yml.
Сохраните файл и выйдите из редактора.
Проверка и запуск
Перед запуском убедимся, что в командах нет опечаток. В Ansible есть встроенная проверка синтаксиса.
Выполните команду:
ansible-playbook -i inventory --syntax-check site.yml
Если всё в порядке, команда выведет только playbook: site.yml.
При наличии ошибок внимательно прочитайте сообщение: обычно оно указывает точный номер строки, в которой нарушены отступы.
Теперь запустите плейбук:
ansible-playbook -i inventory site.yml
В выводе должна выполниться задача из вашей роли: TASK [myrole : Ensure tree is installed] ... changed
Итоги
В этой лабораторной работе вы изучили «профессиональный» способ структурирования Ansible.
- Инициализировали роль: использовали
ansible-galaxyдля создания стандартной структуры каталогов. - Определили задачи: разместили логику в
tasks/main.yml. - Использовали роль: подключили роль из чистого и простого главного плейбука
site.yml.
По мере написания новых сценариев автоматизации вы будете создавать роли для всего необходимого — например, apache, mysql, common. Это сделает код повторно используемым и удобным для чтения.


