Monthly Archives: July, 2011

How to generate hundred Windows clients


Task: create one hundred Windows workstations.

Requirements: 1. create a testing lab consisting of several tens, preferable no less than one hundred of Windows client computers.

2. select a virtualization provider with the topmost performance and at no cost.

3. desirably that there be a possibility to expand the lab on demand.

Note to item 2: There were only two providers to choose, VMware with its ESXi and Parallels. Instead of serious investigation into their declared and real performance, ESXi has been chosen as already being the platform used in the office most and for available PowerCLI cmdlets.

Solution: a PowerShell module that emulates certain PowerCLI cmdlets. Direct use of VMware PowerCLI cmdlets are not possible unless you’ve bought something like vSphere or vCenter.

Details: the following examples demonstrate how to generate test machines and perform mass operation with them. The ESXiMgmt module outlined in greater detail in the following post.

The first script is the only in series that needed for lab creation:


#######################################################################################################################
# File:             ESXiMgmt_machines_generation_sample.ps1                                                           #
# Author:           Alexander Petrovskiy                                                                              #
# Publisher:        Alexander Petrovskiy, SoftwareTestingUsingPowerShell.WordPress.Com                                #
# Copyright:        © 2011 Alexander Petrovskiy, SoftwareTestingUsingPowerShell.WordPress.Com. All rights reserved.   #
# Prerequisites:    The module was tested with Vmware ESXi 4.1 U1 on the server side and                              #
#                       Vmware PowerCLI 4.1 U1                                                                        #
#                       plink.exe 0.60.0.0                                                                            #
# Usage:            To load this module run the following instruction:                                                #
#                       Import-Module -Name ESXiMgmt -Force                                                           #
#                   Please provide feedback in the SoftwareTestingUsingPowerShell.WordPress.Com blog.                 #
#######################################################################################################################
param([string]$Server,
	  [string]$User,
	  [string]$Password,
	  [string]$DatastoreName,
	  [string]$Drive,
	  [int]$MachinesNumber,
	  [string]$MachinePrefix,
	  [int]$OperationTimeout
	  )
# USAGE: .\ESXiMgmt_machines_generation_sample.ps1 192.168.1.1 root 123 datastore3 host1ds3 100 XPSP2_ 300

cls
Set-StrictMode -Version Latest
Import-Module ESXiMgmt -Force;

Connect-ESXi -Server $Server -Port 443 `
	-Protocol HTTPS -User $User -Password $Password `
	-DatastoreName $DatastoreName -Drive $Drive;

# This is to test can or can't plink.exe connect to your server
# The answer you need to select in case it questions you is obviously Yes.
Invoke-ESXiCommand -Server $Server `
	 -User $User -Password $Password `
	 -Command 'ls ~; sleep 10s; exit;' -PathToPlink 'C:\VMTests\plink.exe' `
	 -ShowWindow $true -OperationTimeout 10;

New-ESXiVMs -TemplateVMName 'template XP SP2 Sv 2' -Count $MachinesNumber `
		-Logname "C:\VMTests\xpsp2\100.txt" -NewVMName $MachinePrefix `
		-BasePath 'C:\VMTests\xpsp2' -OperationTimeout $OperationTimeout;

The following two scripts power the lab on and off, respectively:


#######################################################################################################################
# File:             ESXiMgmt_machines_poweron_sample.ps1                                                              #
# Author:           Alexander Petrovskiy                                                                              #
# Publisher:        Alexander Petrovskiy, SoftwareTestingUsingPowerShell.WordPress.Com                                #
# Copyright:        © 2011 Alexander Petrovskiy, SoftwareTestingUsingPowerShell.WordPress.Com. All rights reserved.   #
# Prerequisites:    The module was tested with Vmware ESXi 4.1 U1 on the server side and                              #
#                       Vmware PowerCLI 4.1 U1                                                                        #
#                       plink.exe 0.60.0.0                                                                            #
# Usage:            To load this module run the following instruction:                                                #
#                       Import-Module -Name ESXiMgmt -Force                                                           #
#                   Please provide feedback in the SoftwareTestingUsingPowerShell.WordPress.Com blog.                 #
#######################################################################################################################
param([string]$Server,
	  [string]$User,
	  [string]$Password,
	  [string]$DatastoreName,
	  [string]$Drive,
	  [string]$MachinePrefix,
	  [int]$OperationTimeout
	  )
# USAGE: .\ESXiMgmt_machines_poweron_sample.ps1 192.168.1.1 root 123 datastore3 host1ds3 XPSP2 300

cls
Set-StrictMode -Version Latest
Import-Module ESXiMgmt -Force;

Connect-ESXi -Server $Server -Port 443 `
	-Protocol HTTPS -User $User -Password $Password `
	-DatastoreName $DatastoreName -Drive $Drive;

$VerbosePreference = [System.Management.Automation.ActionPreference]::Continue;
$VMs = Get-VM *

[int]$grouper = 5;
foreach($vm in $VMs)
{
	if ($vm.Name -like "$($MachinePrefix)*" -and `
		$vm.PowerState -ne 1)
	# [VMware.VimAutomation.ViCore.Types.V1.Inventory.PowerState]::PoweredOff = 0
	# [VMware.VimAutomation.ViCore.Types.V1.Inventory.PowerState]::PoweredOn = 1
	# [VMware.VimAutomation.ViCore.Types.V1.Inventory.PowerState]::Suspended = 2
	{
		Write-Verbose "$($vm.Name) is starting";
		Start-ESXiVM -Server $Server `
			-User $User -Password $Password `
			-Id (Get-ESXiVMId $vm);
		$grouper--;
		if ($grouper -eq 0){
			Write-Verbose "Sleeping for $($OperationTimeout) seconds";
			sleep -Seconds $OperationTimeout;
			$grouper = 5;
		}
	}
}

