Ce message est également disponible en : French
[Powercli] Script : deploy VMs with random configuration
How to deploy VMs with random configurations based on a template for your lab or infrastructure
For my lab, i need really often to deploy several virtual machines very quickly based on a VM or a template.
This is why, i have create a script to deploy VMs based on a template with random configurations (vCPU/Memory) and for your infrastructure too, like your host and datastore. The idea was to create VMs as fast as possible on all my infrastructure to generate a random load.
########################################################################## ## Version : 1.0 ## ## Created by : Julien VARELA ## ## Release Date : 12/12/2016 ## ## Name : DeployVMLAb.ps1 ## ## ## ########################################################################## ##Verif des modules VMware $PSNAP= Get-PSSnapin VMware.VimAutomation.Core -erroraction ‘silentlycontinue’ if ($? -eq $false) { ##Load VMware Modules Write-Host " Loading VMware modules " asnp vmware.* } Else { Write-host " VMware modules are already loaded " } $vCenter = Read-Host "vCenter FQDN" $login = $host.ui.PromptForCredential("User/Password", "please type your log in and password ", " ", " NetBiosUserName ") $VMs=read-host "Number of VMs to deploy" connect-viserver -server $vcenter -credential $login $i=1 # Initialize variable to 1. [string]$NamingConvention = "LABTEST-VM-" # Naming convention for your VMs [string]$folderLoc = "Discovered virtual machine" # Name of the folder where the VMs will be deployed $SourceVM = "W2K12R2_Template" #Template Name $OsConfiguration =Get-OSCustomizationSpec -name "W2K12R2_CUSTOM" #Name of the customization spec while ($i -le $VMs) { $NumCPUs = (Get-Random -Minimum 1 -Maximum 6) #vCPU configuration (Between 1 and 6) $MemoryGB = ("4","6","8","10","12") | Get-Random #Memory configuration (Bewteen 4 and 12 GB) $targetDatastore = Get-Datastore | Where {($_.ExtensionData.Summary.MultipleHostAccess -eq "True") -and ($_.FreeSpaceMB -gt "50000")} | Get-Random $targetVMhost = Get-VMHost | Where { $_.ConnectionState -eq "Connected" } | Get-Random # Select a connected host $VMName = $NamingConvention + $i if ((Get-VM $VMName -ErrorAction SilentlyContinue).Name -eq $VMName) { #Check if VM already existe Write-Host "$VMName already exist, task will be skipped" -ForegroundColor Yellow } else { Write-Host "Deployment of the VM $VMName in the folder $folderLoc ..." -ForegroundColor Green #Create our VM $task = New-VM -name $VMName -Template $SourceVM -OSCustomizationSpec $OsConfiguration -Datastore $targetDatastore -VMHost $targetVMhost -RunAsync #VM creation based on the template while($task.ExtensionData.Info.State -eq "running"){ sleep 2 $task.ExtensionData.UpdateViewData('Info.State') } $task = Set-VM $VMName -NumCpu $NumCPUs -MemoryGB $MemoryGB -Confirm:$false -RunAsync #VM configuration while($task.ExtensionData.Info.State -eq "running"){ sleep 2 $task.ExtensionData.UpdateViewData('Info.State') } sleep 3 $task =Start-VM -VM $VMName -Confirm:$false # Start of the VM while($task.ExtensionData.Info.State -eq "running"){ sleep 2 $task.ExtensionData.UpdateViewData('Info.State') } } $i++ }
Once the script has been executed, you can see the current task in your vCenter task tab.
Et Voila, you will have VMs with different memory/cpu configurations.
You can find the script here : DeployVMLAb.ps1
Enjoy !