Just released the complete powershell script to control vRanger backup from vCenter.
Read about the script and it’s features here.
Download it here.
If you ever have experienced that after your vCenter server reboots – due to Windows updates, the “VMware VirtualCenter Server” service is not starting?
I have seen it a few times and every time it’s during a weekend 🙁
So to make sure your vCenter service (or other) is always running you could use this powershell script to check if a service is running, and if not start it.
To make sure you know if the service wasn’t started after a reboot or other cause, I have added a mail function to the script 🙂
function FuncCheckService{ param($ServiceName) $arrService = Get-Service -Name $ServiceName if ($arrService.Status -ne "Running"){ Start-Service $ServiceName FuncMail -To "to-email@domain.com" -From "from-mail@domain.com" -Subject "Servername : ($ServiceName) service started." -Body "Service $ServiceName started" -smtpServer "relay.mailserver.com" } } function FuncMail { #param($strTo, $strFrom, $strSubject, $strBody, $smtpServer) param($To, $From, $Subject, $Body, $smtpServer) $msg = new-object Net.Mail.MailMessage $smtp = new-object Net.Mail.SmtpClient($smtpServer) $msg.From = $From $msg.To.Add($To) $msg.Subject = $Subject $msg.IsBodyHtml = 1 $msg.Body = $Body $smtp.Send($msg) } FuncCheckService -ServiceName "VMware VirtualCenter Server"
Create a PS1 file and schedule it to run every 15 or 30 minutes.
It works great and is simple….
If you want to configure a hosts NTP server list through PowerCLI you have a few cmdlet at your disposal.
Get a list of NTP servers on a host.
Get-VMHostNtpServer -VMHost "esx01.lab.local"
To remove a specific NTP server from a host NTP server list.
Remove-VMHostNtpServer -VMHost "esx01.lab.local" -NtpServer '127.127.1.0' -Confirm:$false
To remove all NTP servers on a hosts NTP server list.
$arrNTPList = Get-VMHostNtpServer -VMHost "esx01.lab.local" Remove-VMHostNtpServer -VMHost "esx01.lab.local" -NtpServer $arrNTPList -Confirm:$false
To add a single NTP server to a hosts NTP server list.
Add-VMHostNtpServer -VMHost "esx01.lab.local" -NtpServer "dk.pool.ntp.org" -Confirm:$false
To add a a list of NTP servers to a hosts NTP server list.
$arrNTPServers = ("dk.pool.ntp.org","de.pool.ntp.org","us.pool.ntp.org") Add-VMHostNtpServer -VMHost "esx01.lab.local" -NtpServer $arrNTPServers -Confirm:$false
To set the NTP deamon (service) to start automatic.
Set-VMHostService -HostService (Get-VMHostservice -VMHost (Get-VMHost "esx01.lab.local") | Where-Object {$_.key -eq "ntpd"}) -Policy "Automatic"
Open firewall to allow the NTP deamon to communicate with the NTP server.
Get-VmhostFirewallException -VMHost "esx01.lab.local" -Name "NTP Client" | Set-VMHostFirewallException -enabled:$true
To restart the NTP deamon (service) after you have configured it – without restarting the host.
$ntpd = Get-VMHostService -VMHost "esx01.lab.local" | where {$_.Key -eq 'ntpd'} Restart-VMHostService $ntpd -Confirm:$false
Since Vizioncore came out with vRanger 4.x, last year, I been working on porting the VBS script “vRanger Script version 2.0” to Powershell.
During this time I have found several bugs/missing functionality in the vAPI.
Vizioncore have corrected the bugs with new releases of vRanger.
The first vRanger version where all vAPI cmdlets worked in was version 4.2.3.
Porting the script from VBS presented me with a few challenges.
A few words on the scrips functionality.
When I started coding the script, I found, that if I used functions for all functionality the script was easier to read. Using functions also supplied me with the opportunity of reusing functions – less work :-).
Some of the functions was created using examples posted and mailed by Scott Harold from Quest and TheVesi./vEcoShell.
Prerequirements
The script can be downloaded here.
A quick overview of the functions.
Include the right PSSnapins
function LoadSnapin{ Add-PSSnapin vRanger.API.PowerShell -ErrorAction SilentlyContinue Add-PSSnapin vmware.VimAutomation.core -ErrorAction SilentlyContinue } LoadSnapin
Delete all previous savepoints – from the repository.
function RemoveAllSavePoints{ param ($RASP_RepoName) $RASP_repoID = Get-Repository | where {$_.Name -eq $RASP_RepoName} $RASP_SPlist = Get-RepositorySavePoint -ID $RASP_repoID.Id foreach ($RASP_SP in $RASP_SPlist){ #write $RASP_SP Remove-SavePoint -SavePointsToRemove $RASP_SP } } RemoveAllSavePoints "Remote-Location"
Is a backup job exist with the same name as the one to create – delete it.
function Del-vRangerBackupJobs { param ($delJobName) $delTemplateID = Get-JobTemplate | where {$_.JobName -eq $delJobName} # Verify that a BackupJob named XXX is present before deleting it. if ($delTemplateID){ #write $delTemplateID.JobName Remove-JobTemplate -id $delTemplateID.Id } } Del-vRangerBackupJobs "$Wednesday-Even"
Create the list of VMs to exclude.
function Filter-VMbyCF { param ($customF, $val) foreach ($vm in $vmlist) { $vm.CustomFields | ForEach-Object { $cf = $_ if ($_.Key -like $customF -and $_.Value -like $val){ return $vm.name } } } } function New-vRangerExcludeList { param ($exclude, $include) $excludeArray = @() $exclude | ForEach-Object { if ($include -notcontains $_.Name){ $excludeArray += ($_.Config.Uuid) } } return $excludeArray } $vmlist = Get-VM $tmplist = Get-Template $vmlist= $vmlist + $tmplist $vmFilter = Filter-VMbyCF $customField $CFValue $vmlistview = $vmlist | Get-View $excludeList = New-vRangerExcludeList -exclude $vmlistview -include $vmFilter
Create the new backup job.
function New-vRangerBackupJob { param ($customJobName, $customCFValue, $customFieldName, $customRepoName, $customExcludeList, $customEmail) $jobDesc = "This backup job is created by Logica for use in DR. All VMs with a Custom Field labeled: $customFieldName with a value of: $customCFValue will be backed up" $jobEntity = Get-InventoryEntity -Type VirtualCenter $jobRepos = Get-Repository | where {$_.Name -eq $customRepoName} $jobFlag = New-BackupFlag -CheckDestinationFreeSpace:$true -UseCompression:$true -PerformNetworkBackupOnFailure:$true # Check if all disks or just disk 0 if ($customJobName -like "*-All*"){ #write "All - Disks" #Add-BackupJobTemplate -JobName $customJobName -JobDescription $jobDesc -JobEntity $jobEntity -ExcludedVMList $customExcludeList -NotificationList $email -TargetRepository $jobRepos -Flags $jobFlag -NumberOfSavePoints 1 -SpaceSavingTechnologyTypeFlag None Add-BackupJobTemplate -JobName $customJobName -JobDescription $jobDesc -JobEntity $jobEntity -ExcludedVMList $customExcludeList -NotificationList $customEmail -TargetRepository $jobRepos -Flags $jobFlag -NumberOfSavePoints 1 -SpaceSavingTechnologyTypeFlag None -SpaceSavingCountThreshold 6 -SpaceSavingPercentSizeThreshold 50 } else{ #write "Only Disk 0" #Add-BackupJobTemplate -JobName $customJobName -JobDescription $jobDesc -JobEntity $jobEntity -ExcludedVMList $customExcludeList -NotificationList $email -IncludedDiskList 0 -TargetRepository $jobRepos -Flags $jobFlag -NumberOfSavePoints 1 -SpaceSavingTechnologyTypeFlag None Add-BackupJobTemplate -JobName $customJobName -JobDescription $jobDesc -JobEntity $jobEntity -ExcludedVMList $customExcludeList -NotificationList $customEmail -IncludedDiskList 0 -TargetRepository $jobRepos -Flags $jobFlag -NumberOfSavePoints 1 -SpaceSavingTechnologyTypeFlag None -SpaceSavingCountThreshold 6 -SpaceSavingPercentSizeThreshold 50 } } New-vRangerBackupJob "Wednesday-Even" "Wednesday-Even" "Backup" "Remote-Location" $excludeList "to@email.com"
Start the backup job.
function Run-BackupJob{ param ($runJobName) $runTemplateID = Get-TemplateID $runJobName Run-JobsNow $runTemplateID } Run-BackupJob "Wednesday-Even"
Wait for the backup job to finish.
function Get-TemplateID{ param($tmpJobName) $arrTemplate = get-jobtemplate | where {$_.JobName -eq $tmpJobName} return $arrTemplate.ID } function WaitForJobToFinish{ param ($strWaitJob) $strCompleted = "NotStarted" Start-Sleep -Seconds 300 # 5 minutes $jobTemplates = get-JobTemplate | where {$_.JobName -eq $strWaitJob} foreach ($job in $jobTemplates){ do{ $tasksinfo = get-job |where {$_.ParentJobTemplateID -eq $job.TemplateVersionID} foreach ($task in $tasksinfo){ Start-Sleep -Seconds 300 # 5 minutes $strCompleted = $task.JobState # Make sure job is running - if not start it... if ($task.JobState -eq $NULL -or $task.JobState -eq "NotStarted"){ Run-BackupJob $strWaitJob Start-Sleep -Seconds 120 # 2 minutes } } } while ($strCompleted -notmatch "Completed") } } WaitForJobToFinish "Wednesday-Even"
Send TSM finished mail.
function FuncMail { #param($strTo, $strFrom, $strSubject, $strBody, $smtpServer) param($To, $From, $Subject, $Body, $smtpServer) $msg = new-object Net.Mail.MailMessage $smtp = new-object Net.Mail.SmtpClient($smtpServer) $msg.From = $From $msg.To.Add($To) $msg.Subject = $Subject $msg.IsBodyHtml = 1 $msg.Body = $Body $smtp.Send($msg) } FuncMail -To "to@email.com" -From "from@email.com" -Subject "vRanger Pro: TSM backup finished" -Body "Your Body" -smtpServer "your.mailserver.com"
Powered by WordPress