【问题标题】:Double with_items loop in ansibleansible中的双with_items循环
【发布时间】:2019-04-06 13:39:11
【问题描述】:

我想在 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


    【解决方案1】:

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

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

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

    它需要将内部代码放入单独的任务列表中。我将用outer.yamlinner.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]
    

    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 相当棘手且不明显,因此我的建议是永远不要在包含之外的包含代码中使用设置的变量。

    【讨论】:

    • 在我的例子中,user1 没有与 user2 相同的组和嵌套循环,我只能创建具有相同组的用户,对吗? include_tasks 也一样吗?
    • 这取决于你。您可以使用相同的组,也可以使用不同的组。如果需要,您可以为用户提供一些“组”变量,其中包含他们所属的组列表,或者您可以拥有用户属于他们的组。如果要过滤部分用户,有when语句。
    • 我已经测试了很多语法,但我不能做我想要的:(你能写一个小例子吗?
    • 但我已经为这两种情况提供了示例。他们还不够清楚,是吗?
    【解决方案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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2015-10-12
      • 1970-01-01
      相关资源
      最近更新 更多