Организация с помощью ролей

AnsibleBeginner
Практиковаться сейчас

Введение

Когда вы только начинаете работать с Ansible, хранить всё в одном большом файле playbook.yml вполне нормально. Но по мере роста автоматизации до сотен строк этот файл превращается в беспорядок.

Решение — роли Ansible.

Роли похожи на папки в картотечном шкафу. Вместо одного огромного документа вы разделяете содержимое на логические папки: отдельную папку для задач «Веб-сервер», отдельную — для задач «База данных» и так далее.

Роли важны, потому что автоматизация со временем превращается в разработку программного обеспечения. Когда плейбуки выходят за рамки нескольких задач, структура, именование и повторное использование становятся не менее важными, чем успешный первый запуск.

В этой лабораторной работе вы:

  1. Создадите стандартизированную структуру роли с помощью ansible-galaxy.
  2. Перенесёте задачи в эту роль.
  3. Запустите роль из простого «главного плейбука».

Роли важны, потому что масштабируемой автоматизации нужна структура. По мере роста кодовой базы организация становится столь же важной, как и первый успешный запуск.

Инициализация роли

Сначала создадим структуру каталогов. Вы можете создать все каталоги вручную, но в 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.

  1. Инициализировали роль: использовали ansible-galaxy для создания стандартной структуры каталогов.
  2. Определили задачи: разместили логику в tasks/main.yml.
  3. Использовали роль: подключили роль из чистого и простого главного плейбука site.yml.

По мере написания новых сценариев автоматизации вы будете создавать роли для всего необходимого — например, apache, mysql, common. Это сделает код повторно используемым и удобным для чтения.