packages.yml
文件定义为:
---
- packages:
- name: Some description 1,
packageList:
- package1,
- package2,
- package3
- name: Some description 2,
package: package4
第一项包含字段packageList
,第二项没有字段,而只有package
字段。
Playbook:
---
- hosts: all
become: yes
vars_files:
- packages.yml
仅当为项目定义了packageList
时,才如何遍历packages
列表的所有packageList
项。
这里是我如何遍历包含package
字段的项目的方法:
- name: iteration
debug:
msg: "name: {{ item.package }}"
when: item.package is defined
with_items: "{{ packages }}"
apt/yum/package
模块通常会更有效率。以the docs状态:“与循环一起使用:每个包将被单独处理,将列表直接传递给name选项会更有效。”
但是,如果您确实需要循环,这是一种可能的解决方案:
playbook.yml:
---
- hosts: all
gather_facts: false
vars_files:
- packages.yml
tasks:
- name: iteration over single items
debug:
msg: "name: {{ item.package }}"
when: item.package is defined
with_items: "{{ packages }}"
- name: iteration over lists
debug:
msg: "name: {{ item.packageList }}"
when: item.packageList is defined
with_items: "{{ packages }}"
- name: Do something with individual packages in the list
include_tasks: process_list.yml
vars:
mylist: "{{outer.packageList}}"
when: outer.packageList is defined
loop: "{{ packages }}"
loop_control:
loop_var: outer
process_list.yml:
- name: See what we have received debug: var: item loop: "{{mylist}}"
结果:
PLAY [all] ******************************************************************************************************************************* TASK [iteration over single items] ******************************************************************************************************* skipping: [localhost] => (item={u'packageList': [u'package1,', u'package2,', u'package3'], u'name': u'Some description 1,'}) ok: [localhost] => (item={u'name': u'Some description 2,', u'package': u'package4'}) => { "msg": "name: package4" } TASK [iteration over lists] ************************************************************************************************************** ok: [localhost] => (item={u'packageList': [u'package1,', u'package2,', u'package3'], u'name': u'Some description 1,'}) => { "msg": "name: [u'package1,', u'package2,', u'package3']" } skipping: [localhost] => (item={u'name': u'Some description 2,', u'package': u'package4'}) TASK [Do something with individual packages in the list] ********************************************************************************* skipping: [localhost] => (item={u'name': u'Some description 2,', u'package': u'package4'}) included: /root/tmp/process_list.yml for localhost TASK [See what we have received] ********************************************************************************************************* ok: [localhost] => (item=package1,) => { "ansible_loop_var": "item", "item": "package1," } ok: [localhost] => (item=package2,) => { "ansible_loop_var": "item", "item": "package2," } ok: [localhost] => (item=package3) => { "ansible_loop_var": "item", "item": "package3" } PLAY RECAP ******************************************************************************************************************************* localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
使用loop_control / loop_var部分,因为否则外部和内部循环都将使用{{item}}作为循环变量-这将导致...有趣的结果:)
packageList
的情况定义一个带有空白列表的默认值。packageList | default ([])
如果未定义packageList
,则该作业将在一个空列表上进行迭代,这意味着它不会执行任何操作。