ansible-Vcloud控制器中的嵌套循环
下面是一个ansible任务,返回VCD vapp中的虚拟机列表。我将结果存储在变量“all_vms”中 变量“all_vms”的输出是一个字典列表,如下所示: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"
"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 }}