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

Gre*_*joy 4 ansible

当条件第一次为真时,有没有办法停止循环?在下面的例子中,我希望学生的值为 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)

Vla*_*tka 5

给定列表

  marks:
    - {grade: a, name: bob}
    - {grade: c, name: betty}
    - {grade: d, name: jenny}
    - {grade: c, name: brad}
Run Code Online (Sandbox Code Playgroud)

问:“……当条件第一次为真时……我希望学生的值为 betty。”

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

  1. 选择第一个满足条件的项目
  student: "{{ marks|
               selectattr('grade', 'eq', 'c')|
               map(attribute='name')|
               first }}"
Run Code Online (Sandbox Code Playgroud)

给出

  student: betty
Run Code Online (Sandbox Code Playgroud)
  1. 过滤器json_query给出相同的结果
  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)

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