Ansible:当条件第一次为true时,停止循环



当条件第一次为true时,是否有方法停止循环?在下面的例子中,我希望学生的价值是贝蒂。但目前它将被设置为brad。如果我加上"并且student是未定义的">到什么时候的条件,它就会起作用,但有更好的方法吗?谢谢

---
- 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

给定列表

marks:
- {grade: a, name: bob}
- {grade: c, name: betty}
- {grade: d, name: jenny}
- {grade: c, name: brad}

Q:"。。。当条件第一次为真时。。。我希望学生的价值是更好的">

A: 使用过滤器而不是循环。还有更多选项:

  1. 选择符合条件的第一项
student: "{{ marks|
selectattr('grade', 'eq', 'c')|
map(attribute='name')|
first }}"

给出

student: betty
  1. 过滤器json_query给出相同的结果
student: "{{ marks|
json_query('[?grade==`c`].name')|
first }}"

如何在循环中首次发现条件为真的示例

例如,让我们模拟迭代命令直到成功的用例。下面的任务迭代列表[1,2,3,4,5],命令测试该项是否大于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'

请参阅线程中的详细信息,循环任务直到成功。

最新更新