W Ansible 2.4 include
moduł jest przestarzały. Na swoim miejscu jest dostarczany z dwoma wymiennymi modułami import_tasks
i include_tasks
. Ale mają bardzo podobne opisy:
include_tasks
: Zawiera plik z listą zadań do wykonania w bieżącym podręczniku.import_tasks
: Importuje listę zadań, które zostaną dodane do bieżącego podręcznika w celu późniejszego wykonania.
Kiedy powinienem użyć pierwszego, a kiedy drugiego?
Odpowiedzi:
W dokumentacji znajduje się całkiem sporo na ten temat:
Główną różnicą jest:
import
Jest więc statyczny,include
dynamiczny.Z mojego doświadczenia wynika, że powinieneś używać go,
import
gdy masz do czynienia z logicznymi „jednostkami”. Na przykład oddziel długą listę zadań do plików podzadań:main.yml:
Ale używałbyś
include
do radzenia sobie z różnymi przepływami pracy i podejmowania decyzji w oparciu o niektóre dynamicznie gromadzone fakty:wymagania_instalacyjne:
źródło
include
? Gdybyśmy korzystali,include
byłbyimport_tasks
to odpowiednik?include
miałstatic: yes
(zachowywał sięimport_tasks
) istatic: no
(podobnyinclude_tasks
).static
?static
jestNone
domyślnie: Od Ansible 2.0 dołączanie zadań jest dynamiczne i zachowuje się bardziej jak prawdziwe zadania. Oznacza to, że można je zapętlać, pomijać i używać zmiennych z dowolnego źródła. Ansible próbuje to automatycznie wykryć, ale możesz użyć dyrektywy statycznej (która została dodana w Ansible 2.1), aby ominąć automatyczne wykrywanie.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 jaktags
iwhen
(i prawdopodobnie inne atrybuty) są kopiowane do każdego importowanego zadania.include
są rzeczywiście stracone.tags
iwhen
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śliinclude
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śliinclude
zadanie jest oznaczone.Ograniczenia
import
s:with_*
lubloop
atrybutyOgraniczenia
include
s:--list-tags
nie pokazuje tagów z dołączonych plików--list-tasks
nie pokazuje zadań z dołączonych plikównotify
do wyzwolenia nazwy modułu obsługi, która pochodzi z dynamicznego włączenia--start-at-task
do rozpoczęcia wykonywania zadania w ramach dynamicznego dołączaniaWię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 :debug
nie jest wykonywany, ponieważ dziedziczywhen
poimport_tasks
zadaniu. Więc żadne pliki zadaniowe importujących które zmieniają zmienne używane wimport
„swhen
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, miksowanieinclude
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 tylkoinclude
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 :
UPD Jednym z nieoczekiwanych efektów mieszania włączeń i importów jest to, że vars zastępują importowane:
playbook.yml
:2.yml
:3.yml
:Prawdopodobnie dlatego, że
include_tasks
najpierw dokonuje wszystkich dodatkowych importów statycznych, a następnie zmienia zmienne przekazane przez jegovars
dyrektywę.W rzeczywistości dzieje się tak nie tylko w przypadku importu:
playbook.yml
:2.yml
:UPD Kolejny przypadek mieszania obejmuje i import.
playbook.yml
:2.yml
:3.yml
:4.yml
:Otrzymujemy
true
itrue
, patrz poprzedni przypadek (uwzględnij zmienne mają pierwszeństwo przed zmiennymi importowymi). Więc przełączamy się na włączenie w3.yml
. Ale wtedy pierwsze włączenie3.yml
jest pomijane. Ponieważ dziedziczywhen: https
po zadaniu nadrzędnym, a to ostatnie przypuszczalnie bierze sięhttps
z zadania nadrzędnegovars
. Rozwiązaniem jest również przejście na włączone2.yml
. Zapobiega to propagacjiwhen: https
zadań podrzędnych.źródło