在ansible中使用double with_items循环

问题描述 投票:0回答:2

我想在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 ansible-role
2个回答
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


0
投票

有两种方法可以在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是相当棘手且不明显的,所以我的建议是永远不要在包含代码之外的包含代码中使用变量。

© www.soinside.com 2019 - 2024. All rights reserved.