Импорт статический, в том числе динамический. Импорт происходит во время синтаксического анализа, включает во время выполнения.
Импорт в основном заменяет задачу задачами из файла. Там нет 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
бы , конечно , не в состоянии в таких случаях , как это :
# playbook.yml
- import_tasks: set-x.yml
when: x is not defined
# set-x.yml
- set_fact
x: foo
- debug:
var: x
debug
не выполняется, так как он наследует when
от import_tasks
задачи. Таким образом, нет импортирования файлов задач , которые изменяют переменные , используемые в import
«s when
атрибута.
У меня была политика для начала с import
s, но как только мне нужно include
убедиться, что ничего не импортируется этим включенным файлом или файлами, которые он включает. Но это чертовски сложно поддерживать. И до сих пор не ясно, защитит ли это меня от неприятностей. То есть смешивать include
с и import
с, которые они не рекомендуют.
Я не могу использовать только import
s, так как мне иногда нужно циклически include
выполнять задачи. Я мог бы, вероятно, переключиться только на include
с. Но я решил переключиться на импорт везде, кроме случаев, когда задача должна выполняться несколько раз. Я решил испытать все эти сложные случаи из первых рук. Может быть, не будет в моих пьесах. Или, надеюсь, я найду способ заставить это работать.
UPD Возможно полезный трюк для создания файла задачи, который можно импортировать много раз, но выполнить один раз :
- name: ...
...
when: not _file_executed | default(False)
- name: ...
...
when: not _file_executed | default(False)
...
- name: Set _file_executed
set_fact:
_file_executed: True
UPD Один не совсем ожидаемый эффект от смешивания включает и импортирует то, что включает в себя переопределенные переменные импорта:
playbook.yml
:
- hosts: all
tasks:
- import_tasks: 2.yml
vars:
v1: 1
- include_tasks: 2.yml
vars:
v1: 1
2.yml
:
- import_tasks: 3.yml
vars:
v1: 2
3.yml
:
- debug:
var: v1 # 2 then 1
Вероятно, потому что include_tasks
сначала выполняет все дополнительные статические операции импорта, а затем изменяет переменные, передаваемые через его vars
директиву.
На самом деле, это происходит не только с импортом:
playbook.yml
:
- hosts: all
tasks:
- import_tasks: 2.yml
vars:
v1: 1
- include_tasks: 2.yml
vars:
v1: 1
2.yml
:
- debug:
var: v1 # 2 then 1
vars:
v1: 2
UPD Еще один случай смешивания включает и импортирует.
playbook.yml
:
- hosts: all
tasks:
# here you're bound to use include, some sort of loop
- include_tasks: 2.yml
vars:
https: yes
2.yml
:
- import_tasks: 3.yml
when: https
3.yml
:
- import_tasks: 4.yml
vars:
https: no # here we're trying to temporarily override https var
- import_tasks: 4.yml
4.yml
:
- debug:
var: https
Мы получаем true
и true
, видим предыдущий случай (включающие переменные имеют приоритет над импортируемыми переменными). Таким образом, мы переключаемся на включает в 3.yml
. Но затем первое включение в 3.yml
пропускается. Поскольку он наследуется when: https
от родительской задачи, а последняя предположительно берет https
от задачи vars
. Решение состоит в том, чтобы переключиться на включения в 2.yml
. Это предотвращает распространение when: https
на дочерние задачи.