Another week, another idea comes up to check if I could make it happen with Powershell. I wanted to write a script that checks my current machine catalog and puts VMs that are not in a Nutanix Protection Domain in a PD to make sure that we can protect those VMs using the policies Nutanix offers.
The following tasks had to be automated using powershell:
- Check if a machine catalog is persistent
- Get all desktops in the machine catalog
- Check if there’s a Nutanix Protection Domain available with a certain prefix (read more here).
- Check if the VM isn’t already protected
- Check if the VM can be added there
- If so: Add the VM
- If not: create a Protection Domain and add the VM(s) there
I took the liberty of borrowing bits and pieces of Steven Poitras that is published on the Nutanix GitHub here:NTNX-Protect-VM.ps1 (Powershell script) and Sandeep has been helped me by answering my questions patiently.
Here’s the script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
<# .SYNOPSIS Will fetch all desktops from a machine catalogs and put them into protection domains .DESCRIPTION Will fetch all desktops from a machine catalogs and put them into protection domains but it will asume at least one PD with the prefix is there. .EXAMPLE PS C:\PSScript > .\XD_PD_v1.ps1 .INPUTS None. You cannot pipe objects to this script. .OUTPUTS No objects are output from this script. .NOTES NAME: XD_PD_v1.ps1 VERSION: 1.0 AUTHOR: Kees Baggerman with some help from Sandeep MP and Steven Potrias a LASTEDIT: August 2017 #> [CmdletBinding(SupportsShouldProcess = $False, ConfirmImpact = "None", DefaultParameterSetName = "") ] Param( # Nutanix cluster IP address [Parameter(Mandatory = $false)] [Alias('IP')] [string] $nxIP, # Nutanix cluster username [Parameter(Mandatory = $false)] [Alias('User')] [string] $nxUser, # Nutanix cluster password [Parameter(Mandatory = $true)] [Alias('Password')] [Security.SecureString] $nxPassword ) # Importing the proper cmldlets and snapins Import-Module "C:\Program Files (x86)\Nutanix Inc\NutanixCmdlets\Modules\NutanixCmdletsPSSnapin.dll" Add-PSSnapin Nutanix*, Citrix* # Defining script variables $DDC = "" $nxIP = "" $nxUser = "" $pdPrefix = "XenDesktop-PD" $vmPerPD = "" $MachineCatalog = "" # Connecting to the Nutanix Cluster IP Connect-NutanixCluster -Server $nxIP -UserName $nxUser -Password $nxPassword -AcceptInvalidSSLCerts # Checking if the Machine catalog is persistent $persistentMCs = Get-BrokerCatalog | where {$_.PersistUserChanges -eq "OnLocal"} if($persistentMCs.name -match $MachineCatalog) { # Collecting the Persistent Machine Catalog and putting them into a variable $VMs = get-brokermachine -adminaddress $ddc -CatalogName $machinecatalog foreach ($VM in $VMs) { $VMName = $VM.MachineName.Split("\")[1] # Get existing PDs matching prefix $pds = Get-NTNXProtectionDomain | where {$_.name -match $pdPrefix} # Get Un-protected VMs $unProtectedVM = Get-NTNXUnprotectedVM | where {$_.vmName -eq $VMName} # Stop the script when there's no unprotected VMs if ($unProtectedVM.count -gt 0) { Write-Host "Found $($unProtectedVM.count) unprotected vms..." } else { Write-Host "No unprotected VMs found, exiting..." break } # Getting the PDs count and determine next action if ($pds.Count -gt 0) { # Matching PDs exist Write-Host "Found $($pds.Count) matching existing PDs with space..." [int]$existingPDSpace = 0 # Find available space in existing PDs $pdsWithSpace = $pds | where {($_.vms).count -lt $vmPerPD} $pdsWithSpace | %{ # Find available space $l_pdSpace = $vmPerPD - ($_.vms).count # Add available space to counter $existingPDSpace += $l_pdSpace } # Find starting increment from existing $startingInt = (($pds.name).split("-") -match "^[0-9]+$" | measure -Maximum).maximum + 1 } else { Write-Host "Found $($pds.Count) matching existing PDs with space..." $startingInt = 0 } # Find needed space $newPDSpace = if ($existingPDSpace -lt $unProtectedVM.Count) {$unProtectedVM.Count - $existingPDSpace} # Find number of new PD required $numNewPD = [Math]::Round($newPDSpace/$vmPerPD) # Create $numNewPD Protection Domains $pdsWithSpace | %{ # Get avail space $l_availSpace = $vmPerPD - ($_.vms).count } # Find number of new PD required $numNewPD = [Math]::Round($newPDSpace/$vmPerPD) # Create $numNewPD Protection Domains Write-Host "Creating $numNewPD new PDs..." if ($numNewPD -gt 0) { for($i = 0;$i -lt $numNewPD;$i++) { # $l_pdName = $pdPrefix+"-"+$i $l_pdName = "$pdPrefix-$i" # Create PD Write-Host "Creating PD: $l_pdName" $l_PD = Add-NTNXProtectionDomain -value $l_pdName # Add cron schedule to PD $pdsWithSpace += $l_PD } } $pdsWithSpace | %{ # Get avail space $l_availSpace = $vmPerPD - ($_.vms).count } # Add VMs to PD (either existing or new) if ($Pds.name -notmatch $pdPrefix) { Write-Host "Adding $($l_vmObj.count) VMs to PD: $($_.name)" Add-NTNXProtectionDomainVM -Name $VMName -PdName $($_.name) } else { Write-Host "Adding VMs to PD: $($pds.name)" Add-NTNXProtectionDomainVM -Name $VMName -PdName $($pds.name) } break } } else { write-host "No persisent machine catalog defined"} |
The following two tabs change content below.
Kees Baggerman
Kees Baggerman is a Staff Solutions Architect for End User Computing at Nutanix. Kees has driven numerous Microsoft and Citrix, and RES infrastructures functional/technical designs, migrations, implementations engagements over the years.
Latest posts by Kees Baggerman (see all)
- Nutanix AHV and Citrix MCS: Adding a persistent disk via Powershell – v2 - November 19, 2019
- Recovering a Protection Domain snapshot to a VM - September 13, 2019
- Checking power settings on VMs using powershell - September 11, 2019
- Updated: VM Reporting Script for Nutanix with Powershell - July 3, 2019
- Updated (again!): VM Reporting Script for Nutanix AHV/vSphere with Powershell - June 17, 2019
[…] They were looking for a way to only keep one image updated and they are then looking to use our Protection Domain to replicate it over to the other cluster. Now, they are looking for some automated way to promote […]