# powershell script for VM mass management. Requires a .csv file containing the list of VMs and a name for the snapshot/ If no snapshot name is given, "Snapshot_1" is used.
#load powercli if needed
if (!(Get-Module -Name VMware.VimAutomation.Core) -and (Get-Module -ListAvailable -Name VMware.VimAutomation.Core)) {
Write-Output "loading the VMware Core Module..."
if (!(Import-Module -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue)) {
# Error out if loading fails
Write-Error "`nERROR: Cannot load the VMware Module. Is the PowerCLI installed?"
}
$Loaded = $True
}
# elseif (!(Get-Module -Name VMware.VimAutomation.Core -ErrorAction SilentlyContinue) -and !(Get-Module -Name VMware.VimAutomation.Core) -and ($Loaded -ne $True)) {
# Write-Output "loading the VMware Core Snapin..."
# if (!(Add-PSSnapin -PassThru VMware.VimAutomation.Core -ErrorAction SilentlyContinue)) {
# # Error out if loading fails
# Write-Error "`nERROR: Cannot load the VMware Snapin or Module. Is the PowerCLI installed?"
# }
# }
# Define vmConfigSpec params
$vmConfigSpec = New-Object VMware.Vim.VirtualMachineConfigSpec
$vmConfigSpec.Tools = New-Object VMware.Vim.ToolsConfigInfo
$vmConfigSpec.Tools.ToolsUpgradePolicy = "UpgradeAtPowerCycle"
# Get the command-line params
$command = $args[0]
$list = $args[1]
$server = $args[2]
# define default params
if (!$list) { $list = "vm_mgmt.csv"}
if (!$server) { $server = "default.vCenter.domain.tld"}
# Start processing the command
switch ($command) {
default { $myname = $MyInvocation.MyCommand.Definition
echo "`nERROR! Usage:"
echo "$myname command [list] [server] "
echo "`ncommand is one of the following: viewsnap, takesnap, delsnap, revertsnap, hwupd, vmtoolsupd, vmoff, vmon."
echo " list is a .csv file containing 'VM_Name,Snapshot_name'. If no list provided, 'vm_mgmt.csv' will be used."
echo " server is the name of the server connecting to. If no server is provided, 'default.vCenter.domain.tld' will be used.`n"
}
"viewsnap" {
### View Snapshot
Connect-VIServer -Server $server -Protocol https
import-csv $list | ForEach-Object {
$_.VM_Name
$_.Snapshot_name
if (!$_.Snapshot_name) { $_.Snapshot_name = "Snaphot_1"}
echo "`nView Snaphots:`n"
get-vm -Name $_.VM_Name | get-snapshot
} }
"takesnap" {
### Take Snapshot
Connect-VIServer -Server $server -Protocol https
import-csv $list | ForEach-Object {
$_.VM_Name
$_.Snapshot_name
if (!$_.Snapshot_name) { $_.Snapshot_name = "Snaphot_1"}
echo "`nTaking Snapshots`n"
get-vm -Name $_.VM_Name | New-Snapshot -Name $_.Snapshot_1 -Quiesce -Memory
} }
"delsnap" {
### Delete Snapshot
Connect-VIServer -Server $server -Protocol https
import-csv $list | ForEach-Object {
$_.VM_Name
$_.Snapshot_name
if (!$_.Snapshot_name) { $_.Snapshot_name = "Snaphot_1"}
echo "`nDelete Snapshots`n"
get-snapshot -name $_.Snapshot_1 -vm $_.VM_Name | remove-snapshot -confirm:$false
} }
"revertsnap" {
### Revert To Snapshot
Connect-VIServer -Server $server -Protocol https
import-csv $list | ForEach-Object {
$_.VM_Name
$_.Snapshot_name
echo "`nReverting Snapshots. Confirmation is required for each restore.`n"
set-vm -VM $_.VM_Name -Snapshot $_.Snapshot_1 -whatif
# set-vm -VM $_.VM_Name -Snapshot $_.Snapshot_1 -confirm:$false
} }
"hwupd" {
# VM Hardware upgrade
Connect-VIServer -Server $server -Protocol https
import-csv $list | ForEach-Object {
$_.VM_Name
$_.Snapshot_name
if (!$_.Snapshot_name) { $_.Snapshot_name = "Snaphot_1"}
echo "`nVM Hardware upgrade to vmx-13`n"
$do = New-Object -TypeName VMware.Vim.VirtualMachineConfigSpec
$do.ScheduledHardwareUpgradeInfo = New-Object -TypeName VMware.Vim.ScheduledHardwareUpgradeInfo
$do.ScheduledHardwareUpgradeInfo.UpgradePolicy = “always”
$do.ScheduledHardwareUpgradeInfo.VersionKey = “vmx-13”
$vm.ExtensionData.ReconfigVM_Task($do)
} }
"vmtoolsupd" {
# VM Tools update
Connect-VIServer -Server $server -Protocol https
import-csv $list | ForEach-Object {
$_.VM_Name
$_.Snapshot_name
if (!$_.Snapshot_name) { $_.Snapshot_name = "Snaphot_1"}
echo "`nUpdating VM Tools`n"
get-vm -Name $_.VM_Name | %{$_.Extensiondata.ReconfigVM($vmConfigSpec)}
} }
"vmoff" {
# VM power off
Connect-VIServer -Server $server -Protocol https
import-csv $list | ForEach-Object {
$_.VM_Name
$_.Snapshot_name
if (!$_.Snapshot_name) { $_.Snapshot_name = "Snaphot_1"}
echo "`nTurning VMs OFF`n"
$vm = Get-VM -Name $_.VM_Name | Shutdown-VMGuest -Confirm:$false
} }
"vmon" {
# VM power on
Connect-VIServer -Server $server -Protocol https
import-csv $list | ForEach-Object {
$_.VM_Name
$_.Snapshot_name
if (!$_.Snapshot_name) { $_.Snapshot_name = "Snaphot_1"}
echo "`nTurning VMs ON`n"
$vm = Get-VM -Name $_.VM_Name | Start-VM -Confirm:$false
} }
}
-----------------------------------------------
type vm_mgmt.csv
VM_NAME,Snapshot_name
some-vm-name,Snapshot_342
another-vm-name,Snapshot_temp4
In the void is virtue, and no evil. Wisdom has existance, principle has existance, the Way has existance, spirit is nothingness.