请求协助修复Ansible VMWare虚拟机磁盘扩容的PowerShell执行故障
解决VMware虚拟机Windows磁盘扩容后分区扩展失败的问题
问题分析
VMware端已完成磁盘扩容,但Windows分区扩展环节失败,核心原因包括:
- Playbook末尾的分区扩展任务缺失实际执行代码
- 未先让Windows重新扫描磁盘以识别新增容量
- 硬编码磁盘/分区编号可能与实际环境不匹配
修复后的完整Ansible Playbook
--- - name: vm disk expansion hosts: localhost become: false gather_facts: false tasks: - name: 获取虚拟机现有磁盘信息 vmware_guest_disk_info: validate_certs: False datacenter: '{{ data_center }}' name: '{{ vm_name }}' register: existing_disk - name: 获取磁盘0对应的存储池 set_fact: disk_zero_datastore: "{{ item.value.backing_datastore }}" with_dict: "{{ existing_disk.guest_disk_info }}" when: item.key == '0' - debug: msg: "{{ disk_zero_datastore }}" when: disk_zero_datastore is defined - name: 获取SCSI控制器类型 set_fact: scsi_type: "{{ item.value.controller_type }}" with_dict: "{{ existing_disk.guest_disk_info }}" when: item.key == '0' - debug: msg: '{{ scsi_type }}' when: scsi_type is defined - name: 获取磁盘0的单元编号 set_fact: unit_number: "{{ item.value.unit_number }}" with_dict: "{{ existing_disk.guest_disk_info }}" when: item.key == '0' - debug: msg: '{{ unit_number }}' when: unit_number is defined - name: 计算扩容30%后的磁盘容量(KB) set_fact: disc_size: "{{ (item.value.capacity_in_kb|int * 1.3)|round(0, 'floor')|int }}" with_dict: "{{ existing_disk.guest_disk_info }}" when: item.key == '0' - debug: msg: '{{ disc_size }}' when: disc_size is defined - name: 关闭虚拟机 community.vmware.vmware_guest: validate_certs: no datacenter: "{{ data_center }}" name: "{{ vm_name }}" state: shutdownguest delegate_to: localhost failed_when: vm_shutdown.instance.hw_power_status != 'poweredOff' and vm_shutdown.changed == false register: vm_shutdown - name: 等待15秒确保虚拟机完全关机 ansible.builtin.pause: seconds: 15 - name: 在VMware中调整磁盘容量 community.vmware.vmware_guest_disk: validate_certs: no datacenter: "{{ data_center }}" name: "{{ vm_name }}" disk: - size_kb: "{{ disc_size|int }}" state: present unit_number: "{{ unit_number }}" scsi_controller: 0 scsi_type: "{{ scsi_type }}" delegate_to: localhost register: disk_facts - name: 启动虚拟机 community.vmware.vmware_guest: validate_certs: no name: "{{ vm_name }}" state: poweredon delegate_to: localhost - name: 等待虚拟机开机并建立连接 wait_for_connection: delay: 15 timeout: 300 - name: 扩展Windows磁盘分区与文件系统 hosts: "{{ vm_name }}" gather_facts: true tasks: - name: 重新扫描磁盘让Windows识别新增容量 win_command: "echo rescan | diskpart" - name: 获取Windows磁盘和分区信息 win_disk_facts: - name: 扩展系统分区至最大容量 win_partition: disk_number: "{{ item.disk_number }}" partition_number: "{{ item.partition_number }}" partition_size: -1 state: present loop: "{{ ansible_facts.disks | json_query('[].partitions[]') }}" when: - item.type == 'basic' - item.mount_point == 'C:' # 根据实际挂载点调整 - name: 扩展文件系统以匹配分区容量 win_disk_volume: drive_letter: C state: expanded
关键修复说明
- 新增磁盘扫描步骤:通过
diskpart的rescan命令让Windows识别VMware扩容后的磁盘新增容量,这是分区扩展的必要前提 - 动态获取磁盘/分区信息:使用
win_disk_facts替代硬编码的磁盘编号和分区编号,避免环境差异导致的错误 - 拆分任务执行主机:将Windows端的操作独立成新的play,切换到目标虚拟机执行(原Playbook所有任务都在localhost执行,无法直接操作Windows主机)
- 补充文件系统扩展:新增
win_disk_volume任务确保文件系统同步扩展到分区的最大容量 - 修正容量计算逻辑:原计算式
*13/10存在运算优先级问题,改为*1.3更直观且避免计算错误
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

