Ansible:首次满足条件时停止循环

时间:2020-09-21 11:32:57

标签: ansible

是否有一种方法可以在条件第一次为真时停止循环?在下面的示例中,我希望学生的价值成为贝蒂。但目前将被设置为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

1 个答案:

答案 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中查看详细信息。