VMware Cloud Community
lpalacio
Contributor
Contributor
Jump to solution

For Loop to Create Linked Clone

I have a script that will create a linked clone from a snapshot, apply a cuztomization and the boot the VM, what i would like to do is create a for loop that would do this for multiple VMs. however i have no idea how to do so i know a for loop is what i need but i don't know how i should format the code.

here's my script so far:

[Code]

connect-viserver "vCenter5"
$sourceVM = Get-VM "Pano-VM-1" | Get-View
$cloneName = "Pano-VM-1"
$cloneFolder = $sourceVM.parent
$cloneSpec = new-object Vmware.Vim.VirtualMachineCloneSpec
$cloneSpec.Snapshot = $sourceVM.Snapshot.CurrentSnapshot
$cloneSpec.Location = new-object Vmware.Vim.VirtualMachineRelocateSpec
$cloneSpec.Location.DiskMoveType = [Vmware.Vim.VirtualMachineRelocateDiskMoveOptions]::createNewChildDiskBacking
$sourceVM.CloneVM_Task( $cloneFolder, $cloneName, $cloneSpec )
Set-VM "Pano-VM-1" -OSCustomizationSpec "Pano-VDI" -confirm:$false
Start-VM "Pano-VM-1" -confirm:$false

[/Code]

Thank you.

0 Kudos
1 Solution

Accepted Solutions
mcowger
Immortal
Immortal
Jump to solution

for ($i=0; $i -lt 10; $i++) {

     $sourceVM = Get-VM "Pano-VM-1" | Get-View
     $cloneName = "Pano-VM-Clone-$i"
     $cloneFolder = $sourceVM.parent
     $cloneSpec = new-object Vmware.Vim.VirtualMachineCloneSpec
     $cloneSpec.Snapshot = $sourceVM.Snapshot.CurrentSnapshot
     $cloneSpec.Location = new-object Vmware.Vim.VirtualMachineRelocateSpec
     $cloneSpec.Location.DiskMoveType = [Vmware.Vim.VirtualMachineRelocateDiskMoveOptions]::createNewChildDiskBacking
     $sourceVM.CloneVM_Task( $cloneFolder, $cloneName, $cloneSpec )
     Set-VM "Pano-VM-Clone-$i" -OSCustomizationSpec "Pano-VDI" -confirm:$false
     Start-VM "Pano-VM-Clone-$i" -confirm:$false
}

That should work.


					
				
			
			
				
--Matt VCDX #52 blog.cowger.us

View solution in original post

0 Kudos
4 Replies
admin
Immortal
Immortal
Jump to solution

Hi,  lpalacio,

The following modification to your script should get the job done:

connect-viserver "vCenter5"
# get all vms you want to clone
$VMs = Get-VM "Pano-VM*"

foreach($vm in $VMs)
{
     $sourceVM = $vm | Get-View
     $cloneName = $vm.Name
     $cloneFolder = $sourceVM.parent
     $cloneSpec = new-object Vmware.Vim.VirtualMachineCloneSpec
     $cloneSpec.Snapshot = $sourceVM.Snapshot.CurrentSnapshot
     $cloneSpec.Location = new-object Vmware.Vim.VirtualMachineRelocateSpec
     $cloneSpec.Location.DiskMoveType = [Vmware.Vim.VirtualMachineRelocateDiskMoveOptions]::createNewChildDiskBacking
     $sourceVM.CloneVM_Task( $cloneFolder, $cloneName, $cloneSpec )
     Set-VM $vm.Name -OSCustomizationSpec "Pano-VDI" -confirm:$false
     Start-VM $vm.Name -confirm:$false
}
Hope this helps,
Ogniana
lpalacio
Contributor
Contributor
Jump to solution

Ogniana,

Thank you for the reply, i think i might have misworded my original post, what i would like to accomplish is create multiple linked clones from an existing golden image.

0 Kudos
mcowger
Immortal
Immortal
Jump to solution

for ($i=0; $i -lt 10; $i++) {

     $sourceVM = Get-VM "Pano-VM-1" | Get-View
     $cloneName = "Pano-VM-Clone-$i"
     $cloneFolder = $sourceVM.parent
     $cloneSpec = new-object Vmware.Vim.VirtualMachineCloneSpec
     $cloneSpec.Snapshot = $sourceVM.Snapshot.CurrentSnapshot
     $cloneSpec.Location = new-object Vmware.Vim.VirtualMachineRelocateSpec
     $cloneSpec.Location.DiskMoveType = [Vmware.Vim.VirtualMachineRelocateDiskMoveOptions]::createNewChildDiskBacking
     $sourceVM.CloneVM_Task( $cloneFolder, $cloneName, $cloneSpec )
     Set-VM "Pano-VM-Clone-$i" -OSCustomizationSpec "Pano-VDI" -confirm:$false
     Start-VM "Pano-VM-Clone-$i" -confirm:$false
}

That should work.


					
				
			
			
				
--Matt VCDX #52 blog.cowger.us
0 Kudos
lpalacio
Contributor
Contributor
Jump to solution

That's Perfect. Thanks for you help guys.

0 Kudos