サンプルが全てグローバル変数使いまくりで気持ち悪かったので、どうにかできないかな、とコード見ながら書いた。
無駄にセッション管理ができるようなので、それも盛り込んでみた。
ただし、クッソ手抜き。例によりPerl
use strict; use warnings; use VMware::VILib; use VMware::VICommon; my $SERVICE_URL = "https://192.168.11.128/sdk/webService"; my $USER_NAME = "ryozi"; my $PASSWORD = "XXXXXX"; my $SESSION_FILE = 'session'; my $vim = new Vim(service_url =>$SERVICE_URL); if(-f $SESSION_FILE){ eval{ $vim->load_session(session_file => $SESSION_FILE); }; print STDERR "$@\n" if $@; } if($vim->is_logout_on_disconnect){ $vim->login( user_name => $USER_NAME, password => $PASSWORD); } my $vms = $vim->find_entity_views(view_type => 'VirtualMachine'); use Data::Dumper; print Dumper($vms); $vim->save_session(session_file => $SESSION_FILE);
単純に全部の情報を取ってきてDumpすると、
何かインストールしたVMなら、1VMあたり100KBぐらいの情報量に。
find_entity_viewsのfilterプロパティを使ってname指定してVM名を絞り込むことも可能です。
$VAR1 = [
bless( {
(中略)
'config' => bless( {
'guestId' => 'centos64Guest',
'files' => bless( {
'suspendDirectory' => '[datastore_small1] CentOS 6.2',
'vmPathName' => '[datastore_small1] CentOS 6.2/CentOS 6.2.vmx',
'logDirectory' => '[datastore_small1] CentOS 6.2',
'snapshotDirectory' => '[datastore_small1] CentOS 6.2'
}, 'VirtualMachineFileInfo' ),
'vAssertsEnabled' => '0',
'firmware' => 'bios',
'uuid' => '564d82b0-0ed0-3e7f-baa4-9ba3dd5c62d3',
'bootOptions' => bless( {
'enterBIOSSetup' => '0',
'bootRetryDelay' => '10000',
'bootRetryEnabled' => '0',
'bootDelay' => '0'
}, 'VirtualMachineBootOptions' ),
'cpuHotRemoveEnabled' => '0',
'hardware' => bless( {
'virtualSMCPresent' => '0',
'virtualICH7MPresent' => '0',
'device' => [
bless( {
'deviceInfo' => bless( {
'summary' => 'IDE 0',
'label' => 'IDE 0'
}, 'Description' ),
'busNumber' => '0',
'key' => '200'
}, 'VirtualIDEController' ),
bless( {
'device' => [
'3002'
],
'deviceInfo' => bless( {
'summary' => 'IDE 1',
'label' => 'IDE 1'
}, 'Description' ),
'busNumber' => '1',
'key' => '201'
}, 'VirtualIDEController' ),
bless( {
'device' => [
'600',
'700'
],
'deviceInfo' => bless( {
'summary' => 'PS2 controller 0',
'label' => 'PS2 controller 0'
}, 'Description' ),
'busNumber' => '0',
'key' => '300'
}, 'VirtualPS2Controller' ),
bless( {
'device' => [
'500',
'12000',
'1000',
'4000'
],
'deviceInfo' => bless( {
'summary' => 'PCI controller 0',
'label' => 'PCI controller 0'
}, 'Description' ),
'busNumber' => '0',
'key' => '100'
}, 'VirtualPCIController' ),
bless( {
'device' => [
'8000'
],
'deviceInfo' => bless( {
'summary' => 'SIO controller 0',
'label' => 'SIO controller 0'
}, 'Description' ),
'busNumber' => '0',
'key' => '400'
}, 'VirtualSIOController' ),
bless( {
'unitNumber' => '0',
'deviceInfo' => bless( {
'summary' => 'Keyboard',
'label' => 'Keyboard '
}, 'Description' ),
'controllerKey' => '300',
'key' => '600'
}, 'VirtualKeyboard' ),
bless( {
'backing' => bless( {
'hostPointingDevice' => 'autodetect',
'useAutoDetect' => '0',
'deviceName' => ''
}, 'VirtualPointingDeviceDeviceBackingInfo' ),
'unitNumber' => '1',
'deviceInfo' => bless( {
'summary' => 'Pointing device; Device',
'label' => 'Pointing device'
}, 'Description' ),
'controllerKey' => '300',
'key' => '700'
}, 'VirtualPointingDevice' ),
bless( {
'useAutoDetect' => '0',
'enable3DSupport' => '0',
'videoRamSizeInKB' => '8192',
'unitNumber' => '0',
'deviceInfo' => bless( {
'summary' => 'Video card',
'label' => 'Video card '
}, 'Description' ),
'numDisplays' => '1',
'controllerKey' => '100',
'key' => '500'
}, 'VirtualMachineVideoCard' ),
bless( {
'allowUnrestrictedCommunication' => '0',
'id' => '-581147949',
'unitNumber' => '17',
'deviceInfo' => bless( {
'summary' => 'Device on the virtual machine PCI bus that provides support for the virtual machine communication interface',
'label' => 'VMCI device'
}, 'Description' ),
'controllerKey' => '100',
'key' => '12000'
}, 'VirtualMachineVMCIDevice' ),
bless( {
'sharedBus' => bless( {
'val' => 'noSharing'
}, 'VirtualSCSISharing' ),
'device' => [
'2000'
],
'key' => '1000',
'hotAddRemove' => '1',
'scsiCtlrUnitNumber' => '7',
'deviceInfo' => bless( {
'summary' => 'LSI Logic',
'label' => 'SCSI controller 0'
}, 'Description' ),
'unitNumber' => '3',
'controllerKey' => '100',
'busNumber' => '0'
}, 'VirtualLsiLogicController' ),
bless( {
'shares' => bless( {
'shares' => '1000',
'level' => bless( {
'val' => 'normal'
}, 'SharesLevel' )
}, 'SharesInfo' ),
'capacityInKB' => '41943040',
'storageIOAllocation' => bless( {
'shares' => bless( {
'shares' => '1000',
'level' => bless( {
'val' => 'normal'
}, 'SharesLevel' )
}, 'SharesInfo' ),
'limit' => '-1'
}, 'StorageIOAllocationInfo' ),
'backing' => bless( {
'writeThrough' => '0',
'fileName' => '[datastore_small1] CentOS 6.2/CentOS 6.2.vmdk',
'uuid' => '6000C29d-413e-56de-1ff7-22deb6591e4d',
'digestEnabled' => '0',
'diskMode' => 'persistent',
'datastore' => bless( {
'value' => '4f686c32-486bf4cf-b9b0-001517193f27',
'type' => 'Datastore'
}, 'ManagedObjectReference' ),
'thinProvisioned' => '1',
'split' => '0',
'contentId' => 'ec752ee10acbe3f8ad611f3c5f214d1b'
}, 'VirtualDiskFlatVer2BackingInfo' ),
'unitNumber' => '0',
'deviceInfo' => bless( {
'summary' => '41,943,040 KB',
'label' => 'Hard disk 1'
}, 'Description' ),
'controllerKey' => '1000',
'key' => '2000'
}, 'VirtualDisk' ),
bless( {
'connectable' => bless( {
'allowGuestControl' => '1',
'status' => 'untried',
'connected' => '0',
'startConnected' => '0'
}, 'VirtualDeviceConnectInfo' ),
'backing' => bless( {
'fileName' => '[] /usr/lib/vmware/isoimages/linux.iso'
}, 'VirtualCdromIsoBackingInfo' ),
'unitNumber' => '0',
'deviceInfo' => bless( {
'summary' => 'ISO [] /usr/lib/vmware/isoimages/linux.iso',
'label' => 'CD/DVD drive 1'
}, 'Description' ),
'controllerKey' => '201',
'key' => '3002'
}, 'VirtualCdrom' ),
bless( {
'macAddress' => '00:0c:29:5c:62:d3',
'backing' => bless( {
'network' => bless( {
'value' => 'HaNetwork-VM Network',
'type' => 'Network'
}, 'ManagedObjectReference' ),
'useAutoDetect' => '0',
'deviceName' => 'VM Network'
}, 'VirtualEthernetCardNetworkBackingInfo' ),
'wakeOnLanEnabled' => '1',
'key' => '4000',
'connectable' => bless( {
'allowGuestControl' => '1',
'status' => 'untried',
'connected' => '0',
'startConnected' => '1'
}, 'VirtualDeviceConnectInfo' ),
'addressType' => 'generated',
'deviceInfo' => bless( {
'summary' => 'VM Network',
'label' => 'Network adapter 1'
}, 'Description' ),
'unitNumber' => '7',
'controllerKey' => '100'
}, 'VirtualE1000' ),
bless( {
'connectable' => bless( {
'allowGuestControl' => '1',
'status' => 'untried',
'connected' => '0',
'startConnected' => '0'
}, 'VirtualDeviceConnectInfo' ),
'backing' => bless( {
'useAutoDetect' => '0',
'deviceName' => ''
}, 'VirtualFloppyRemoteDeviceBackingInfo' ),
'unitNumber' => '0',
'deviceInfo' => bless( {
'summary' => 'Remote',
'label' => 'Floppy drive 1'
}, 'Description' ),
'controllerKey' => '400',
'key' => '8000'
}, 'VirtualFloppy' )
],
'numCoresPerSocket' => '1',
'numCPU' => '1',
'memoryMB' => '2048'
}, 'VirtualHardware' ),
'guestAutoLockEnabled' => '0',
'instanceUuid' => '52671d7e-ed70-4f2f-aaf3-4e999b1b22b2',
'memoryAllocation' => bless( {
'shares' => bless( {
'shares' => '20480',
'level' => bless( {
'val' => 'normal'
}, 'SharesLevel' )
}, 'SharesInfo' ),
'reservation' => '0',
'expandableReservation' => '0',
'limit' => '-1'
}, 'ResourceAllocationInfo' ),
'swapPlacement' => 'inherit',
'memoryHotAddEnabled' => '0',
'maxMksConnections' => '40',
'template' => '0',
'tools' => bless( {
'lastInstallInfo' => bless( {
'counter' => '0'
}, 'ToolsConfigInfoToolsLastInstallInfo' ),
'toolsUpgradePolicy' => 'manual',
'afterPowerOn' => '1',
'syncTimeWithHost' => '0',
'beforeGuestStandby' => '1',
'toolsVersion' => '8384',
'afterResume' => '1',
'beforeGuestShutdown' => '1'
}, 'ToolsConfigInfo' ),
'name' => 'CentOS 6.2',
'modified' => '1970-01-01T00:00:00Z',
'guestFullName' => 'CentOS 4/5/6 (64-bit)',
'cpuAllocation' => bless( {
'shares' => bless( {
'shares' => '1000',
'level' => bless( {
'val' => 'normal'
}, 'SharesLevel' )
}, 'SharesInfo' ),
'reservation' => '0',
'expandableReservation' => '0',
'limit' => '-1'
}, 'ResourceAllocationInfo' ),
'changeTrackingEnabled' => '0',
'annotation' => '',
'npivTemporaryDisabled' => '1',
'changeVersion' => '2012-04-03T09:52:50.536192Z',
'alternateGuestName' => '',
'locationId' => '564d82b0-0ed0-3e7f-baa4-9ba3dd5c62d3',
'initialOverhead' => bless( {
'initialMemoryReservation' => '94724096',
'initialSwapReservation' => '126910464'
}, 'VirtualMachineConfigInfoOverheadInfo' ),
'defaultPowerOps' => bless( {
'suspendType' => 'hard',
'powerOffType' => 'soft',
'defaultPowerOffType' => 'soft',
'defaultSuspendType' => 'hard',
'resetType' => 'soft',
'standbyAction' => 'powerOnSuspend',
'defaultResetType' => 'soft'
}, 'VirtualMachineDefaultPowerOpInfo' ),
'flags' => bless( {
'snapshotPowerOffBehavior' => 'powerOff',
'htSharing' => 'any',
'runWithDebugInfo' => '0',
'monitorType' => 'release',
'disableAcceleration' => '0',
'virtualExecUsage' => 'hvAuto',
'recordReplayEnabled' => '0',
'enableLogging' => '1',
'useToe' => '0',
'diskUuidEnabled' => '0',
'virtualMmuUsage' => 'automatic'
}, 'VirtualMachineFlagInfo' ),
'version' => 'vmx-08',
(中略)
}, 'VirtualMachine' )
];たくさん出たねーよかったねー
中略してしまったけど、興味深かったのが、無効なメソッドのリスト(disabledMethodプロパティ)があったこと。ほとんど無効になってた。vCenterがないとほとんどだめっぽい。
でもGuestShutdownとかはpowerOpsのサンプルで叩けたし、もしかしたら叩けるかもしれないけど、試すのめんどっちい。
あと、CloneとかTemplate、カスタマイズ構成とかはvCenterが前提だったのね。
vCenter SDKって名前にして分けてくれればいいのに。
vCenter試用できるけど60日ぐらいだし、1年20万のライセンスなんか買いたくないですし。
ゲームクリア感が出てきたけども、何とか擬似クローン的なことをやってみたい。
vmkfstoolsを使えば、仮想ディスク(vmdk)の複製が出来るので、
これをうまいこと空のVMへシステムディスクとしてマウントできれば、クローンっぽい挙動にはなりそうです。
もしかしてほかのVMMのほうが自由度高いんじゃ。Xenとかどうなんだろう。