2017-02-07 4 views
3

Ich arbeite an einem Projekt, wo ich klonen eine VM mit RbVmomi und nachdem der Klon abgeschlossen ist, möchte ich die VM ReConfig.Wie Größe der VM-Festplatte mit RbVmomi in Ruby

Das Klonen funktioniert gut, aber ich habe einige Probleme, wenn ich die Festplattengröße der VM ändern möchte. Ich kann die Anzahl der CPUs ändern und die Größe des Speichers, aber wenn ich versuche, die Festplattengröße ich den Fehler zu ändern:

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

Code:

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 

Antwort

1

Da Sie versuchen, eine vorhandene Virtuelle Maschine neu zu konfigurieren, können Sie etwas tun könnte:

#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

Danke das funktioniert perfekt! –

0

Auf ihrem Github ist ein complete example. Hier sind die relevanten Teile:

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

Der vollständige Code ist:

#!/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 
Verwandte Themen