Ansible中的嵌套循环-Vcloud Director

时间:2019-06-12 00:38:19

标签: 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"

1 个答案:

答案 0 :(得分:3)

如果您决定使用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查询调整为确切的数据结构。