ansible中的双with_items循环

Double with_items loop in ansible

我想在ansible中创建一个双循环。 我有一件事是这样的:

userslist:
  - name: user1
    primary : user1-group
    groups :
       - group1
       - group2
  - name: user2
    primary : user2-group
    groups :
       - group3
       - group4

- name : Creating Secondary group
  group :
    name : "{{ item.groups }}"
    state: present
  with_items: "{{ userslist}}"

是否可以为每个用户创建每个辅助组? 我想为此我需要做第二个 with_items 循环,但我不知道如何

有两种方法可以在 Ansible 中创建嵌套(双)循环。

  • with_nested。它允许您对在外循环中迭代的对象进行内部迭代。官方文档中提供了示例和解释:https://docs.ansible.com/ansible/2.5/plugins/lookup/nested.html

  • 使用 with_itemsinclude_tasks。这是一个复杂而强大的结构。理论上,这种结构的嵌套程度没有限制(堆栈深度除外)。

需要将内部代码放入单独的任务列表中。我将用 outer.yamlinner.yaml 来展示它,外部对列表执行循环,内部对外部循环的项目(循环变量)执行循环。

outer.yaml:

- name: Loop over foo
  include_tasks: inner.yaml
  with_items: '{{ foo }}'
  loop_control:
     loop_var: inner_var_name
  vars:
   foo:
    - [1, 2, 3]
    - [a, b, c]

inner.yaml:

- name: Performing operation one
  debug: msg="Action one for {{ item }}"
  with_items: '{{ inner_var_name }}'

- name: Performing operation two
  debug: msg="Action two for {{item}}"
  with_items: '{{ inner_var_name }}'

这种方法的主要优点是 inner.yaml 可以包含任意数量的语句,所有语句都将在 outer.yaml.

的循环中处理

一件重要的事情:所有 include 事情都需要谨慎处理与从包含的代码传递值(set_factregister 等)相关的任何事情。 In 相当棘手且不明显,所以我的建议是永远不要在包含代码之外使用包含代码中设置的变量。

我这样做了,效果很好

---

- hosts: all
  become: yes
  vars:
    userslist:
      - name: user1
        primary : user1-group
        groups :
           - group1
           - group2
      - name: user2
        primary : user2-group
        groups :
           - group3
           - group4

  tasks:
  - name: Creating Secondary group
    group:
      name="{{ item.1 }}"
    with_subelements:
      - '{{ userslist }}'
      - groups