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 }}"
代码说明
subelements('vdisks'):将server_list中的每个VM条目与其下的vdisks列表展开,形成(VM信息, 单个磁盘信息)的元组,item.0对应VM信息,item.1对应单个磁盘的配置。outer_index:保留外层server_list的循环索引,用于从vm_info.results中获取对应VM的ID。item.1.capacity:直接引用单个磁盘的容量参数,实现逐个创建磁盘的需求。
这样就能确保先完成一个VM的所有磁盘创建,再处理下一个VM,完全匹配需求。
内容的提问来源于stack exchange,提问作者SolitaryRush
相关产品推荐
相关产品推荐

