首页 > 解决方案 > ansible 中的嵌套循环 - Vcloud director

问题描述

以下是一个 ansible 任务,它返回 VCD vapp 中的虚拟机列表。我将结果存储在变量“all_vms”中。

- name: List VMs of VCD VAPP
  vcd_vapp:
    vapp_name: test
    host: lab.vcd
    operation: "list_vms"
  register: all_vms

变量“all_vms”的输出是一个字典列表,如下所示:

  "msg": [
        {
            "deployed": true,
            "ip_address": "192.168.0.151",
            "name": "esxi-67u1-1",
            "status": "POWERED_ON"
        },
        {
            "deployed": true,
            "ip_address": "192.168.0.150",
            "name": "vcsa-67u1",
            "status": "POWERED_ON"
        }
    ]

我需要检查所有 VM 的状态是否为 POWERED_ON,如果不是,我需要重复上述任务。我怎样才能做到这一点?

我尝试了块,但我不能循环块?希望有一些关于如何根据返回的输出重试任务的指示。

  block:
      - name: List VMs of VCD VAPP
        vcd_vapp:
          vapp_name: test
          host: labs.vcd
          operation: "list_vms"
        register: all_vms
      - name: Check if VMs are powered on
        set_fact:
          poweron_pending = "yes"
        loop: "{{ all_vms.msg }}"
        when: item.status != "POWERED_ON"
    until: poweron_pending == "yes"

标签: ansible

解决方案


如果您决定使用until,您还必须使用retries. json_query我认为您可以通过过滤结果并对其进行计数,重复该任务直到获得一个空列表,从而在单个任务中实现这一点。

这是一般的想法:

- name: List VMs of VCD VAPP
  vcd_vapp:
    vapp_name: test
    host: lab.vcd
    operation: "list_vms"
  register: all_vms
  retries: 100
  until: >-
    {{ all_vms | json_query("[?status!='POWERED_ON']") | length == 0 }}

免责声明:我没有要测试的 vcd。我只针对您提到的数据结构测试了我的查询。使用retries/until可能会改变您注册的 var,您可能必须将上述 json 查询调整为确切的数据结构。


推荐阅读