如何打破 Ansible 循环?

问题描述 投票:0回答:1

一般来说:有没有办法打破 Ansible 循环并退出当前任务?


具体:我正在使用循环从Artifactory实例下载JAR,我想首先检查文件是否存在,如果文件不存在,则记录错误并退出。

我的剧本是这样的:

- name: Download jars from artifactory
  get_url:
    url: "{{ maven_url }}/{{ item }}"
    dest: "{{ destPath }}"
    mode: 0755
  loop: 
    - a.jar
    - b.jar
    - c.jar

如何实施?

ansible
1个回答
1
投票

一般来说,打破循环

目前这是不可能的,但用不了多久你就能实现这一目标。
当前的方法是跳过所需条件后面的元素。


自 Ansible 版本 11.0 开始

或 Ansible 核心版本 2.18。

请注意:此版本目前是预发布版本,这是您在即将推出的版本中可以执行的操作的预览。

您可以在 Ansible 的问题跟踪器中阅读此功能请求:

在某些情况下,任务应该循环直到条件满足 相遇,就像 for 循环中的

break
一样。这可以通过以下方式实现 一个
when
的声明,但它过于复杂并且不明显 目标是,并且当需要时可以变得过于复杂
when
语句提供不同的功能来确定 循环项是否应该运行。

来源:Ansible 的问题跟踪器#83442

在链接的拉取请求中,我们可以在发行说明中阅读:

loop_control
- 添加一个
break_when
选项以基于 Jinja2 表达式提前打破任务循环

来源:Ansible 的 git 存储库中的拉取请求#62151

使用它的语法基于

loop_control
的属性:
break_when

处理项目后立即评估
break_when
条件。

- name: Count until 3, then break
  ansible.builtin.debug:
    var: item
  loop:
    - 1
    - 2
    - 3
    - 4
    - 5
  loop_control:
    break_when: item >= 3

这将产生:

TASK [Count until 3, then break] **********************************
ok: [localhost] => (item=1) => 
  ansible_loop_var: item
  item: 1
ok: [localhost] => (item=2) => 
  ansible_loop_var: item
  item: 2
ok: [localhost] => (item=3) => 
  ansible_loop_var: item
  item: 3

此输出是使用 Ansible 预发布版本 (11.0.0a1) 生成的,因此请注意实际版本 11.0.0 可能仍会有所不同。


Ansible 版本 11.0 之前

或 Ansible 核心版本 2.18。

目前,您只需根据

when
条件跳过连续项目:

- name: Count until 3, then skip all further items
  ansible.builtin.debug:
    var: item
  loop:
    - 1
    - 2
    - 3
    - 4
    - 5
  when: item <= 3

这会产生:

TASK [Count until 3, then skip all further items] *****************
ok: [localhost] => (item=1) => 
  ansible_loop_var: item
  item: 1
ok: [localhost] => (item=2) => 
  ansible_loop_var: item
  item: 2
ok: [localhost] => (item=3) => 
  ansible_loop_var: item
  item: 3
skipping: [localhost] => (item=4) 
skipping: [localhost] => (item=5) 
© www.soinside.com 2019 - 2024. All rights reserved.