ansible - ansible 中的嵌套循环 - Vcloud director
问题描述
以下是一个 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"
解决方案
如果您决定使用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 查询调整为确切的数据结构。
推荐阅读
- node.js - 在 nextjs react 应用程序的 webpack 捆绑期间复制 python 脚本以构建文件夹
- react-native - React-hook 表单面临的问题
- html - 如何在 python 中替换图像 src 中的域?
- javascript - 表格单元格排序更改了添加 URL 后的排序内容
- ios - SwiftUI 更改 EditButton 文本颜色
- java - Java从API接收日期时将日期更改为下一天
- android - 使用适用于 Android 的 OpenTok lib 时,相机屏幕未显示在另一侧
- python-3.x - 在任务计划程序中使用网络驱动器
- json - 用胶水爬虫读取json返回UNKNOWN分类
- python - 在单独的文件中加载保存的模型 Tensorflow-Keras M1 Mac