En Ansible 2.4, el includemódulo está en desuso. En su lugar, se envía con dos módulos de reemplazo, import_tasksy include_tasks. Pero tienen descripciones muy similares:
include_tasks: Incluye un archivo con una lista de tareas que se ejecutarán en el libro de jugadas actual.import_tasks: Importa una lista de tareas que se agregarán al libro de jugadas actual para su posterior ejecución.
¿Cuándo debo usar el primero y cuándo debo usar el último?

Respuestas:
Hay bastante sobre este tema en la documentación:
La principal diferencia es:
Entonces
importes estático,includees dinámico.Desde mi experiencia, deberías usar
importcuando tratas con "unidades" lógicas. Por ejemplo, separe una larga lista de tareas en archivos de subtareas:main.yml:
Pero lo usaría
includepara lidiar con diferentes flujos de trabajo y tomar decisiones basadas en algunos datos recopilados dinámicamente:prerrequisitos de instalación:
fuente
include? Si estuviéramos usandoincludeseríaimport_tasksel equivalente?includetenidostatic: yes(se comportó comoimport_tasks) ystatic: no(comoinclude_tasks).static?staticesNonepor defecto: desde Ansible 2.0, las tareas incluidas son dinámicas y se comportan más como tareas reales. Esto significa que se pueden enlazar, omitir y usar variables de cualquier fuente. Ansible intenta detectarlo automáticamente, pero puede usar la directiva estática (que se agregó en Ansible 2.1) para evitar la detección automática.Las importaciones son estáticas, las inclusiones son dinámicas. Las importaciones se realizan en el momento del análisis, incluso en tiempo de ejecución.
Las importaciones básicamente reemplazan la tarea con las tareas del archivo. No hay
import_tasken tiempo de ejecución. Por lo tanto, los atributos comotagsywhen(y muy probablemente otros atributos) se copian en cada tarea importada.includes de hecho son ejecutados.tagsywhende una tarea incluida se aplica solo a la tarea misma.Las tareas etiquetadas de un archivo importado se ejecutan si la
importtarea no está etiquetada. No se ejecuta ninguna tarea desde un archivo incluido si laincludetarea no está etiquetada.Todas las tareas de un archivo importado se ejecutan si la
importtarea está etiquetada. Solo las tareas etiquetadas de un archivo incluido se ejecutan si laincludetarea está etiquetada.Limitaciones de
imports:with_*oloopatributosLimitaciones de
includes:--list-tagsno muestra etiquetas de archivos incluidos--list-tasksno muestra tareas de archivos incluidosnotifypara activar un nombre de controlador que proviene de una inclusión dinámica--start-at-taskpara comenzar la ejecución de una tarea dentro de una inclusión dinámicaMás sobre esto aquí y aquí .
Para mí, eso básicamente se reduce al hecho de que
imports no se puede usar con atributos de bucle.importciertamente fallaría en casos como este :debugno se ejecuta, ya que heredawhende laimport_taskstarea. Por lo tanto, no importa archivos de tareas que cambien las variables utilizadas enimportelwhenatributo de.Tenía una política para comenzar con
imports, pero una vez que lo necesito,includeasegúrese de que el archivo incluido o los archivos que incluye no importen nada. Pero eso es muy difícil de mantener. Y todavía no está claro si me protegerá de los problemas. Es decir, mezclarincludesysimportque no recomiendan.No puedo usar solo
imports, ya que ocasionalmente necesito realizarincludetareas en bucle . Probablemente podría cambiar a soloincludes. Pero decidí cambiar a importaciones en todas partes, excepto en los casos en que se supone que la tarea se ejecuta varias veces. Decidí experimentar todos esos casos difíciles de primera mano. Quizás no haya ninguno en mis libros de jugadas. O con suerte encontraré una manera de hacerlo funcionar.UPD Un truco posiblemente útil para crear un archivo de tarea que puede importarse muchas veces, pero ejecutarse una vez :
UPD Uno de los efectos no esperados de mezclar incluye e importar es que incluir vars anula los de importación:
playbook.yml:2.yml:3.yml:Probablemente, porque
include_tasksprimero realiza todas las importaciones estáticas adicionales, y luego cambia las variables pasadas a través de suvarsdirectiva.En realidad, sucede no solo con las importaciones:
playbook.yml:2.yml:UPD Otro caso de mezcla incluye e importaciones.
playbook.yml:2.yml:3.yml:4.yml:Obtenemos
trueytrue, vemos el caso anterior (incluir los vars tienen prioridad sobre los vars de importación). Entonces cambiamos a incluye en3.yml. Pero luego3.ymlse omite la primera inclusión en . Dado que heredawhen: httpsde la tarea principal, y esta última supuestamente tomahttpsde la tarea de la tareavars. La solución es cambiar a incluye2.ymltambién. Eso evita la propagación dewhen: httpslas tareas secundarias.fuente