No Ansible 2.4, o include
módulo está obsoleto. Em seu lugar, é fornecido com dois módulos de substituição, import_tasks
e include_tasks
. Mas eles têm descrições muito semelhantes:
include_tasks
: Inclui um arquivo com uma lista de tarefas a serem executadas no manual atual.import_tasks
: Importa uma lista de tarefas a serem adicionadas ao manual atual para posterior execução.
Quando devo usar o primeiro e quando devo usar o último?
Respostas:
Há bastante sobre esse tópico na documentação:
A principal diferença é:
Então
import
é estático,include
é dinâmico.Pela minha experiência, você deve usar
import
quando lida com "unidades" lógicas. Por exemplo, separe uma longa lista de tarefas em arquivos de subtarefa:main.yml:
Mas você usaria
include
para lidar com diferentes fluxos de trabalho e tomar decisões com base em alguns fatos coletados dinamicamente:install_prerequisites:
fonte
include
? Se estivéssemos usandoinclude
seriaimport_tasks
o equivalente?include
tinhastatic: yes
(se comportou comoimport_tasks
) estatic: no
(comoinclude_tasks
).static
?static
éNone
por padrão: Desde o Ansible 2.0, as inclusões de tarefas são dinâmicas e se comportam mais como tarefas reais. Isso significa que eles podem ser repetidos, ignorados e usar variáveis de qualquer fonte. O Ansible tenta detectar isso automaticamente, mas você pode usar a diretiva estática (que foi adicionada no Ansible 2.1) para ignorar a detecção automática.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 comotags
ewhen
(e provavelmente outros atributos) são copiados para todas as tarefas importadas.include
s são realmente executados.tags
ewhen
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 ainclude
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 ainclude
tarefa estiver marcada.Limitações de
import
s:with_*
ouloop
atributosLimitações de
include
s:--list-tags
não mostra tags dos arquivos incluídos--list-tasks
não mostra tarefas dos arquivos incluídosnotify
para acionar um nome de manipulador que vem de dentro de uma inclusão dinâmica--start-at-task
para iniciar a execução em uma tarefa dentro de uma inclusão dinâmicaMais 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 :debug
não é executado, pois herdawhen
daimport_tasks
tarefa. Portanto, não há importação de arquivos de tarefas que alteram as variáveis usadas no atributoimport
'swhen
.Eu tinha uma política para começar com
import
s, mas uma vez que eu precisoinclude
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, misturandoinclude
s eimport
s que eles não recomendam.Não posso usar apenas
import
s, pois ocasionalmente preciso repetirinclude
tarefas. Eu provavelmente poderia mudar para apenasinclude
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 :
UPD Um efeito não esperado da mistura de inclusões e importações é que os vars substituem os de importação:
playbook.yml
:2.yml
:3.yml
:Provavelmente, porque
include_tasks
primeiro faz todas as importações estáticas adicionais e depois altera as variáveis passadas por suavars
diretiva.Na verdade, isso acontece não apenas com as importações:
playbook.yml
:2.yml
:UPD Outro caso de mistura inclui e importa.
playbook.yml
:2.yml
:3.yml
:4.yml
:Obtemos
true
etrue
, veja o caso anterior (incluir vars têm precedência sobre vars de importação). Então, mudamos para inclui3.yml
. Mas então a primeira inclusão3.yml
é ignorada. Uma vez que herdawhen: https
da tarefa pai, e a última supostamente tirahttps
da tarefavars
. A solução é mudar para as inclusões2.yml
também. Isso impede a propagação dewhen: https
para as tarefas filho.fonte