是否有一种方法可以在条件第一次为真时停止循环?在下面的示例中,我希望学生的价值成为贝蒂。但目前将被设置为brad。如果我将“学生未定义” 添加到when条件,那么它将起作用,但是有更好的方法吗?谢谢!
---
- hosts: localhost
vars:
marks:
- name: bob
grade: a
- name: betty
grade: c
- name: jenny
grade: d
- name: brad
grade: c
tasks:
- set_fact:
student: '{{ item.name }}'
loop: '{{ marks }}'
when: item.grade == 'c'
- debug:
var: student
答案 0 :(得分:2)
Q:“ ...第一次满足条件时...”
过滤器而不是循环
还有更多选择。例如,选择符合条件的第一个项目
- set_fact:
student: "{{ marks|
selectattr('grade', 'eq', 'c')|
map(attribute='name')|
first }}"
json_query给出相同的结果
- set_fact:
student: "{{ marks|
json_query('[?grade==`c`].name')|
first }}"
循环
如果缺少合适的过滤器或在循环中创建了数据,请使用循环(列出一个列表)。在这种情况下,可以跳过循环的其余部分。例如,让我们模拟一个迭代命令直到成功的用例。下面的任务对列表[1,2,3,4,5]进行迭代,并且命令test该项目大于3。在满足条件之后,循环将跳过列表的其余部分
- command: '[ "{{ item }}" -gt "3" ]'
loop: "{{ range(1, 5 + 1)|list }}"
register: result
ignore_errors: true
when: not condition
vars:
condition: "{{ (result|default({'rc': 1})).rc == 0 }}"
- debug:
msg: "{{ result.results|
json_query('[?rc==`0`].item')|
first }}"
给予(选定的相关部分)
failed: [localhost] (item=3) => changed=true
...
item: 3
msg: non-zero return code
rc: 1
...
changed: [localhost] => (item=4)
skipping: [localhost] => (item=5)
...ignoring
TASK [debug] ****
ok: [localhost] =>
msg: '4'
在线程Looping a task until it succeeds中查看详细信息。