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

请求协助修复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

关键修复说明

  1. 新增磁盘扫描步骤:通过diskpart的rescan命令让Windows识别VMware扩容后的磁盘新增容量,这是分区扩展的必要前提
  2. 动态获取磁盘/分区信息:使用win_disk_facts替代硬编码的磁盘编号和分区编号,避免环境差异导致的错误
  3. 拆分任务执行主机:将Windows端的操作独立成新的play,切换到目标虚拟机执行(原Playbook所有任务都在localhost执行,无法直接操作Windows主机)
  4. 补充文件系统扩展:新增win_disk_volume任务确保文件系统同步扩展到分区的最大容量
  5. 修正容量计算逻辑:原计算式*13/10存在运算优先级问题,改为*1.3更直观且避免计算错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:47:54