循环遍历列表和Ansible中的嵌套列表

时间:2018-10-25 19:41:17

标签: ansible

我有两个列表要循环在一起。一个包含一个主机列表,第二个包含一个列表列表,其中嵌套列表是一组用于在每个主机上重复执行任务的项目。这是一个简单的示例:

主机列表

hosts:
  - host1
  - host2

要在每个主机上执行的操作的列表。 hostsops列表的长度相同,因此op1op2应该在host1上执行,而op{3,4,5}应该被执行在host2上。

ops:
  -
    - op1
    - op2
  -
    - op3
    - op4
    - op5

然后,我想使用这两个列表来重复执行任务

- name: my task
  module: "{{ item.1 }}"
  delegate_to: "{{ item.0 }}"
  with_together:
    - hosts
    - ops

不幸的是,这不起作用,因为item.1是一个列表(我想为每个操作重复my_task)。而且类似with_nested的东西也不起作用,因为我不想在每个主机上重复<​​{>} 上的所有操作。

我希望有一个简洁的解决方案,以便避免构建一些中间数据结构。

2 个答案:

答案 0 :(得分:0)

您必须像这样重新格式化文件:

ops:
  - list:
      - ops1
      - ops1
  - list:
      - ops3
      - ops4
      - ops5

然后

- name: my task
  module: "{{ item[1] }}.*:ALL"
  delegate_to: "{{ item[0] }}"
  with_together:
    - "{{ hosts }}"
    - "{{ ops.list }}"

使用我的手机,所以检查缩进。

答案 1 :(得分:0)

最简单的方法是将这些列表放入host_vars/host1host_vars/host2中。

所以host_vars/host1

ops:
   - op1
   - op2

还有host_vars/host2

ops:
   - op3
   - op4
   - op5

那么您的游戏就可以是:

- name: my task
  module: "{{ item }}"
  with_items: "{{ ops }}"