我创建了一个Ansible playbook,它创建了一个云实例,然后在实例上安装了一些程序。我想多次运行这个剧本(不使用bash脚本)。是否可以使用循环将这两个任务循环在一起(I.E.一个循环用于两个任务?)。到目前为止,我能找到的每个任务都是一个循环
答案 0 :(得分:25)
不,这是目前无法实现的。 with_items
过去曾使用过以前版本的Ansible中的include
语句,但遗憾地被删除了。
虽然它将在Ansible 2.0中返回,但请参阅What's New in v2 - AnsibleFest London 2015
的幻灯片14/15
您可以尝试使用v2 branch from github,该功能应该在那里。
你可以用1.9.1做的是将你的任务转移到一个角色,并在你的剧本中多次引用这个角色。
答案 1 :(得分:21)
更新:
在2.0中,你可以使用
with_
循环和任务包含(但不包括playbook),这增加了一次性循环任务集的能力。您需要记住几件事情,包含它自己的with_
循环的任务将覆盖特殊项变量的值。因此,如果您想要访问包含项目和当前任务的项目,则应使用set_fact
为外层项目创建别名。- include: test.yml with_items: - 1 - 2 - 3
在test.yml中:
- set_fact: outer_loop="{{item}}" - debug: msg="outer item={{outer_loop}} inner item={{item}}" with_items: - a - b - c
来源:Ansible Docs
答案 2 :(得分:2)
我设法通过基于条件递归地包含相同的yaml文件来做到这一点。要点如下:https://gist.github.com/ParagDoke/5ddfc3d5647ce9b0110d1b9790090092。实际上,在您的剧本中,包含一个包含一些变量的文件:
- 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