Імпорт є статичним, включає динамічний. Імпорт відбувається під час розбору, включається під час виконання.
Імпорт в основному замінює завдання завданнями з файлу. Немає import_task
під час виконання. Таким чином, атрибути , як tags
і when
(і , швидше за все , інші атрибути) , копіюються в кожній імпортованої завдання.
include
s дійсно виконані. 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
s і import
s, які вони не рекомендують.
Я не можу використовувати лише import
s, оскільки час від часу мені потрібно циклічно include
виконувати завдання. Можливо, я міг би перейти лише на include
s. Але я вирішив перейти на імпорт скрізь, крім випадків, коли завдання, як передбачається, виконується кілька разів. Я вирішив випробувати всі ці хитрі крайові справи з перших рук. Можливо, у моїх ігрових книгах не буде жодної. Або сподіваюся, я знайду спосіб змусити це працювати.
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
, дивіться попередній випадок (включити вари мають перевагу над імпортом vars). Таким чином, ми переходимо до включає в 3.yml
. Але тоді перше включення 3.yml
пропускається. Оскільки вона успадковується when: https
від батьківського завдання, а остання нібито бере https
від задачі vars
. Рішенням є також перехід на включення 2.yml
. Це заважає поширювати when: https
завдання дитини.