This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python3 | |
from pyVim.connect import SmartConnect, Disconnect | |
from pyVmomi import vim, vmodl | |
import ssl | |
import atexit | |
# 接続情報 | |
host = 'vCenter IP or Host Name' | |
username = 'administrator@vsphere.local' | |
password = '' | |
# 作成するVM情報 | |
vm_name = 'TEST_VM' | |
cpu_num = 1 | |
mem_size_mb = 2048 | |
guestId = 'centos64Guest' # http://urx.red/Az19 | |
vm_version = 'vmx-13' # http://urx.red/Az1L, https://gist.github.com/sky-joker/d188385f33296f422b3b54532d98b84d | |
datastore_name = 'VM' | |
port_group_name = 'VM Network' | |
disk_size = 32 * 1024 * 1024 | |
def main(): | |
# SSL証明書対策 | |
context = None | |
if hasattr(ssl, '_create_unverified_context'): | |
context = ssl._create_unverified_context() | |
# vCenterへ接続 | |
si = SmartConnect(host = host, | |
user = username, | |
pwd = password, | |
sslContext = context) | |
# 処理完了時にvCenterから切断 | |
atexit.register(Disconnect, si) | |
# VM情報の取得 | |
content = si.content | |
datacenter = content.rootFolder.childEntity[0] | |
vmfolder = datacenter.vmFolder | |
hosts = datacenter.hostFolder.childEntity | |
resource_pool = hosts[0].resourcePool | |
datastore_path = '[' + datastore_name + ']' + vm_name | |
# VMファイル保存情報, http://urx.red/Az2j | |
vmx_file = vim.vm.FileInfo(logDirectory=None, | |
snapshotDirectory=None, | |
suspendDirectory=None, | |
vmPathName=datastore_path) | |
# 仮想デバイス設定の配列 | |
virtual_device_config = [] | |
# Network設定 | |
# ポートグループのオブジェクトを取得 | |
container = content.viewManager.CreateContainerView(content.rootFolder, [vim.Network], True) | |
for c in container.view: | |
if c.name == port_group_name: | |
pgr_obj = c | |
# nicを新規で付けてポートグループを設定 | |
nic_spec = vim.vm.device.VirtualDeviceSpec() | |
nic_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add | |
nic_spec.device = vim.vm.device.VirtualVmxnet3() | |
nic_spec.device.backing = vim.vm.device.VirtualEthernetCard.NetworkBackingInfo() | |
nic_spec.device.backing.network = pgr_obj | |
nic_spec.device.backing.deviceName = port_group_name | |
nic_spec.device.connectable = vim.vm.device.VirtualDevice.ConnectInfo() | |
nic_spec.device.connectable.startConnected = True | |
nic_spec.device.connectable.allowGuestControl = True | |
virtual_device_config.append(nic_spec) | |
# CDROMのSATAコントローラー設定 | |
sata_spec = vim.vm.device.VirtualDeviceSpec() | |
sata_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add | |
sata_spec.device = vim.vm.device.VirtualAHCIController() | |
sata_spec.device.key = 15000 | |
sata_spec.device.unitNumber = 24 | |
sata_spec.device.device = [16000] | |
sata_spec.device.busNumber = 0 | |
virtual_device_config.append(sata_spec) | |
# CDROM設定 | |
cd_spec = vim.vm.device.VirtualDeviceSpec() | |
cd_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add | |
cd_spec.device = vim.vm.device.VirtualCdrom() | |
cd_spec.device.backing = vim.vm.device.VirtualCdrom.RemotePassthroughBackingInfo() | |
cd_spec.device.key = 16000 | |
cd_spec.device.controllerKey = 15000 | |
cd_spec.device.unitNumber = 0 | |
cd_spec.device.connectable = vim.vm.device.VirtualDevice.ConnectInfo() | |
cd_spec.device.connectable.startConnected = False | |
cd_spec.device.connectable.allowGuestControl = True | |
cd_spec.device.connectable.connected = False | |
cd_spec.device.connectable.status = 'untried' | |
virtual_device_config.append(cd_spec) | |
# HDDのLSIコントローラー設定 | |
lsi_spec = vim.vm.device.VirtualDeviceSpec() | |
lsi_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add | |
lsi_spec.device = vim.vm.device.ParaVirtualSCSIController() # http://urx.red/Az2P | |
lsi_spec.device.sharedBus = vim.vm.device.VirtualSCSIController.Sharing.noSharing | |
virtual_device_config.append(lsi_spec) | |
# HDD設定 | |
disk_spec = vim.vm.device.VirtualDeviceSpec() | |
disk_spec.fileOperation = "create" | |
disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add | |
disk_spec.device = vim.vm.device.VirtualDisk() | |
disk_spec.device.backing = vim.vm.device.VirtualDisk.FlatVer2BackingInfo() | |
disk_spec.device.backing.thinProvisioned = True | |
disk_spec.device.backing.diskMode = 'persistent' | |
disk_spec.device.unitNumber = 0 | |
disk_spec.device.capacityInKB = disk_size | |
disk_spec.device.controllerKey = 0 | |
virtual_device_config.append(disk_spec) | |
# VM作成 | |
config = vim.vm.ConfigSpec(name = vm_name, | |
memoryMB = mem_size_mb, | |
files = vmx_file, | |
guestId = guestId, | |
version = vm_version, | |
deviceChange = virtual_device_config) | |
vmfolder.CreateVM_Task(config=config, pool=resource_pool) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment