Automating VMware Template Updates

This script, which can be run from Orchestrator or as a scheduled task, automates the process of updating VMware templates. It may require some modifications to fit your specific environment.

To use this script, you need to install the PSWindowsUpdate module on the VM Template. You can install the module by running the following command:

 Install-Module PSWindowsUpdate

Powershell Script :

#Settings 
$vcenterServer = ""
$TemplateVMName = ""
$adminname = ""
$PasswordParameter = ''
$Pwd = ConvertTo-SecureString -String $PasswordParameter -AsPlainText -Force
$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $adminname, $Pwd
$mailFrom = ""
$mailTo = ""
$smtpServer = ""

#Code 

#Import the PowerCLI module
Import-Module VMware.VimAutomation.Core -ErrorAction SilentlyContinue

#Connect to vCenter
try {
connect-viserver $vcenterServer -ErrorAction Stop
} catch {
Write-Error "Failed to connect to vCenter server $vcenterServer. Error: $_"
exit
}

#Convert a template to a VM
try {

Set-Template -Template $TemplateVMName -ToVM -Confirm:$false -RunAsync

Write-Host "Template $TemplateVMName converted to VM"
} catch {
Write-Error "Failed to convert template $TemplateVMName to VM. Error: $_"
exit
}

#Make a 10 seconds delay
Start-sleep -s 10

#Start the virtual machine
try {

Start-VM -VM $TemplateVMName | Get-VMQuestion | Set-VMQuestion -DefaultOption -Confirm:$false

Write-Host "VM $TemplateVMName  started"
} catch {
Write-Error "Failed to start VM $TemplateVMName . Error: $_"
exit
}

#Make a 2 minutes delay
Start-sleep -s 120

#Update VMTools version
try {
$Resultvmwaretools = Update-Tools -VM $TemplateVMName -NoReboot -ErrorAction Stop
}
catch {
Write-Error "Error updating VMTools: $" 

Send-MailMessage -From $mailFrom -To $mailTo -Subject "Error updating VM Template: ${TemplateVMName}" -Body "An error occurred while updating VMTools for the VM ${TemplateVMName}: $" -SmtpServer $smtpServer
exit
}

#Check VmTools Current version 


$vm = Get-VM -Name $TemplateVMName
$vmversion = $vm.ExtensionData.Guest.ToolsVersion
$vmstatus = $vm.ExtensionData.Guest.ToolsStatus
$vmsversionstatus = $vm.ExtensionData.Guest.ToolsVersionStatus



Write-Host "The current VMware Tools status on VM $TemplateVMName is $vmwareToolsversion"




#Restart Windows Update Service
try {
Invoke-VMScript -ScriptType PowerShell -ScriptText "Restart-Service wuauserv -PassThru" -VM $TemplateVMName  -GuestCredential $Cred
Write-Host "Windows Update Service restarted on VM $TemplateVMName "
} catch {
Write-Error "Failed to restart Windows Update Service on VM $TemplateVMName . Error: $_"
}


#Make a 2 minutes delay
Start-sleep -s 120



#Require this module Installed on the VM Template : Install-Module PSWindowsUpdate
try {

$resultwindowsupdates = Invoke-VMScript -ScriptType PowerShell -ScriptText "Get-WindowsUpdate -AcceptAll -Install -AutoReboot" -VM $TemplateVMName -GuestCredential $Cred 

Write-Host "Windows updates installed on VM $TemplateVMName "
} catch {
Write-Error "Failed to install Windows updates on VM $TemplateVMName . Error: $_" 
}




#Wait 30 minutes until the server is back online and able to respond 
Start-sleep -s 1800


#Shut the VM down and convert it back to the template
try {
Shutdown-VMGuest -VM $TemplateVMName  -Confirm:$false -ErrorAction Stop
Start-sleep -s 10
Set-VM -VM $TemplateVMName  -ToTemplate -Confirm:$false -ErrorAction Stop

#Completion Message

$BodyResult= @"
The VM Template $TemplateVMName has been updated. Please check the status below.
 

 Windows Updates Status: 
 ${resultwindowsupdates}

 VmwareTools Status :

 Tools Version : $vmversion
 Tools Version Status : $vmstatus
 Tools Version Status 2 : $vmsversionstatus
"@

Send-MailMessage -From $mailFrom -To $mailTo -Subject "VM Template: ${TemplateVMName}" -Body $BodyResult -SmtpServer $smtpServer

} catch {
Write-Error "Error shutting down and converting VM to template: $"
Send-MailMessage -From $mailFrom -To $mailTo -Subject "Error updating VM Template: ${TemplateVMName}" -Body "An error occurred while shutting down and converting the VM to a template for the VM Template ${TemplateVMName}: $" -SmtpServer $smtpServer
exit
}

Related Posts