VMware vSphere PowerCLI is a command-line interface (CLI) tool for automating vSphere and vCloud management. PowerCLI commands are executed in Windows PowerShell through using PowerShell cmdlets and the PowerShell syntax. You can use and integrate PowerCLI cmdlets with all other PowerShell cmdlets. This makes PowerCLI a very powerful tool for all your vSphere and vCloud automation needs.
In this blog I’ll show you how to deploy and configure a Windows VM through using a PowerShell/PowerCLI script. You can customize this script to suit your needs. What will this script do?
Installation of PowerCLI
Version 6.5 and higher of PowerCLI can be installed and configured in PowerShell 5.0 and higher using the following commands:
Find-Module VMware.PowerCli | install-module
Set-PowerCLIConfiguration -Scope User -ParticipateInCEIP $false (or $true if you want to participate in the Customer Experience Improvement Program)
Set-PowerCLIConfiguration -InvalidCertificateAction ignore -confirm:$false
Use of the PowerCLI Script
Configure the script for your own needs. The next sections explains the configuration process. After you configured the script, you can start the script in Powershell in order to install a Windows VM that is customized to your requirements.
Configuration of the PowerCLI Script
To define all credentials, create a textfile credentials.txt in the same folder as the PowerCLI script. The content of this textfile is as follows:
DomainAdmin = "<domain admin username>"
DomainAdminPassword = "<password domain admin user>"
LocalUser = "<local admin username>"
LocalPassword = "<password local admin user>"
vCenterUser = "firstname.lastname@example.org"
vCenterPass = "<password vCenter admin>"
User Defined Variables
In the section User Defined Variables you can configure the following parameters:
|$Domain||Domainname to join, e.g. “test.local”|
|$vCenterInstance||vCenter hostname or IP address to deploy VM, e.g. “vcenter.domain.local”|
|$Cluster||vCenter cluster to deploy VM, e.g. “cluster1”|
|$VMTemplate||vCenter VM template to deploy, e.g. “Windows2016”|
|$CustomSpec||Customization Specification to use, e.g. “Windows2016”|
|$Location||Folder in vCenter to deploy VM, e.g. “folder1”|
|$DataStore||Name of datastore to deploy VM, e.g. “NFS01”|
|$DiskStorageFormat||“thin” or “thick”|
|$NetworkName||Name of Portgroup to use, e.g. “LAN”|
|$Memory||Amount of memory for VM in GB, e.g. 4|
|$CPU||Number of vCPUs for VM, e.g. 2|
|$DiskCapacity||Disksize of VM in GB, e.g. 40|
|$SubnetLength||Subnetlength IP address to use (24 means /24 or 255.255.255.0) for VM, e.g. 24|
|$GW||Gateway to use for VM, e.g. “192.168.0.1”|
|$IP_DNS||IP address DNS server to use, e.g. “192.168.0.10”|
In the section Define Powershell scripts to run in VM after deployment, you can define all Powershell scripts you would like to run once the VM has been deployed. You can add a Powershell script with the function Add-Script. The syntax of this function is:
Add-Script '<powershell script %1, … %n>' @(variable 1, …, variable n) $true
If you want to insert the value of one or more variables (for instance, the variable with the value of the domain admin user) to the Powershell script that will be executed in the VM, you can use variable replacements. To use a parameter replacement, add %1, %2, …, %n in the Powershell script and add every variable after the Powershell script in the format @(variable 1, … variable n). For example:
Add-Script "New-NetIPAddress -InterfaceIndex 2 -IPAddress %1 -PrefixLength %2 -DefaultGateway %3" @($IP, $SubnetLength, $GW)
If it is necessary to reboot the VM after the Powershell script has been executed, add $true after the Add-Script function. If you don’t need variable replacements or a reboot, you can use the Add-Script function to solely define the powershell script. For example:
Add-Script 'Import-Module NetSecurity; Set-NetFirewallRule -DisplayGroup "File and Printer Sharing" -enabled True'
You can use as many add-script functions as you want.
The PowerCLI Script