As importações são estáticas, as inclusões são dinâmicas. As importações acontecem no momento da análise, incluindo no tempo de execução.
As importações basicamente substituem a tarefa pelas tarefas do arquivo. Não há import_task
tempo de execução. Portanto, atributos como tags
e when
(e provavelmente outros atributos) são copiados para todas as tarefas importadas.
include
s são realmente executados. tags
e when
de uma tarefa incluída se aplicam apenas à tarefa em si.
As tarefas marcadas de um arquivo importado são executadas se a import
tarefa não estiver marcada. Nenhuma tarefa é executada a partir de um arquivo incluído se a include
tarefa não estiver marcada.
Todas as tarefas de um arquivo importado são executadas se a import
tarefa estiver marcada. Somente tarefas marcadas de um arquivo incluído são executadas se a include
tarefa estiver marcada.
Limitações de import
s:
- não pode ser usado com
with_*
ou loop
atributos
- não pode importar um arquivo, cujo nome depende de uma variável
Limitações de include
s:
--list-tags
não mostra tags dos arquivos incluídos
--list-tasks
não mostra tarefas dos arquivos incluídos
- você não pode usar
notify
para acionar um nome de manipulador que vem de dentro de uma inclusão dinâmica
- você não pode usar
--start-at-task
para iniciar a execução em uma tarefa dentro de uma inclusão dinâmica
Mais sobre isso aqui e aqui .
Para mim, isso se resume basicamente ao fato de que import
s não pode ser usado com atributos de loop.
import
certamente falharia em 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
não é executado, pois herda when
da import_tasks
tarefa. Portanto, não há importação de arquivos de tarefas que alteram as variáveis usadas no atributo import
's when
.
Eu tinha uma política para começar com import
s, mas uma vez que eu preciso include
garantir que nada seja importado pelo arquivo incluído ou pelos arquivos que ele inclui. Mas isso é muito difícil de manter. E ainda não está claro se isso vai me proteger de problemas. Significado, misturando include
s e import
s que eles não recomendam.
Não posso usar apenas import
s, pois ocasionalmente preciso repetir include
tarefas. Eu provavelmente poderia mudar para apenas include
s. Mas decidi mudar para importações em todos os lugares, exceto nos casos em que a tarefa deveria ser executada várias vezes. Decidi experimentar todos esses casos complicados em primeira mão. Talvez não haja nenhum em meus playbooks. Ou espero encontrar uma maneira de fazê-lo funcionar.
UPD Um truque possivelmente útil para criar um arquivo de tarefas que pode ser importado várias vezes, mas executado uma 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 Um efeito não esperado da mistura de inclusões e importações é que os vars substituem os de importação:
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
Provavelmente, porque include_tasks
primeiro faz todas as importações estáticas adicionais e depois altera as variáveis passadas por sua vars
diretiva.
Na verdade, isso acontece não apenas com as importações:
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 Outro caso de mistura inclui e importa.
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
Obtemos true
e true
, veja o caso anterior (incluir vars têm precedência sobre vars de importação). Então, mudamos para inclui 3.yml
. Mas então a primeira inclusão 3.yml
é ignorada. Uma vez que herda when: https
da tarefa pai, e a última supostamente tira https
da tarefa vars
. A solução é mudar para as inclusões 2.yml
também. Isso impede a propagação de when: https
para as tarefas filho.