多个Ansible任务的循环

42

我创建了一个Ansible playbook,它可以创建云实例并在实例上安装一些程序。我想多次运行这个playbook(不使用bash脚本)。有没有可能使用循环来同时循环执行这两个任务(即一个循环包含两个任务)?到目前为止,我只能找到每个单独任务的循环。


3
很遗憾,你不能在中使用with_items,这似乎是一种惯用的方法来完成这个任务。 - Nick Chammas
3个回答

30

更新:

在 2.0 版本中,您可以使用 with_ 循环和任务包括(但不包括播放列表包括),这增加了一次循环执行一组任务的能力。有几个需要注意的事项,一个包含其自己的 with_ 循环的包含任务将覆盖特殊项目变量的值。因此,如果您想访问包含的项目和当前任务的项目,应该使用set_fact创建一个外部别名。

- include_tasks: test.yml
  with_items:
    - 1
    - 2
    - 3

in test.yml:

- set_fact: outer_loop="{{item}}"
- debug: msg="outer item={{outer_loop}} inner item={{item}}"
  with_items:
    - a
    - b
    - c

来源: Ansible文档


7
这在2.1版本中得到改进,增加了一项功能,可以指定不同的变量名用于外层循环 - 请参阅 Ansible 文档的 loop control section。在同一部分中,2.2版本也有相关的改进。 - RichVel

27

目前不可能实现。在先前版本的Ansible中,with_itemsinclude语句一起使用,但很遗憾已被删除。

尽管它将在Ansible 2.0中恢复, 请参见What's New in v2 - AnsibleFest London 2015的第14/15张幻灯片。

enter image description here

您可以尝试使用来自github上v2分支,该功能应该在其中可用。

使用1.9.1版本的方法是将任务移动到角色中,然后在playbook中多次引用此角色。


23
兄弟,截图上发生了什么事? - masterial
如果您跟随“v2中的新内容”链接,看起来它只是幻灯片中的一张幻灯片。幻灯片只有纯黑色背景,并且似乎并不总是填满整个空间。 - acat

6

我通过根据条件递归地包含同一个yaml文件来完成了这个操作。以下是主要思路:https://gist.github.com/ParagDoke/5ddfc3d5647ce9b0110d1b9790090092。在你的playbook中,包含一个带有一些变量的文件:

  - name: Invoke poller
    vars:
      some_condition: '"failed" not in response.content and response.json.status=="running"'
    include_tasks: status-poller.yml

接下来在 status-poller.yml 文件中,包括它自己:

- include_tasks: includes/status-poller.yml
  when: some_condition

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接