我遇到了一些我不完全理解的奇怪行为,到目前为止我还没有在文档中找到有用的东西。
当您有一个带有“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]
打开问题如果您认为这是一个错误。