【问题标题】:Ansible: How to iterate over a role with an array?Ansible:如何使用数组迭代角色?
【发布时间】:2016-01-29 16:46:07
【问题描述】:

是否可以像这样在循环中多次调用角色:

vars:
  my_array:
    - foo
    - bar
    - baz 
roles:
  - role: foobar
    with_items: my_array

我们怎样才能做到这一点?

【问题讨论】:

    标签: ansible


    【解决方案1】:

    目前有 no way to loop over a role,但正如 Google 小组讨论中所述,您可以将列表或字典传递给角色,然后在内部循环。

    所以你可以这样做:

    # loop_role/tasks/main.yml
    
    - name: debug item
      debug: var="{{ item }}"
      with_items: my_array
    

    然后像这样使用它:

    - hosts: all
      vars:
        my_array:
          - foo
          - bar
          - baz 
      roles:
        - { role: loop_role, my_array: "{{ my_array }}" }
    

    【讨论】:

    • 这个答案不再正确。正如其他答案所提到的,现在有一种方法。
    【解决方案2】:

    现在支持 Ansible 2.3.0:

    - name: myrole
      with_items:
        - "aone"
        - "atwo"
      include_role:
        name: myrole
      vars:
        thing: "{{ item }}"
    

    【讨论】:

    • @tomasbedrich 你能验证一下吗?它对我不起作用。
    • 注意,如果你在“myrole”中使用任何循环,你需要添加loop_control: loop_var: foo以避免与内部循环碰撞。
    • 有没有办法在每次循环迭代时提供整个字典作为变量?
    • 你应该链接到这里的文档docs.ansible.com/ansible/latest/collections/ansible/builtin/…,而不是链接到 2.3.0 版报告的票证,因为该功能已经在 2.2.0 版中引入
    【解决方案3】:

    您可以使用 include_role 模块执行此操作。 See docs

    根据文档,它已经在 Ansible 2.2 中引入(不像其他人所说的那样在 2.3 中引入)。

    然后代码看起来像

    - name: Use role in loop
      ansible.builtin.include_role:
        name: my-role
      vars:
        some_role_variable: '{{ loop_var }}'
      loop:
        - '{{ roleinput1 }}'
        - '{{ roleinput2 }}'
      loop_control:
        loop_var: loop_var
    

    【讨论】:

    • 发布代码示例。不仅仅是链接到外部资源
    • 链接现在是404
    【解决方案4】:

    下面是在 my_array 上使用 include_role 循环的代码示例:

    - name: Use role in loop
      include_role:
        name: myrole
      loop: "{{ my_array }}"
    

    【讨论】:

      【解决方案5】:

      我在 Ansible 2.8 版上使用了类似下面的东西

      tasks:
        - name: looping role to create multiple filesystem
          include_role:
            name: /opt/ansible/playbook/app_filesystem
          vars:
            vgname: "{{ item.vgname }}"
            lvname: "{{ item.lvname }}"
            lvsize: "{{ item.lvsize }}"
            mountpoint: "{{ item.mountpoint }}"
          loop:
            - { vgname: 'vgapp', lvname: 'lvapp', lvsize: '30g', mountpoint: '/app' }
            - { vgname: 'vgapp', lvname: 'lvappzk', lvsize: '64g', mountpoint: '/app/z' }
            - { vgname: 'vgapp', lvname: 'lvappdatazk', lvsize: '+100%FREE', mountpoint: '/app/data/zookeeper' }
      
      tasks:
        - name: looping role to create multiple filesystem
          include_role:
            name: /opt/ansible/playbook/app_filesystem
          vars:
            vgname: "{{ item.vgname }}"
            lvname: "{{ item.lvname }}"
            lvsize: "{{ item.lvsize }}"
            mountpoint: "{{ item.mountpoint }}"
          loop:
            - { vgname: 'vgapp', lvname: 'lvapp', lvsize: '30g', mountpoint: '/app' }
            - { vgname: 'vgapp', lvname: 'lvappzk', lvsize: '64g', mountpoint: '/app/zookeeper' }
            - { vgname: 'vgapp', lvname: 'lvappdatazk', lvsize: '+100%FREE', mountpoint: '/app/data/zookeeper' }
      

      【讨论】:

      • 您打算发布一项任务作为答案还是同时发布两者?
      猜你喜欢
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      相关资源
      最近更新 更多