Les importations sont statiques, les inclus sont dynamiques. Les importations ont lieu au moment de l'analyse, y compris au moment de l'exécution.
Les importations remplacent essentiellement la tâche par les tâches du fichier. Il n'y a pas import_task
au moment de l'exécution. Ainsi, des attributs tels que tags
, et when
(et très probablement d’autres attributs) sont copiés dans chaque tâche importée.
include
s sont bien exécutés. tags
et when
d’une tâche incluse s’appliquent uniquement à la tâche elle-même.
Les tâches import
étiquetées à partir d'un fichier importé sont exécutées si la tâche est non étiquetée. Aucune tâche n'est exécutée à partir d'un fichier inclus si la include
tâche n'est pas marquée.
Toutes les tâches d'un fichier importé sont exécutées si la import
tâche est étiquetée. Seules les tâches balisées d'un fichier inclus sont exécutées si la include
tâche est balisée.
Limitations de import
s:
- ne peut pas être utilisé avec
with_*
ou loop
attributs
- impossible d'importer un fichier dont le nom dépend d'une variable
Limitations de include
s:
--list-tags
ne montre pas les tags des fichiers inclus
--list-tasks
ne montre pas les tâches des fichiers inclus
- vous ne pouvez pas utiliser
notify
pour déclencher un nom de gestionnaire qui provient de l'intérieur d'une inclusion dynamique
- vous ne pouvez pas utiliser
--start-at-task
pour commencer l'exécution d'une tâche dans une inclusion dynamique
Plus sur ici et ici .
Pour moi, cela revient essentiellement au fait que import
s ne peut pas être utilisé avec des attributs de boucle.
import
échouerait certainement dans des cas comme celui-ci :
# playbook.yml
- import_tasks: set-x.yml
when: x is not defined
# set-x.yml
- set_fact
x: foo
- debug:
var: x
debug
n'est pas exécuté, puisqu'il hérite when
de la import_tasks
tâche. Donc, pas de fichiers de tâches d'importation qui changent les variables utilisées dans import
l' when
attribut de.
J'avais une politique pour commencer avec import
s, mais une fois que j'ai besoin d'un, include
assurez-vous que rien n'est importé par ce fichier inclus ou les fichiers qu'il contient. Mais c'est sacrément difficile à maintenir. Et on ne sait toujours pas si cela me protégera des ennuis. Signification, mélanger include
s et import
s qu'ils ne recommandent pas.
Je ne peux pas utiliser que import
s, car j'ai parfois besoin de boucler des include
tâches. Je pourrais probablement passer à seulement include
s. Mais j'ai décidé de passer aux importations partout, sauf dans les cas où la tâche est supposée être exécutée plusieurs fois. J'ai décidé de faire l'expérience de tous ces cas difficiles. Peut-être qu'il n'y en aura pas dans mes playbooks. Ou j'espère trouver un moyen de le faire fonctionner.
UPD Une astuce éventuellement utile pour créer un fichier de tâche pouvant être importé plusieurs fois, mais exécutée une fois :
- name: ...
...
when: not _file_executed | default(False)
- name: ...
...
when: not _file_executed | default(False)
...
- name: Set _file_executed
set_fact:
_file_executed: True
UPD Un effet peu attendu du mélange des inclusions et des importations est l’inclusion de vars sur ceux importés:
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
Probablement, car effectue d' include_tasks
abord toutes les importations statiques supplémentaires, puis modifie les variables transmises via sa vars
directive.
En fait, cela ne se produit pas uniquement avec les importations:
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 Un autre cas de mélange inclut et importe.
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
Nous obtenons true
et true
, voir le cas précédent (inclure les variables ont priorité sur les variables d'importation). Nous passons donc aux inclus dans 3.yml
. Mais alors la première inclusion dans 3.yml
est ignorée. Puisqu'il hérite when: https
de la tâche parente, et que celle-ci prend soi-disant https
de la tâche vars
. La solution consiste à basculer également vers les inclusions 2.yml
. Cela empêche la propagation des when: https
tâches enfants.