我创建了一个Ansible playbook,它可以创建云实例并在实例上安装一些程序。我想多次运行这个playbook(不使用bash脚本)。有没有可能使用循环来同时循环执行这两个任务(即一个循环包含两个任务)?到目前为止,我只能找到每个单独任务的循环。
更新:
在 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文档
目前不可能实现。在先前版本的Ansible中,with_items
与include
语句一起使用,但很遗憾已被删除。
尽管它将在Ansible 2.0中恢复, 请参见What's New in v2 - AnsibleFest London 2015的第14/15张幻灯片。
您可以尝试使用来自github上v2分支,该功能应该在其中可用。
使用1.9.1版本的方法是将任务移动到角色中,然后在playbook中多次引用此角色。
我通过根据条件递归地包含同一个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
with_items
,这似乎是一种惯用的方法来完成这个任务。 - Nick Chammas