ansible-Vcloud控制器中的嵌套循环

ansible-Vcloud控制器中的嵌套循环,ansible,Ansible,下面是一个ansible任务,返回VCD vapp中的虚拟机列表。我将结果存储在变量“all_vms”中 变量“all_vms”的输出是一个字典列表,如下所示: "msg": [ { "deployed": true, "ip_address": "192.168.0.151", "name": "esxi-67u1-1", "status": "POWERED_ON"

下面是一个ansible任务,返回VCD vapp中的虚拟机列表。我将结果存储在变量“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"
        }
    ]

我需要检查所有虚拟机的状态是否都已通电,如果不是全部,我需要重复上述任务。我该怎么做

我试过方块,但我不能在方块上循环?如果您能提供一些关于如何基于返回的输出重试任务的建议,将不胜感激

  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"


如果您决定使用
直到
,您还必须通过
重试设置最大循环次数
。我认为你可以在一个单一的任务中实现这一点,方法是过滤结果并计数,重复任务直到得到一个空列表

以下是总体思路:

- 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查询调整为精确的数据结构。

谢谢@Zeitounator,解决方案是有效的。但只想检查是否有其他方法使用嵌套循环?就像我想表演的那样?
- 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 }}