【发布时间】:2016-01-29 16:46:07
【问题描述】:
是否可以像这样在循环中多次调用角色:
vars:
my_array:
- foo
- bar
- baz
roles:
- role: foobar
with_items: my_array
我们怎样才能做到这一点?
【问题讨论】:
标签: ansible
是否可以像这样在循环中多次调用角色:
vars:
my_array:
- foo
- bar
- baz
roles:
- role: foobar
with_items: my_array
我们怎样才能做到这一点?
【问题讨论】:
标签: ansible
目前有 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 }}" }
【讨论】:
现在支持 Ansible 2.3.0:
- name: myrole
with_items:
- "aone"
- "atwo"
include_role:
name: myrole
vars:
thing: "{{ item }}"
【讨论】:
loop_control: loop_var: foo以避免与内部循环碰撞。
您可以使用 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
【讨论】:
下面是在 my_array 上使用 include_role 循环的代码示例:
- name: Use role in loop
include_role:
name: myrole
loop: "{{ my_array }}"
【讨论】:
我在 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' }
【讨论】: