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 como tags
y when
(y muy probablemente otros atributos) se copian en cada tarea importada.
include
s de hecho son ejecutados. tags
y when
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 la include
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 la include
tarea está etiquetada.
Limitaciones de import
s:
- no se puede usar con
with_*
o loop
atributos
- no se puede importar un archivo, cuyo nombre depende de una variable
Limitaciones de include
s:
--list-tags
no muestra etiquetas de archivos incluidos
--list-tasks
no muestra tareas de archivos incluidos
- no puede usar
notify
para activar un nombre de controlador que proviene de una inclusión dinámica
- no puede usar
--start-at-task
para comenzar la ejecución de una tarea dentro de una inclusión dinámica
Má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 :
# playbook.yml
- import_tasks: set-x.yml
when: x is not defined
# set-x.yml
- set_fact
x: foo
- debug:
var: x
debug
no se ejecuta, ya que hereda when
de la import_tasks
tarea. Por lo tanto, no importa archivos de tareas que cambien las variables utilizadas en import
el when
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, mezclar include
sys import
que no recomiendan.
No puedo usar solo import
s, ya que ocasionalmente necesito realizar include
tareas en bucle . Probablemente podría cambiar a solo include
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 :
- name: ...
...
when: not _file_executed | default(False)
- name: ...
...
when: not _file_executed | default(False)
...
- name: Set _file_executed
set_fact:
_file_executed: True
UPD Uno de los efectos no esperados de mezclar incluye e importar es que incluir vars anula los de importación:
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
Probablemente, porque include_tasks
primero realiza todas las importaciones estáticas adicionales, y luego cambia las variables pasadas a través de su vars
directiva.
En realidad, sucede no solo con las importaciones:
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 Otro caso de mezcla incluye e importaciones.
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
Obtenemos true
y true
, vemos el caso anterior (incluir los vars tienen prioridad sobre los vars de importación). Entonces cambiamos a incluye en 3.yml
. Pero luego 3.yml
se omite la primera inclusión en . Dado que hereda when: https
de la tarea principal, y esta última supuestamente toma https
de la tarea de la tarea vars
. La solución es cambiar a incluye 2.yml
también. Eso evita la propagación de when: https
las tareas secundarias.