ansible中的双with_items循环

时间:2018-11-02 10:01:45

标签: ansible ansible-role

我想在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循环,但我不知道如何

2 个答案:

答案 0 :(得分:2)

我做到了,而且效果很好

---

- 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

答案 1 :(得分:0)

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

  • public class WorkAddress implements Address { String specificAddress; public WorkAddress(String specificAddress) { this.specificAddress = specificAddress; System.out.println("In WorkAddress Constructor"); } public String getAddress() { return this.specificAddress; } } 。它允许您对在外部循环中迭代的对象进行内部迭代。官方文档中提供了示例和解释:https://docs.ansible.com/ansible/2.5/plugins/lookup/nested.html

  • with_nested一起使用with_items。这是一个复杂而强大的构造。从理论上讲,此结构的嵌套方式没有限制(堆栈深度除外)。

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

outer.yaml:

inner.yaml

inner.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]

此方法的主要优点是- 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的事情都需要谨慎,任何与从包含的代码中传递值(includeset_fact等)有关的事情。 In相当棘手且不明显,因此我的建议是永远不要使用包含代码之外的包含代码中设置的变量。