98 lines
4.1 KiB
PowerShell
98 lines
4.1 KiB
PowerShell
Function New-InstantClone {
|
|
<#
|
|
.NOTES
|
|
===========================================================================
|
|
Created by: William Lam
|
|
Date: Apr 29, 2018
|
|
Organization: VMware
|
|
Blog: www.virtuallyghetto.com
|
|
Twitter: @lamw
|
|
===========================================================================
|
|
.SYNOPSIS
|
|
This function demonstrates the use of the new "Parentless" Instant Clone
|
|
API that was introduced in vSphere 6.7
|
|
.DESCRIPTION
|
|
Function to create new "Parentless" Instant Clones in vSphere 6.7
|
|
.EXAMPLE
|
|
$SourceVM = "Foo"
|
|
$newVMName = Foo-IC-1
|
|
$guestCustomizationValues = @{
|
|
"guestinfo.ic.hostname" = $newVMName
|
|
"guestinfo.ic.ipaddress" = "192.168.30.10"
|
|
"guestinfo.ic.netmask" = "255.255.255.0"
|
|
"guestinfo.ic.gateway" = "192.168.30.1"
|
|
"guestinfo.ic.dns" = "192.168.30.1"
|
|
}
|
|
New-InstantClone -SourceVM $SourceVM -DestinationVM $newVMName -CustomizationFields $guestCustomizationValues
|
|
.NOTES
|
|
Make sure that you have both a vSphere 6.7 env (VC/ESXi) as well as
|
|
as the latest PowerCLI 10.1 installed which is reuqired to use vSphere 6.7 APIs
|
|
#>
|
|
param(
|
|
[Parameter(Mandatory=$true)][String]$SourceVM,
|
|
[Parameter(Mandatory=$true)][String]$DestinationVM,
|
|
[Parameter(Mandatory=$true)][Hashtable]$CustomizationFields
|
|
)
|
|
$vm = Get-VM -Name $SourceVM
|
|
|
|
$config = @()
|
|
$CustomizationFields.GetEnumerator() | Foreach-Object {
|
|
$optionValue = New-Object VMware.Vim.OptionValue
|
|
$optionValue.Key = $_.Key
|
|
$optionValue.Value = $_.Value
|
|
$config += $optionValue
|
|
}
|
|
|
|
# SourceVM must either be running or running but in Frozen State
|
|
if($vm.PowerState -ne "poweredOn") {
|
|
Write-Host -ForegroundColor Red "Instant Cloning is only supported on a PoweredOn or Frozen VM"
|
|
break
|
|
}
|
|
|
|
# SourceVM == Powered On
|
|
if((Get-VM $SourceVM).ExtensionData.Runtime.InstantCloneFrozen -eq $false) {
|
|
|
|
# Retrieve all Network Adapters for SourceVM
|
|
$vmNetworkAdapters = @()
|
|
$devices = $vm.ExtensionData.Config.Hardware.Device
|
|
foreach ($device in $devices) {
|
|
if($device -is [VMware.Vim.VirtualEthernetCard]) {
|
|
$vmNetworkAdapters += $device
|
|
}
|
|
}
|
|
|
|
$spec = New-Object VMware.Vim.VirtualMachineInstantCloneSpec
|
|
$locationSpec = New-Object VMware.Vim.VirtualMachineRelocateSpec
|
|
|
|
# Disconect all NICs for new Instant Clone to ensure no dupe addresses on network
|
|
# post-Instant Clone workflow needs to renable after uypdating GuestOS
|
|
foreach ($vmNetworkAdapter in $vmNetworkAdapters) {
|
|
$networkName = $vmNetworkAdapter.backing.deviceName
|
|
$deviceConfigSpec = New-Object VMware.Vim.VirtualDeviceConfigSpec
|
|
$deviceConfigSpec.Operation = "edit"
|
|
$deviceConfigSpec.Device = $vmNetworkAdapter
|
|
$deviceConfigSpec.Device.backing = New-Object VMware.Vim.VirtualEthernetCardNetworkBackingInfo
|
|
$deviceConfigSpec.device.backing.deviceName = $networkName
|
|
$connectable = New-Object VMware.Vim.VirtualDeviceConnectInfo
|
|
$connectable.MigrateConnect = "disconnect"
|
|
$deviceConfigSpec.Device.Connectable = $connectable
|
|
$locationSpec.DeviceChange += $deviceConfigSpec
|
|
}
|
|
|
|
$spec.Config = $config
|
|
$spec.Location = $locationSpec
|
|
$spec.Name = $DestinationVM
|
|
# SourceVM == Frozen
|
|
} else {
|
|
$spec = New-Object VMware.Vim.VirtualMachineInstantCloneSpec
|
|
$locationSpec = New-Object VMware.Vim.VirtualMachineRelocateSpec
|
|
$spec.Config = $config
|
|
$spec.Location = $locationSpec
|
|
$spec.Name = $DestinationVM
|
|
}
|
|
|
|
Write-Host "Creating Instant Clone $DestinationVM ..."
|
|
$task = $vm.ExtensionData.InstantClone_Task($spec)
|
|
$task1 = Get-Task -Id ("Task-$($task.value)")
|
|
$task1 | Wait-Task | Out-Null
|
|
} |