Disconnect-ESXi

and

#######################################################################################################################
# File:             ESXiMgmt_machines_poweroff_sample.ps1                                                             #
# Author:           Alexander Petrovskiy                                                                              #
# Publisher:        Alexander Petrovskiy, SoftwareTestingUsingPowerShell.WordPress.Com                                #
# Copyright:        © 2011 Alexander Petrovskiy, SoftwareTestingUsingPowerShell.WordPress.Com. All rights reserved.   #
# Prerequisites:    The module was tested with Vmware ESXi 4.1 U1 on the server side and                              #
#                       Vmware PowerCLI 4.1 U1                                                                        #
#                       plink.exe 0.60.0.0                                                                            #
# Usage:            To load this module run the following instruction:                                                #
#                       Import-Module -Name ESXiMgmt -Force                                                           #
#                   Please provide feedback in the SoftwareTestingUsingPowerShell.WordPress.Com blog.                 #
#######################################################################################################################
param([string]$Server,
	  [string]$User,
	  [string]$Password,
	  [string]$DatastoreName,
	  [string]$MachinePrefix,
	  [int]$OperationTimeout
	  )
# USAGE: .\ESXiMgmt_machines_poweroff_sample.ps1 192.168.1.1 root 123 datastore3 XPSP2 10
cls
Set-StrictMode -Version Latest
Import-Module ESXiMgmt -Force;

Connect-ESXi -Server $Server -Port 443 `
	-Protocol HTTPS -User $User -Password $Password `
	-DatastoreName $DatastoreName;

$VerbosePreference = [System.Management.Automation.ActionPreference]::Continue;
$VMs = Get-VM *

