Dans Ansible 2.4, le include
module est obsolète. À sa place, il est livré avec deux modules de remplacement, import_tasks
et include_tasks
. Mais ils ont des descriptions très similaires:
include_tasks
: Inclut un fichier avec une liste de tâches à exécuter dans le playbook actuel.import_tasks
: Importe une liste de tâches à ajouter au Playbook actuel pour une exécution ultérieure.
Quand devrais-je utiliser le premier et quand devrais-je utiliser le dernier?
Réponses:
Il y a beaucoup de choses à ce sujet dans la documentation:
La principale différence est:
Ainsi
import
est statique,include
est dynamique.D'après mon expérience, vous devriez utiliser
import
lorsque vous traitez avec des "unités" logiques. Par exemple, séparez une longue liste de tâches dans des fichiers de sous-tâche:main.yml:
Mais vous utiliseriez
include
pour traiter différents flux de travail et prendre des décisions en fonction de faits rassemblés de manière dynamique:les conditions d'installation:
la source
include
? Si nous utilisionsinclude
seraitimport_tasks
l'équivalent?include
avaitstatic: yes
(s'est comporté commeimport_tasks
) etstatic: no
(commeinclude_tasks
).static
?static
estNone
par défaut: depuis Ansible 2.0, les tâches à inclure sont dynamiques et se comportent plutôt comme des tâches réelles. Cela signifie qu'ils peuvent être mis en boucle, ignorés et utiliser des variables de n'importe quelle source. Ansible essaie de le détecter automatiquement, mais vous pouvez utiliser la directive static (ajoutée dans Ansible 2.1) pour contourner la détection automatique.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 quetags
, etwhen
(et très probablement d’autres attributs) sont copiés dans chaque tâche importée.include
s sont bien exécutés.tags
etwhen
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 lainclude
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 lainclude
tâche est balisée.Limitations de
import
s:with_*
ouloop
attributsLimitations de
include
s:--list-tags
ne montre pas les tags des fichiers inclus--list-tasks
ne montre pas les tâches des fichiers inclusnotify
pour déclencher un nom de gestionnaire qui provient de l'intérieur d'une inclusion dynamique--start-at-task
pour commencer l'exécution d'une tâche dans une inclusion dynamiquePlus 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 :debug
n'est pas exécuté, puisqu'il héritewhen
de laimport_tasks
tâche. Donc, pas de fichiers de tâches d'importation qui changent les variables utilisées dansimport
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élangerinclude
s etimport
s qu'ils ne recommandent pas.Je ne peux pas utiliser que
import
s, car j'ai parfois besoin de boucler desinclude
tâches. Je pourrais probablement passer à seulementinclude
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 :
UPD Un effet peu attendu du mélange des inclusions et des importations est l’inclusion de vars sur ceux importés:
playbook.yml
:2.yml
:3.yml
:Probablement, car effectue d'
include_tasks
abord toutes les importations statiques supplémentaires, puis modifie les variables transmises via savars
directive.En fait, cela ne se produit pas uniquement avec les importations:
playbook.yml
:2.yml
:UPD Un autre cas de mélange inclut et importe.
playbook.yml
:2.yml
:3.yml
:4.yml
:Nous obtenons
true
ettrue
, voir le cas précédent (inclure les variables ont priorité sur les variables d'importation). Nous passons donc aux inclus dans3.yml
. Mais alors la première inclusion dans3.yml
est ignorée. Puisqu'il héritewhen: https
de la tâche parente, et que celle-ci prend soi-disanthttps
de la tâchevars
. La solution consiste à basculer également vers les inclusions2.yml
. Cela empêche la propagation deswhen: https
tâches enfants.la source