Import jest statyczny, w tym dynamiczny. Importowanie odbywa się w czasie analizy, w tym w czasie wykonywania.
Import zasadniczo zastępuje zadanie zadaniami z pliku. Nie ma import_task
w czasie wykonywania. Tak, atrybuty jak tags
i when
(i prawdopodobnie inne atrybuty) są kopiowane do każdego importowanego zadania.
include
są rzeczywiście stracone. tags
i when
dołączonego zadania dotyczą tylko samego zadania.
Oznaczone zadania z importowanego pliku są wykonywane, jeśli import
zadanie nie jest oznaczone . Żadne zadania nie są wykonywane z dołączonego pliku, jeśli include
zadanie nie jest oznaczone.
Wszystkie zadania z importowanego pliku zostaną wykonane, jeśli import
zadanie jest oznaczone. Tylko oznaczone zadania z dołączonego pliku są wykonywane, jeśli include
zadanie jest oznaczone.
Ograniczenia import
s:
- nie może być stosowany z
with_*
lub loop
atrybuty
- nie można zaimportować pliku, którego nazwa zależy od zmiennej
Ograniczenia include
s:
--list-tags
nie pokazuje tagów z dołączonych plików
--list-tasks
nie pokazuje zadań z dołączonych plików
- nie można użyć
notify
do wyzwolenia nazwy modułu obsługi, która pochodzi z dynamicznego włączenia
- nie można użyć
--start-at-task
do rozpoczęcia wykonywania zadania w ramach dynamicznego dołączania
Więcej na ten temat tutaj i tutaj .
Dla mnie w zasadzie sprowadza się to do tego, że import
nie można używać s z atrybutami pętli.
import
na pewno nie w przypadkach takich jak ten :
# playbook.yml
- import_tasks: set-x.yml
when: x is not defined
# set-x.yml
- set_fact
x: foo
- debug:
var: x
debug
nie jest wykonywany, ponieważ dziedziczy when
po import_tasks
zadaniu. Więc żadne pliki zadaniowe importujących które zmieniają zmienne używane w import
„s when
atrybut.
Miałem zasady, aby zacząć od import
s, ale kiedy potrzebuję, include
upewnij się, że nic nie jest importowane przez ten dołączony plik lub pliki, które zawiera. Ale to jest cholernie trudne do utrzymania. I nadal nie jest jasne, czy uchroni mnie przed problemami. Znaczenie, miksowanie include
si innych, import
których nie zalecają.
Nie mogę używać tylko import
s, ponieważ czasami muszę zapętlać include
zadania. Prawdopodobnie mógłbym przejść na tylko include
s. Ale postanowiłem przejść na import wszędzie, z wyjątkiem przypadków, w których zadanie ma być uruchamiane kilka razy. Postanowiłem doświadczyć tych wszystkich trudnych przypadków z pierwszej ręki. Może nie będzie ich w moich podręcznikach. Albo mam nadzieję, że znajdę sposób, aby to zadziałało.
UPD Prawdopodobnie przydatna sztuczka, aby utworzyć plik zadania, który można zaimportować wiele razy, ale wykonać raz :
- name: ...
...
when: not _file_executed | default(False)
- name: ...
...
when: not _file_executed | default(False)
...
- name: Set _file_executed
set_fact:
_file_executed: True
UPD Jednym z nieoczekiwanych efektów mieszania włączeń i importów jest to, że vars zastępują importowane:
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
Prawdopodobnie dlatego, że include_tasks
najpierw dokonuje wszystkich dodatkowych importów statycznych, a następnie zmienia zmienne przekazane przez jego vars
dyrektywę.
W rzeczywistości dzieje się tak nie tylko w przypadku importu:
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 Kolejny przypadek mieszania obejmuje i import.
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
Otrzymujemy true
i true
, patrz poprzedni przypadek (uwzględnij zmienne mają pierwszeństwo przed zmiennymi importowymi). Więc przełączamy się na włączenie w 3.yml
. Ale wtedy pierwsze włączenie 3.yml
jest pomijane. Ponieważ dziedziczy when: https
po zadaniu nadrzędnym, a to ostatnie przypuszczalnie bierze się https
z zadania nadrzędnego vars
. Rozwiązaniem jest również przejście na włączone 2.yml
. Zapobiega to propagacji when: https
zadań podrzędnych.