以下是一个 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"
}
]
我需要检查所有虚拟机的状态是否均为 POWERED_ON,如果不是全部,我需要重复上述任务。我怎样才能做到这一点?
我尝试了 block ,但无法循环 block ?希望获得有关如何根据返回的输出重试任务的一些指示。
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"
最佳答案
如果您决定使用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 查询调整为确切的数据结构。
关于ansible - ansible 中的嵌套循环 - Vcloud 总监,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553254/