include_tasks vs import_tasks
Тема дорожной карты · Ansible
Различие между include_tasks и import_tasks в Ansible — это разница между динамическим (во время выполнения) и статическим (во время разбора) включением файлов задач, что существенно влияет на поведение условий, циклов, тегов и handler. import_tasks обрабатывается до запуска play, встраивая содержимое импортируемого файла задач непосредственно в play — это означает, что условия when в выражении import_tasks применяются к каждой импортируемой задаче по отдельности, а импортированные задачи видны при --list-tasks и выборе тегов. include_tasks вычисляется во время выполнения, позволяя вычислять имя файла из переменной (include_tasks: "{{ ansible_os_family }}.yml") и условно пропускать само включение; однако теги, применённые к строке include_tasks, не распространяются автоматически на включаемые задачи. Практическое правило: используйте import_tasks для статического, безусловного включения, когда нужно предсказуемое поведение тегов и режима проверки, и include_tasks, когда путь к файлу должен быть динамическим или само включение должно быть условным.
Как это работает
include_tasks vs import_tasks организуют связанные задачи, файлы, шаблоны, handlers, vars и defaults в переиспользуемую директорную структуру (tasks/, handlers/, templates/, files/, vars/, defaults/, meta/). Play включает роли по имени; ansible-galaxy init <role> создаёт структуру. Роли могут декларировать зависимости в meta/main.yml. Collections (Ansible 2.10+) пакетируют роли + модули + плагины как распространяемые пакеты на Galaxy или приватном хабе.
Когда применять
Выносите роль, когда есть логичный кусок, переиспользуемый в 2+ плейбуках (nginx, postgres, prometheus-node-exporter). Используйте готовые роли Galaxy для распространённого — geerlingguy.docker, geerlingguy.postgresql закалены в боях. Запиньте версии ролей в requirements.yml. Узкая ответственность роли (одна роль на сервис).
Типичные ошибки
Ловушки include_tasks vs import_tasks: god-роль, делающая 15 вещей (разделите); не запиннены версии Galaxy-ролей (один ansible-galaxy install -r requirements.yml и поведение меняется); роли с захардкоженными distro-путями ломаются на другом OS (используйте ansible_os_family для ветвления); не используете defaults/ для переопределяемых значений (вызывающие не могут кастомизировать).