3

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

4

2 回答 2

6

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

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

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

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

外部.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]

内部.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_fact事情register。In 相当棘手且不明显,因此我的建议是永远不要在包含之外的包含代码中使用变量集。

于 2018-11-02T10:27:12.007 回答
4

我这样做了,效果很好

---

- 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

于 2019-02-14T08:59:06.660 回答