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]
顺便说一句,这对我也很管用。