Структура роли
Тема дорожной карты · Ansible
Структура роли в Ansible представляет собой стандартизированный макет каталогов, который автоматически распознается Ansible и делает роли переносимыми и доступными для повторного использования без явной настройки путей. Создание роли с помощью команды ansible-galaxy role init my_role включает создание подкаталогов, таких как tasks/, handlers/, defaults/, vars/, files/, templates/, meta/ и tests/. В каждом из этих подкаталогов есть файл main.yml, который автоматически загружается при вызове роли. Основной файл tasks/main.yml является обязательным, в то время как все остальные каталоги необязательны и игнорируются, если они пусты. Такая предсказуемая структура роли позволяет Ansible находить ресурсы по соглашению, например, модуль template автоматически находит файлы .j2 в каталоге templates/ без явного указания пути. Именно поэтому следование стандартному макету настоятельно рекомендуется, даже для простых ролей.
Как это работает
Структура роли организует связанные задачи, файлы, шаблоны, handlers, vars и defaults в переиспользуемую директорию. Play включает роли по имени, а команда ansible-galaxy init <role> создаёт структуру роли. Роли могут декларировать зависимости в файле meta/main.yml. В Ansible 2.10 и выше коллекции пакетируют роли, модули и плагины в распространяемые пакеты на Galaxy или приватном хабе.
Когда применять
Роли следует выносить, когда есть логичный кусок кода, который можно переиспользовать в двух и более плейбуках. Например, для управления nginx, postgres или prometheus-node-exporter. Используйте готовые роли из Ansible Galaxy для распространённых задач, таких как geerlingguy.docker или geerlingguy.postgresql, которые были тщательно протестированы и проверены. Запиньте версии ролей в файле requirements.yml, чтобы гарантировать стабильность и предсказуемость поведения. Узкая ответственность роли (одна роль на сервис) упрощает управление и тестирование.
Типичные ошибки
Типичные ошибки при использовании структуры ролей включают создание "god-роли", которая выполняет множество задач, что затрудняет поддержку и тестирование. Не запинните версии ролей из Ansible Galaxy, чтобы избежать непредсказуемого поведения при обновлении. Роли, которые используют захардкоженные пути операционной системы, могут сломаться при использовании на другой ОС. Вместо этого используйте переменные ansible_os_family для ветвления и поддержки различных операционных систем. Не используйте каталог defaults/ для переопределяемых значений, так как это может усложнить кастомизацию вызывающих ролей.