带有 when 和 include_tasks 的块

带有 when 和 include_tasks 的块

我遇到了一些我不完全理解的奇怪行为,到目前为止我还没有在文档中找到有用的东西。

当您有一个带有“when”条件的“block:”时,块本身的这个条件似乎会进入到所包含的任务中,为什么呢?

例子:

#playbook.yml
- hosts: localhost
  tasks:
    - block:
      - name: Include stuff
        include_tasks: "set-x.yml"
      when: x is not defined
#set-x.yml
- name: Set a fact
  set_fact:
    x: foo

- name: test
  debug:
    var: x

如果您运行上述示例,调试语句将根本不运行,这不是我所期望的。我的理解是,块上的 when 条件仅适用于块本身是否应该执行。显然,条件会在 include_tasks 文件中延续,而据我所知,这并不是 include 应该如何工作。

我错过了什么?

答案1

引自包含条件

当在 include_* 语句中使用条件时,该条件仅适用于包含任务本身,而不适用于包含文件中的任何其他任务。

这按预期工作

    - include_tasks: set-x.yml
      when: x is not defined

所包含文件中的任何任务都不会被使用

TASK [include_tasks] ************************************************
included: /export/scratch/tmp8/set-x.yml for localhost

情况有所不同. 引自使用块对任务进行分组

块中的所有任务都会继承在块级别应用的指令。... 指令不会影响块本身,它只会被块所包含的任务继承。例如,when 语句应用于块内的任务,而不是块本身。

如果你把包括任务变成一个块

    - block:
        - include_tasks: set-x.yml
      when: x is not defined

此条件适用于所有任务。也适用于包含的任务,从而覆盖了先前的规则,即条件仅适用于包含任务本身。

TASK [include_tasks] *************************************************
included: /export/scratch/tmp8/set-x.yml for localhost

TASK [set_fact] ******************************************************
ok: [localhost]

TASK [debug] *********************************************************
skipping: [localhost]

打开问题如果您认为这是一个错误。

相关内容