You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ansible中如何遍历含字典的嵌套列表为多VM创建VMware虚拟磁盘

Ansible Playbook 多VM多vCenter虚拟磁盘批量创建实现

需求说明

遍历动态生成的server_list变量,为每个VM在对应vCenter中调整CPU/内存,并批量创建指定容量的虚拟磁盘,支持多VM多vCenter场景。

现有变量定义

server_list:
- cpu_count: 6
  memory_size: 12288
  name: nodeA
  vcenter: vCenterA
  vdisks:
    - capacity: 107374182400
    - capacity: 214748364800

已实现功能(CPU/内存动态调整)

已完成跨vCenter的VM CPU/内存按需升级,Playbook代码如下:

- name: Gather current VM information
  vmware.vmware_rest.vcenter_vm_info:
    vcenter_username: "{{ SECRET.USER }}"
    vcenter_password: "{{ SECRET.PASS }}"
    vcenter_hostname: "{{ item.vcenter }}"
    names: "{{ item.name }}"
  loop: "{{ server_list }}"
  register: vm_info

- name: Upgrade CPU
  vmware.vmware_rest.vcenter_vm_hardware_cpu:
    vcenter_username: "{{ SECRET.USER }}"
    vcenter_password: "{{ SECRET.PASS }}"
    vcenter_hostname: "{{ item.vcenter }}"
    vm: "{{ vm_info.results[item_index]['value'][0]['vm'] }}"
    count: "{{ item.cpu_count }}"
  when: vm_info.results[item_index]['value'][0]['cpu_count'] != item.cpu_count
  loop: "{{ server_list }}"
  loop_control:
    index_var: item_index

待解决问题:虚拟磁盘批量创建

尝试直接遍历server_list并引用item.vdisks相关属性(如item.vdisks | map(attribute='capacity')、json_query等),无法实现为每个VM逐个创建对应虚拟磁盘的需求。当前未完成的磁盘创建任务代码:

- name: Create a new Disk
  vmware.vmware_rest.vcenter_vm_hardware_disk:
   vcenter_username: "{{ SECRET.USER }}"
   vcenter_password: "{{ SECRET.PASS }}"
   vcenter_hostname: "{{ item.vcenter }}"
   vm: "{{ vm_info.results[item_index]['value'][0]['vm'] }}"
   new_vmdk:
     capacity: "{{ }}" # 需要遍历每个vdisks的capacity
     type: SCSI
  loop: "{{ server_list }}"
  loop_control:
     index_var: item_index

期望效果:为每个VM依次创建所有指定容量的虚拟磁盘,完成后再处理下一个VM。

解决方案:使用嵌套循环(subelements过滤器)

通过subelements过滤器将server_list与每个item下的vdisks展开为嵌套循环,同时保留外层循环的索引以匹配vm_info中的VM ID。修改后的磁盘创建任务代码如下:

- name: Create virtual disks for VMs
  vmware.vmware_rest.vcenter_vm_hardware_disk:
    vcenter_username: "{{ SECRET.USER }}"
    vcenter_password: "{{ SECRET.PASS }}"
    vcenter_hostname: "{{ item.0.vcenter }}"
    vm: "{{ vm_info.results[outer_index]['value'][0]['vm'] }}"
    new_vmdk:
      capacity: "{{ item.1.capacity }}"
      type: SCSI
  loop: "{{ server_list | subelements('vdisks') }}"
  loop_control:
    index_var: outer_index
    label: "Creating disk ({{ item.1.capacity }} bytes) for VM {{ item.0.name }} on {{ item.0.vcenter }}"

代码说明

  1. subelements('vdisks'):将server_list中的每个VM条目与其下的vdisks列表展开,形成(VM信息, 单个磁盘信息)的元组,item.0对应VM信息,item.1对应单个磁盘的配置。
  2. outer_index:保留外层server_list的循环索引,用于从vm_info.results中获取对应VM的ID。
  3. item.1.capacity:直接引用单个磁盘的容量参数,实现逐个创建磁盘的需求。

这样就能确保先完成一个VM的所有磁盘创建,再处理下一个VM,完全匹配需求。


内容的提问来源于stack exchange,提问作者SolitaryRush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:13:32