当条件第一次为真时,有没有办法停止循环?在下面的例子中,我希望学生的值为 betty。但目前将设置为布拉德。如果我在when条件中添加“andstudent未定义”,那么它会起作用,但是有更好的方法吗?谢谢!
---
- 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
Run Code Online (Sandbox Code Playgroud)
给定列表
Run Code Online (Sandbox Code Playgroud)
marks:
- {grade: a, name: bob}
- {grade: c, name: betty}
- {grade: d, name: jenny}
- {grade: c, name: brad}
问:“……当条件第一次为真时……我希望学生的值为 betty。”
答:使用过滤器而不是循环。还有更多选择:
student: "{{ marks|
selectattr('grade', 'eq', 'c')|
map(attribute='name')|
first }}"
Run Code Online (Sandbox Code Playgroud)
给出
student: betty
Run Code Online (Sandbox Code Playgroud)
student: "{{ marks|
json_query('[?grade==`c`].name')|
first }}"
Run Code Online (Sandbox Code Playgroud)
如何查找循环中条件第一次为 true 的示例
例如,让我们模拟迭代命令直到成功的用例。下面的任务迭代列表 [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 }}"
Run Code Online (Sandbox Code Playgroud)
给出(选定的相关部分)
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'
Run Code Online (Sandbox Code Playgroud)
请参阅线程循环任务直到成功为止的详细信息。
归档时间: |
|
查看次数: |
3200 次 |
最近记录: |