In Ansible 2.4 ist das include
Modul veraltet. An seiner Stelle es wird mit zwei Ersatzmodule, import_tasks
und include_tasks
. Aber sie haben sehr ähnliche Beschreibungen:
include_tasks
: Enthält eine Datei mit einer Liste der auszuführenden Aufgaben im aktuellen Wiedergabebuch.import_tasks
: Importiert eine Liste von Aufgaben, die dem aktuellen Playbook zur späteren Ausführung hinzugefügt werden sollen.
Wann sollte ich das erstere und wann das letztere verwenden?
Antworten:
Zu diesem Thema gibt es in der Dokumentation einiges:
Der Hauptunterschied ist:
Ist
import
also statisch,include
ist dynamisch.Nach meiner Erfahrung sollten Sie verwenden,
import
wenn Sie sich mit logischen "Einheiten" befassen. Trennen Sie beispielsweise eine lange Liste von Aufgaben in Teilaufgabendateien:main.yml:
Sie würden
include
sich jedoch mit verschiedenen Workflows befassen und Entscheidungen auf der Grundlage einiger dynamisch gesammelter Fakten treffen:Installationsvoraussetzungen:
quelle
include
? Wenn wir das Äquivalent verwendeninclude
würdenimport_tasks
?include
hattestatic: yes
(benahm sich wieimport_tasks
) undstatic: no
(wieinclude_tasks
).static
?static
istNone
standardmäßig aktiviert: Seit Ansible 2.0 sind Aufgaben-Includes dynamisch und verhalten sich eher wie echte Aufgaben. Dies bedeutet, dass sie wiederholt, übersprungen und Variablen aus beliebigen Quellen verwendet werden können. Ansible versucht dies automatisch zu erkennen, aber Sie können die statische Direktive (die in Ansible 2.1 hinzugefügt wurde) verwenden, um die automatische Erkennung zu umgehen.Importe sind statisch, Includes sind dynamisch. Importe erfolgen zur Parsing-Zeit, einschließlich zur Laufzeit.
Importe ersetzen grundsätzlich die Aufgabe durch die Aufgaben aus der Datei. Zur
import_task
Laufzeit gibt es keine . Daher werden Attribute wietags
undwhen
(und höchstwahrscheinlich auch andere Attribute) in jede importierte Aufgabe kopiert.include
s sind in der Tat ausgeführt.tags
undwhen
einer eingeschlossenen Aufgabe gelten nur für die Aufgabe selbst.Mit Tags versehene Aufgaben aus einer importierten Datei werden ausgeführt, wenn die
import
Aufgabe nicht mit Tags versehen ist. Es werden keine Aufgaben aus einer enthaltenen Datei ausgeführt, wenn dieinclude
Aufgabe nicht markiert ist.Alle Aufgaben aus einer importierten Datei werden ausgeführt, wenn die
import
Aufgabe markiert ist. Nur mit Tags versehene Aufgaben aus einer enthaltenen Datei werden ausgeführt, wenn dieinclude
Aufgabe mit Tags versehen ist.Einschränkungen von
import
s:with_*
oderloop
Attributen verwendet werdenEinschränkungen von
include
s:--list-tags
zeigt keine Tags aus enthaltenen Dateien an--list-tasks
zeigt keine Aufgaben aus enthaltenen Dateien annotify
, um einen Handlernamen auszulösen, der aus einem dynamischen Include stammt--start-at-task
, um mit der Ausführung einer Aufgabe innerhalb eines dynamischen Includes zu beginnenMehr dazu hier und hier .
Für mich hängt das im Grunde damit zusammen, dass
import
s nicht mit Schleifenattributen verwendet werden kann.import
würde auf jeden Fall in solchen Fällen scheitern diese :debug
wird nicht ausgeführt, da eswhen
von derimport_tasks
Task erbt . Also, keine Import Aufgabe Dateien , die Variablen verändern verwendetimport
‚s -when
Attribut.Ich hatte eine Richtlinie, mit
import
s zu beginnen , aber sobald ich eine benötige,include
stellen Sie sicher, dass nichts von dieser enthaltenen Datei oder den darin enthaltenen Dateien importiert wird. Aber das ist verdammt schwer zu pflegen. Und es ist immer noch nicht klar, ob es mich vor Problemen schützt. Das heißt, Mischen voninclude
s undimport
s, die sie nicht empfehlen.Ich kann nicht nur
import
s verwenden, da ich gelegentlichinclude
Aufgaben in einer Schleife ausführen muss. Ich könnte wohl nur aufinclude
s umstellen . Aber ich habe mich entschieden, überall auf Importe umzusteigen, außer in den Fällen, in denen die Aufgabe mehrmals ausgeführt werden soll. Ich beschloss, all diese kniffligen Fälle aus erster Hand zu erleben. Vielleicht gibt es keine in meinen Spielbüchern. Oder hoffentlich finde ich einen Weg, es zum Laufen zu bringen.UPD Ein möglicherweise nützlicher Trick zum Erstellen einer Aufgabendatei, die mehrmals importiert, aber einmal ausgeführt werden kann :
UPD Ein nicht wirklich zu erwartender Effekt beim Mischen von Includes und Importen ist, dass Vars Importe überschreiben:
playbook.yml
:2.yml
:3.yml
:Wahrscheinlich, weil
include_tasks
zuerst alle zusätzlichen statischen Importe ausgeführt werden und dann die über dievars
Direktive übergebenen Variablen geändert werden .Eigentlich passiert es nicht nur bei Importen:
playbook.yml
:2.yml
:UPD Ein weiterer Fall des Mischens umfasst und importiert.
playbook.yml
:2.yml
:3.yml
:4.yml
:Wir erhalten
true
undtrue
sehen den vorherigen Fall (Include-Variablen haben Vorrang vor Import-Variablen). Also wechseln wir zu Includes in3.yml
. Aber dann wird das erste Include in3.yml
übersprungen. Da eswhen: https
von der übergeordneten Aufgabe erbt und diese angeblichhttps
von der Aufgabe übernimmtvars
. Die Lösung besteht darin, ebenfalls auf Includes zu wechseln2.yml
. Dadurch wird die Weitergabewhen: https
an die untergeordneten Aufgaben verhindert.quelle