2017-02-07 12 views
3

Я работаю над проектом, где я клонирую VM с RbVmomi, и после завершения клонирования я хочу, чтобы ReConfig VM.Как изменить размер диска VM с помощью RbVmomi в Ruby

Клонирование работает отлично, но у меня есть некоторые проблемы, когда я хочу изменить размер диска виртуальной машины. Я могу изменить количество процессоров и размер памяти, но когда я пытаюсь изменить размер диска, я получаю ошибку:

RbVmomi::Fault (InvalidDeviceSpec: Invalid configuration for device '0'.): 

Код:

if json.has_key?('CPU_COUNT') && json.has_key?('RAM') 
    vm_cfg = { 
     :numCPUs => json['CPU_COUNT'], 
     :memoryMB => json['RAM'], 
     :deviceChange => [ 
      :operation => :edit, #also tried with :add 
      :fileOperation => :create, 
      :device => RbVmomi::VIM.VirtualDisk(
       :key => 0, 
       :backing => RbVmomi::VIM.VirtualDiskFlatVer2BackingInfo(
       :fileName => '[datastore]', 
       :diskMode => :persistent, 
       :thinProvisioned => true 
     ), 
      :controllerKey => 1000, 
      :unitNumber => 0, 
      :capacityInKB => json['DISK_SIZE'] * 1024 * 1024 
    ) 
    ] 
    } 

    dc.find_vm(vmID).ReconfigVM_Task(:spec => vm_cfg).wait_for_completion 

ответ

1

Поскольку вы пытаетесь перенастроить существующую виртуальную машину, вы могли бы сделать что-то вроде этого:

#Get the disk from the VM (assuming you only have one disk) 
disk = vm.config.hardware.device.grep(RbVmomi::VIM::VirtualDisk).first 

#Set new capacity 
disk.capacityInKB = new_capacity_in_kb 

#Add the disk to the devicechange, specifying operation edit 
vm_cfg = { 
    :deviceChange => [ 
     { 
      :device => disk, 
      :operation => :edit 
     } 
    ] 
} 

#Start the ReconfigVM_Task with the disk edit on the VM 
vm.ReconfigVM_Task(:spec => vm_cfg).wait_for_completion 
+0

Спасибо , это работает отлично! –

0

На их Github является complete example. Вот соответствующие части:

{ 
      operation: :add, 
      fileOperation: :create, 
      device: VIM.VirtualDisk(
      key: 0, 
      backing: VIM.VirtualDiskFlatVer2BackingInfo(
       fileName: '[datastore1]', 
       diskMode: :persistent, 
       thinProvisioned: true, 
      ), 
      controllerKey: 1000, 
      unitNumber: 0, 
      capacityInKB: 4000000, 
     ) 
     } 

Полный код:

#!/usr/bin/env ruby 
require 'trollop' 
require 'rbvmomi' 
require 'rbvmomi/trollop' 

VIM = RbVmomi::VIM 

opts = Trollop.options do 
    banner <<-EOS 
Create a VM. 

Usage: 
    create_vm-1.9.rb [options] 

VIM connection options: 
    EOS 

    rbvmomi_connection_opts 

    text <<-EOS 

VM location options: 
    EOS 

    rbvmomi_datacenter_opt 

    text <<-EOS 

Other options: 
    EOS 
end 

Trollop.die("must specify host") unless opts[:host] 
vm_name = ARGV[0] or abort "must specify VM name" 

vim = VIM.connect opts 
dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found" 
vmFolder = dc.vmFolder 
hosts = dc.hostFolder.children 
rp = hosts.first.resourcePool 

vm_cfg = { 
    name: vm_name, 
    guestId: 'otherGuest', 
    files: { vmPathName: '[datastore1]' }, 
    numCPUs: 1, 
    memoryMB: 128, 
    deviceChange: [ 
    { 
     operation: :add, 
     device: VIM.VirtualLsiLogicController(
     key: 1000, 
     busNumber: 0, 
     sharedBus: :noSharing, 
    ) 
    }, { 
     operation: :add, 
     fileOperation: :create, 
     device: VIM.VirtualDisk(
     key: 0, 
     backing: VIM.VirtualDiskFlatVer2BackingInfo(
      fileName: '[datastore1]', 
      diskMode: :persistent, 
      thinProvisioned: true, 
     ), 
     controllerKey: 1000, 
     unitNumber: 0, 
     capacityInKB: 4000000, 
    ) 
    }, { 
     operation: :add, 
     device: VIM.VirtualE1000(
     key: 0, 
     deviceInfo: { 
      label: 'Network Adapter 1', 
      summary: 'VM Network', 
     }, 
     backing: VIM.VirtualEthernetCardNetworkBackingInfo(
      deviceName: 'VM Network', 
     ), 
     addressType: 'generated' 
    ) 
    } 
    ], 
    extraConfig: [ 
    { 
     key: 'bios.bootOrder', 
     value: 'ethernet0' 
    } 
    ] 
} 

vmFolder.CreateVM_Task(:config => vm_cfg, :pool => rp).wait_for_completion