Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 带循环的Ansible include_任务在条件满足时检查失败_Loops_Ansible - Fatal编程技术网

Loops 带循环的Ansible include_任务在条件满足时检查失败

Loops 带循环的Ansible include_任务在条件满足时检查失败,loops,ansible,Loops,Ansible,我希望根据任务中设置的条件包含任务 tasks: - name: SET INIT STATUS set_facts: passed: true - name: INCLUDE TASKS WITH LOOP include_tasks: update_status.yml loop: [1, 2, 3] when: passed 更新_status.yml: - name: OUTPUT THE STATUS debug: msg="ITEM: {{item}}

我希望根据任务中设置的条件包含任务

tasks:
- name: SET INIT STATUS
  set_facts:
    passed: true

- name: INCLUDE TASKS WITH LOOP
  include_tasks: update_status.yml
  loop: [1, 2, 3]
  when: passed
更新_status.yml:

- name: OUTPUT THE STATUS
  debug: msg="ITEM: {{item}} has status {{passed}}"
- name: UPDATE the Status
  set_fact:
    passed: false
我所期望的是,它将只为项目1运行一次,因为在它运行之后,它会将状态更改为false,然后它的条件检查失败。但是它实际上运行了3次,所以看起来它不会在循环期间再次检查状态

这是输出

TASK: [SET INIT STATUS]
ok: [localhost]

TASK: [INCLUDE TASKS WITH LOOP]
included: simple.yml for localhost
included: simple.yml for localhost
included: simple.yml for localhost

TASK: [OUTPUT THE STATUS]
ok: [localhost] => {
    "msg": ITEM 1 has status True
}

TASK: [UPDATE the Status]
ok: [localhost]

TASK: [OUTPUT THE STATUS]
ok: [localhost] => {
    "msg": ITEM 2 has status False
}

TASK: [UPDATE the Status]
ok: [localhost]

TASK: [OUTPUT THE STATUS]
ok: [localhost] => {
    "msg": ITEM 3 has status False
}

TASK: [UPDATE the Status]
ok: [localhost]

我想你有一个有趣的副作用。为你的条件反射试一试

何时:通过| bool

这将确保其作为骨骼表达式进行计算

Q:“循环无法在条件出现时检查。”

答:有必要了解两点来解释这里发生了什么

1) 当:通过时的条件<代码>应用于<代码>包含任务时,将扩展为<代码>当:真时,并将由所有包含的任务继承。这将使update_status.yml中的任务看起来更有效

-name:输出状态
debug:msg=“项:{{ITEM}}的状态为{{passed}”
时间:对
-名称:更新状态
设定事实:
通过:错误
时间:对
2) 同时,应用于
循环的条件
when:passed
,决定循环是否启动。一旦循环开始,它将不再考虑该条件,并将运行所有迭代

这解释了任务的结果

注:

  • ATM(Ansible版本2.9)不可能在Ansible中中断循环

  • 当:passed | bool
时,在条件中显式强制转换布尔裸变量是一个好主意。看


代码中有2个语法错误:

  • “错误!无法解析模块/操作‘设置事实’。”。没有模块
    set\u facts
正确语法

-名称:设置初始化状态
设定事实:
通过:正确
  • “加载YAML时出现语法错误。在此上下文中不允许映射值…-名称:输出状态\n调试:msg=\”项:{{ITEM}}具有状态{{passed}\”
正确语法

-name:输出状态
调试:
msg:“项:{{ITEM}}的状态为{{passed}”

在尝试了不同的方法之后,我能够通过将循环放入块中来实现我想要的

- name: LOOP WITH INCLUDE_TASK INSIDE BLOCK
  block:
    - name: LOOP WITH INCLUDE_TASK
      include_tasks: simple.yml
      loop: [1, 2, 3]
  when: passed
结果如下

TASK [SET passed] ******************************************************************************************
ok: [localhost]

TASK [LOOP WITH INCLUDE_TASK] ******************************************************************************************
included: /home/richard/samples/simple.yml for localhost
included: /home/richard/samples/simple.yml for localhost
included: /home/richard/samples/simple.yml for localhost

TASK [SHOW THE STATUS] ******************************************************************************************
ok: [localhost] => {
    "msg": "Item 1 has status True"
}

TASK [CHANGE THE STATUS] ******************************************************************************************
ok: [localhost]

TASK [SHOW THE STATUS] ******************************************************************************************
skipping: [localhost]

TASK [CHANGE THE STATUS] ******************************************************************************************
skipping: [localhost]

TASK [SHOW THE STATUS] ******************************************************************************************
skipping: [localhost]

TASK [CHANGE THE STATUS] ******************************************************************************************
skipping: [localhost]

顺便说一句,这对我也很管用。