以下是一项艰巨的任务,它会在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"
答案 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查询调整为确切的数据结构。