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 wie tags
und when
(und höchstwahrscheinlich auch andere Attribute) in jede importierte Aufgabe kopiert.
include
s sind in der Tat ausgeführt. tags
und when
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 die include
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 die include
Aufgabe mit Tags versehen ist.
Einschränkungen von import
s:
- kann nicht mit
with_*
oder loop
Attributen verwendet werden
- kann keine Datei importieren, deren Name von einer Variablen abhängt
Einschränkungen von include
s:
--list-tags
zeigt keine Tags aus enthaltenen Dateien an
--list-tasks
zeigt keine Aufgaben aus enthaltenen Dateien an
- Sie können nicht verwenden
notify
, um einen Handlernamen auszulösen, der aus einem dynamischen Include stammt
- Sie können nicht verwenden
--start-at-task
, um mit der Ausführung einer Aufgabe innerhalb eines dynamischen Includes zu beginnen
Mehr 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 :
# playbook.yml
- import_tasks: set-x.yml
when: x is not defined
# set-x.yml
- set_fact
x: foo
- debug:
var: x
debug
wird nicht ausgeführt, da es when
von der import_tasks
Task erbt . Also, keine Import Aufgabe Dateien , die Variablen verändern verwendet import
‚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 von include
s und import
s, die sie nicht empfehlen.
Ich kann nicht nur import
s verwenden, da ich gelegentlich include
Aufgaben in einer Schleife ausführen muss. Ich könnte wohl nur auf include
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 :
- name: ...
...
when: not _file_executed | default(False)
- name: ...
...
when: not _file_executed | default(False)
...
- name: Set _file_executed
set_fact:
_file_executed: True
UPD Ein nicht wirklich zu erwartender Effekt beim Mischen von Includes und Importen ist, dass Vars Importe überschreiben:
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
Wahrscheinlich, weil include_tasks
zuerst alle zusätzlichen statischen Importe ausgeführt werden und dann die über die vars
Direktive übergebenen Variablen geändert werden .
Eigentlich passiert es nicht nur bei Importen:
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 Ein weiterer Fall des Mischens umfasst und importiert.
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
Wir erhalten true
und true
sehen den vorherigen Fall (Include-Variablen haben Vorrang vor Import-Variablen). Also wechseln wir zu Includes in 3.yml
. Aber dann wird das erste Include in 3.yml
übersprungen. Da es when: https
von der übergeordneten Aufgabe erbt und diese angeblich https
von der Aufgabe übernimmt vars
. Die Lösung besteht darin, ebenfalls auf Includes zu wechseln 2.yml
. Dadurch wird die Weitergabe when: https
an die untergeordneten Aufgaben verhindert.