一般来说:有没有办法打破 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 核心版本 2.18。
请注意:此版本目前是预发布版本,这是您在即将推出的版本中可以执行的操作的预览。
您可以在 Ansible 的问题跟踪器中阅读此功能请求:
在某些情况下,任务应该循环直到条件满足 相遇,就像 for 循环中的
一样。这可以通过以下方式实现 一个break
的声明,但它过于复杂并且不明显 目标是,并且当需要时可以变得过于复杂when
语句提供不同的功能来确定 循环项是否应该运行。when
在链接的拉取请求中,我们可以在发行说明中阅读:
- 添加一个loop_control
选项以基于 Jinja2 表达式提前打破任务循环break_when
来源: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 核心版本 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)