foreach($vm in $VMs)
{
	if ($vm.Name -like "$($MachinePrefix)*" -and `
		$vm.PowerState -eq 1) #PoweredOn
	{
		Write-Verbose "$($vm.Name) is stopping";
		Stop-ESXiVM -Server $Server `
			-User $User -Password $Password `
			-Id (Get-ESXiVMId $vm);
		sleep -Seconds $OperationTimeout;
	}
}

Disconnect-ESXi

# to restart virtual machines instead of shutdown them
# simply call the ESXiMgmt_machines_poweron_sample.ps1 script:
# USAGE: .\ESXiMgmt_machines_poweron_sample.ps1 192.168.1.1 root 123 datastore3 host1ds3 XPSP2 300

The final example demonstrates how to find out names of virtual machines knowing their host names:


#######################################################################################################################
# File:             ESXiMgmt_search_for_guest_hostname_sample.ps1                                                     #
# Author:           Alexander Petrovskiy                                                                              #
# Publisher:        Alexander Petrovskiy, SoftwareTestingUsingPowerShell.WordPress.Com                                #
# Copyright:        © 2011 Alexander Petrovskiy, SoftwareTestingUsingPowerShell.WordPress.Com. All rights reserved.   #
# Prerequisites:    The module was tested with Vmware ESXi 4.1 U1 on the server side and                              #
#                       Vmware PowerCLI 4.1 U1                                                                        #
#                       plink.exe 0.60.0.0                                                                            #
# Usage:            To load this module run the following instruction:                                                #
#                       Import-Module -Name ESXiMgmt -Force                                                           #
#                   Please provide feedback in the SoftwareTestingUsingPowerShell.WordPress.Com blog.                 #
#######################################################################################################################
param([string]$Server,
	  [string]$User,
	  [string]$Password,
	  [string]$DatastoreName,
	  [string]$Drive
	  )
# USAGE: .\ESXiMgmt_search_for_guest_hostname_sample.ps1 192.168.1.1 root 123 datastore3 host1ds3

cls
Set-StrictMode -Version Latest
Import-Module ESXiMgmt -Force;

Connect-ESXi -Server $Server -Port 443 `
	-Protocol HTTPS -User $User -Password $Password `
	-DatastoreName $DatastoreName -Drive $Drive;

$vmname = Get-ESXiVMName -VMHostname 'B45E19A64B5E418'
Write-Host "Guest host $($vmname) corresponds to $($vmname)";

$hostnames = @(
			'1-0028687D9BSP3',
			'1-07B328CA254D4',
			'1-081D88F5DF2D4',
			'1-10BF79C694094',
			'1-15DB4C70F57B4',
			'1-1B154BAE5CD84',
			'1-1D33859002954',
			'1-3502988189C24',
			'1-3A324DA9EBE54',
			'1-9160383452304',
			'1-96B95B980BDE4',
			'1-B3F725FTYE56',
			'1-E49B84B0A4AA4',
			'1-FECEC772CBB74'
			);

$vmnamesFromHostnames = Get-ESXiVMName -VMHostname $hostnames;

for ($private:i = 0; $private:i -lt $vmnamesFromHostnames.Length; $private:i++)
{
	Write-Host "Guest host $($hostnames[$private:i]) corresponds to $($vmnamesFromHostnames[$private:i])";
}

Surprisingly, PowerGUI VMware PowerPack is useful here because the Get-VM cmdlet still works with independent ESXi hosts.

ESXi Management module


Many would interest for what reason one more VMware management module has been written. In the last years the VMware team did the great work and now thousands of administrators can do almost everything, having learnt the cmdlets intuitively or by reading one of the great books on the topic.

Well, it’s the truth. Seemingly, absolutely all can be done using the standard PowerCLI cmdlets set. However, what would you do in worse circumstances? Those who work in small companies, or in mid-size companies that are not truly generous to its IT infrastructure, don’t have most of what the PowerCLI cmdlets offer. Why? The cmdlets evolve following the evolution of the flagship products. Many operations are now considered as infrastructure-level, thus they are gone on a host level. As a result of the evolution, owners of hardware running ESXi 4+ can’t automate the overwhelming majority of the lab-upbringing duties.

And here appears the ESXiMgmt module. What is it? This is a combination of a PowerShell module, the plink.exe utility and the underlying original PowerCLI cmdlets.

How does it work? As you may know, most of or even all the available operations with the host itself and the hosted virtual machines are being done via Linux utilities. Something like that there are the vimcmd utilities set somewhere in the ESXi file system, and a number of APIs for a number of programming languages and frameworks that simply leverage these utilities.

As a matter of fact, the ESXiMgmt module does the same. Cmdlets have names similar to those given to parental PowerCLI cmdlets. By calling them with parameters, you call the Invoke-ESXiCommand cmdlet. This forms parameters for plink.exe from the parameters the cmdlet given and runs plink.exe with parameters. Plink.exe in turn runs the given parameters that call the ESXi vimcmd utilities.

Disclaimer: the ESXiMgmt module contains exactly what I needed in the time I projected, built and run the lab (and built a new lab again with other parameters, and incremented the existing lab). There wasn’t the goal to copycat all the PowerCLI cmdlets offer.

At a time of its first public release (i.e., now) the ESXiMgmt module consists of the following advanced functions:

1) connection and disconnection

Connect-ESXi, Disconnect-ESXi

2) creation a folder in the file system and copying files to the file system from a local drive

New-ESXiFSDirectory, for the second goal the original Copy-DataStoreItem is used.

3) registration of a new virtual machine

Register-ESXiVM

4) start, stop and suspend of a virtual machine

Start-ESXiVM,Stop-ESXiVM, Suspend-ESXiVM

5) getting machine Id by its name and getting machine name by its hostname

Get-ESXiVMId, Get-ESXiVMName

6) execution of a custom command

Invoke-ESXiCommand

7) generation of dozens of virtual machines using one as a template

New-ESXiVMs

All of them will be described in greater detail in the upcoming posts. The 1.0.0.1 version of the ESXiMgmt module available here (already includes plink.exe) and posted here.

To start using the module all that you need to do is 1) download it 2) unpack in the module directory or in a directory of your choice 2.1) in the latter case type the path to unpacked module folder in the smaples 3) run samples. To generate new machines you need to wait a couple of days until I publish more information.


		
							
						
%d bloggers like this: