В Ansible 2.4 include
модуль устарел. На его месте он поставляется с двумя сменными модулями import_tasks
и include_tasks
. Но у них очень похожие описания:
include_tasks
: Включает файл со списком задач, которые должны быть выполнены в текущей пьесе.import_tasks
: Импортирует список задач, которые будут добавлены в текущую книгу воспроизведения для последующего выполнения.
Когда я должен использовать первое, и когда я должен использовать второе?
Ответы:
Немного об этой теме в документации:
Основным отличием является:
Так
import
что статично,include
динамично.Из моего опыта, вы должны использовать,
import
когда вы имеете дело с логическими «единицами». Например, разделите длинный список задач на файлы подзадач:main.yml:
Но вы будете использовать
include
для работы с различными рабочими процессами и принимать решения на основе некоторых динамически собранных фактов:install_prerequisites:
источник
include
? Если бы мы использовали,include
былimport_tasks
бы эквивалент?include
имелstatic: yes
(вел себя какimport_tasks
) иstatic: no
(какinclude_tasks
).static
?static
этоNone
по умолчанию: Так как анзибль 2.0, задача включает в себя динамические и вести себя как реальные задачи. Это означает, что они могут быть зациклены, пропущены и использовать переменные из любого источника. Ansible пытается автоматически обнаружить это, но вы можете использовать статическую директиву (которая была добавлена в Ansible 2.1), чтобы обойти автоопределение.Импорт статический, в том числе динамический. Импорт происходит во время синтаксического анализа, включает во время выполнения.
Импорт в основном заменяет задачу задачами из файла. Там нет
import_task
во время выполнения. Таким образом, такие атрибуты, какtags
иwhen
(и, скорее всего, другие атрибуты) копируются в каждую импортированную задачу.include
с действительно выполнены.tags
иwhen
включенной задачи относятся только к самой задаче.Помеченные задачи из импортированного файла выполняются, если
import
задача не помечена. Задачи не выполняются из включенного файла, еслиinclude
задача не помечена.Все задачи из импортированного файла выполняются, если
import
задача помечена. Только помеченные задачи из включенного файла выполняются, еслиinclude
задача помечена.Ограничения
import
s:with_*
илиloop
атрибутыОграничения
include
s:--list-tags
не показывает теги из включенных файлов--list-tasks
не показывает задачи из включенных файловnotify
для запуска имя обработчика, которое происходит из динамического включения--start-at-task
чтобы начать выполнение задачи внутри динамического включенияПодробнее об этом здесь и здесь .
Для меня это в основном сводится к тому, что
import
s нельзя использовать с атрибутами цикла.import
бы , конечно , не в состоянии в таких случаях , как это :debug
не выполняется, так как он наследуетwhen
отimport_tasks
задачи. Таким образом, нет импортирования файлов задач , которые изменяют переменные , используемые вimport
«swhen
атрибута.У меня была политика для начала с
import
s, но как только мне нужноinclude
убедиться, что ничего не импортируется этим включенным файлом или файлами, которые он включает. Но это чертовски сложно поддерживать. И до сих пор не ясно, защитит ли это меня от неприятностей. То есть смешиватьinclude
с иimport
с, которые они не рекомендуют.Я не могу использовать только
import
s, так как мне иногда нужно циклическиinclude
выполнять задачи. Я мог бы, вероятно, переключиться только наinclude
с. Но я решил переключиться на импорт везде, кроме случаев, когда задача должна выполняться несколько раз. Я решил испытать все эти сложные случаи из первых рук. Может быть, не будет в моих пьесах. Или, надеюсь, я найду способ заставить это работать.UPD Возможно полезный трюк для создания файла задачи, который можно импортировать много раз, но выполнить один раз :
UPD Один не совсем ожидаемый эффект от смешивания включает и импортирует то, что включает в себя переопределенные переменные импорта:
playbook.yml
:2.yml
:3.yml
:Вероятно, потому что
include_tasks
сначала выполняет все дополнительные статические операции импорта, а затем изменяет переменные, передаваемые через егоvars
директиву.На самом деле, это происходит не только с импортом:
playbook.yml
:2.yml
:UPD Еще один случай смешивания включает и импортирует.
playbook.yml
:2.yml
:3.yml
:4.yml
:Мы получаем
true
иtrue
, видим предыдущий случай (включающие переменные имеют приоритет над импортируемыми переменными). Таким образом, мы переключаемся на включает в3.yml
. Но затем первое включение в3.yml
пропускается. Поскольку он наследуетсяwhen: https
от родительской задачи, а последняя предположительно беретhttps
от задачиvars
. Решение состоит в том, чтобы переключиться на включения в2.yml
. Это предотвращает распространениеwhen: https
на дочерние задачи.источник