En Ansible 2.4, el include
módulo está en desuso. En su lugar, se envía con dos módulos de reemplazo, import_tasks
y 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
import
es estático,include
es dinámico.Desde mi experiencia, deberías usar
import
cuando tratas con "unidades" lógicas. Por ejemplo, separe una larga lista de tareas en archivos de subtareas:main.yml:
Pero lo usaría
include
para 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 usandoinclude
seríaimport_tasks
el equivalente?include
tenidostatic: yes
(se comportó comoimport_tasks
) ystatic: no
(comoinclude_tasks
).static
?static
esNone
por 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_task
en tiempo de ejecución. Por lo tanto, los atributos comotags
ywhen
(y muy probablemente otros atributos) se copian en cada tarea importada.include
s de hecho son ejecutados.tags
ywhen
de una tarea incluida se aplica solo a la tarea misma.Las tareas etiquetadas de un archivo importado se ejecutan si la
import
tarea no está etiquetada. No se ejecuta ninguna tarea desde un archivo incluido si lainclude
tarea no está etiquetada.Todas las tareas de un archivo importado se ejecutan si la
import
tarea está etiquetada. Solo las tareas etiquetadas de un archivo incluido se ejecutan si lainclude
tarea está etiquetada.Limitaciones de
import
s:with_*
oloop
atributosLimitaciones de
include
s:--list-tags
no muestra etiquetas de archivos incluidos--list-tasks
no muestra tareas de archivos incluidosnotify
para activar un nombre de controlador que proviene de una inclusión dinámica--start-at-task
para 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
import
s no se puede usar con atributos de bucle.import
ciertamente fallaría en casos como este :debug
no se ejecuta, ya que heredawhen
de laimport_tasks
tarea. Por lo tanto, no importa archivos de tareas que cambien las variables utilizadas enimport
elwhen
atributo de.Tenía una política para comenzar con
import
s, pero una vez que lo necesito,include
asegú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, mezclarinclude
sysimport
que no recomiendan.No puedo usar solo
import
s, ya que ocasionalmente necesito realizarinclude
tareas en bucle . Probablemente podría cambiar a soloinclude
s. 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_tasks
primero realiza todas las importaciones estáticas adicionales, y luego cambia las variables pasadas a través de suvars
directiva.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
true
ytrue
, vemos el caso anterior (incluir los vars tienen prioridad sobre los vars de importación). Entonces cambiamos a incluye en3.yml
. Pero luego3.yml
se omite la primera inclusión en . Dado que heredawhen: https
de la tarea principal, y esta última supuestamente tomahttps
de la tarea de la tareavars
. La solución es cambiar a incluye2.yml
también. Eso evita la propagación dewhen: https
las tareas secundarias.fuente