通过嵌套循环迭代

问题描述 投票:0回答:2

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 }}"
ansible
2个回答
0
投票
如我的评论中所述,如果您只是想安装多个yum / apt软件包,通常只需将列表传递给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}}作为循环变量-这将导致...有趣的结果:)

0
投票
您可以为未定义packageList的情况定义一个带有空白列表的默认值。

packageList | default ([])

如果未定义packageList,则该作业将在一个空列表上进行迭代,这意味着它不会执行任何操作。
© www.soinside.com 2019 - 2024. All rights reserved.