多个Ansible任务的一个循环

时间:2015-06-11 15:36:38

标签: loops ansible ansible-playbook

我创建了一个Ansible playbook,它创建了一个云实例,然后在实例上安装了一些程序。我想多次运行这个剧本(不使用bash脚本)。是否可以使用循环将这两个任务循环在一起(I.E.一个循环用于两个任务?)。到目前为止,我能找到的每个任务都是一个循环

3 个答案:

答案 0 :(得分:25)

不,这是目前无法实现的。 with_items过去曾使用过以前版本的Ansible中的include语句,但遗憾地被删除了。

虽然它将在Ansible 2.0中返回,但请参阅What's New in v2 - AnsibleFest London 2015

的幻灯片14/15

enter image description here

您可以尝试使用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