Ansible:如何使用数组迭代角色?

hew*_*ewo 27 ansible

是否可以在循环中多次调用角色,如下所示:

vars:
  my_array:
    - foo
    - bar
    - baz 
roles:
  - role: foobar
    with_items: my_array
Run Code Online (Sandbox Code Playgroud)

我们应该怎么做?

小智 38

现在支持Ansible 2.3.0:

- name: myrole
  with_items:
    - "aone"
    - "atwo"
  include_role:
    name: myrole
  vars:
    thing: "{{ item }}"
Run Code Online (Sandbox Code Playgroud)

  • @tomasbedrich您可以验证吗?它对我不起作用。 (3认同)
  • 请注意,如果在"myrole"中使用任何循环,则需要添加`loop_control:loop_var:foo`以避免与内部循环冲突. (3认同)

yda*_*coR 8

目前无法循环使用角色,但正如Google Group讨论中所提到的,您可以将列表或字典传递给角色,然后在内部循环.

所以你可以这样做:

# loop_role/tasks/main.yml

- name: debug item
  debug: var="{{ item }}"
  with_items: my_array
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

- hosts: all
  vars:
    my_array:
      - foo
      - bar
      - baz 
  roles:
    - { role: loop_role, my_array: "{{ my_array }}" }
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不再正确。正如其他答案所提到的,现在有一种方法。 (2认同)

Ste*_*ing 6

您可以使用 include_role 模块来执行此操作。查看文档

根据文档,它已经在 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
Run Code Online (Sandbox Code Playgroud)

  • 发布代码示例。不仅仅是链接到外部资源 (11认同)

小智 6

我在 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' }
Run Code Online (Sandbox Code Playgroud)

  • 您打算发布一项任务作为答案还是同时发布两项任务? (2认同)