Thanks to
Author: Tim Carman
Twitter: @tpcarman
Github: tpcarman
https://www.timcarman.net/2017/10/27/add-remove-virtual-machines-based-datastore-location-powercli/
Functions:
Add-DrsVMtoDrsVMGroup
Remove-DrsVMFromDrsVMGroup
- install Powershell
- Get PowerShell to work with ubuntu 19.10 Budgie
- Create Powershell Profile
- Run it!
sudo snap install powershell --classic export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 vi /home/USERNAME/config/powershell/Microsoft.PowerShell_profile.ps1
Paste the following in the file: $Hour = (Get-Date).Hour If ($Hour -lt 12) {"Morning Master"} ElseIf ($Hour -gt 17) {"Good Evening Master"} Else {"Have a nice day Roger"} #************************ Set-PowerCLIConfiguration -Scope User -ParticipateInCEIP $false #************************* function Add-DrsVMToDrsVMGroup{ #Requires -Modules VMware.VimAutomation.Core, DRSRule #region script help <# .SYNOPSIS Adds virtual machines to a DRS VM group based on datastore location .DESCRIPTION Adds virtual machines to a DRS VM group based on datastore location .NOTES Version: 1.0 Author: Tim Carman Twitter: @tpcarman Github: tpcarman .LINK https://github.com/tpcarman/PowerCLI-Scripts .PARAMETER DrsVMGroup Specifies the DRS VM Group This parameter is mandatory but does not have a default value. .PARAMETER Cluster Specifies the cluster which contains the DRS VM Group This parameter is mandatory but does not have a default value. .PARAMETER Prefix Specifies a prefix string for the datastore name This parameter is optional and does not have a default value. .PARAMETER Suffix Specifies a suffix string for the datastore name This parameter is optional and does not have a default value. .PARAMETER Datastore Specifies a datastore name This parameter is optional and does not have a default value. .EXAMPLE Add-DrsVMtoDrsVMGroup -DRSVMGroup 'SiteA-VMs' -Cluster 'Production' -Prefix 'SiteA-' .EXAMPLE Add-DrsVMtoDrsVMGroup -DRSVMGroup 'SiteA-VMs' -Cluster 'Production' -Suffix '-02' .EXAMPLE Add-DrsVMtoDrsVMGroup -DRSVMGroup 'SiteB-VMs' -Cluster 'Production' -Datastore 'VMFS-01' #> #endregion script help #region script parameters [CmdletBinding()] Param( [Parameter(Mandatory=$True,HelpMessage='Specify the name of the DRS VM Group')] [ValidateNotNullOrEmpty()] [String]$DrsVMGroup='', [Parameter(Mandatory=$True,HelpMessage='Specify the cluster name')] [ValidateNotNullOrEmpty()] [String]$Cluster='', [Parameter(Mandatory=$False,ParameterSetName=’Prefix’,HelpMessage='Specify the prefix string for the datastore name')] [ValidateNotNullOrEmpty()] [String]$Prefix='', [Parameter(Mandatory=$False,ParameterSetName=’Suffix’,HelpMessage='Specify the suffix string for the datastore name')] [ValidateNotNullOrEmpty()] [String]$Suffix='', [Parameter(Mandatory=$False,ParameterSetName=’Datastore’,HelpMessage='Specify the datastore name')] [ValidateNotNullOrEmpty()] [String]$Datastore='' ) #endregion script parameters #region script body if($Prefix){ $VMs = Get-Datastore | where{($_.name).StartsWith($Prefix)} | Get-VM } if($Datastore){ $VMs = Get-Datastore | where{($_.name) -eq $Datastore} | Get-VM } if($Suffix){ $VMs = Get-Datastore | where{($_.name).EndsWith($Suffix)} | Get-VM } $objDrsVMGroup = Get-DrsVMGroup -Name $DrsVMGroup -Cluster $Cluster foreach($VM in $VMs){ if(($objDrsVMGroup).VM -notcontains $VM){ Write-Host "Adding virtual machine $VM to DRS VM Group $DrsVMGroup" try{ Set-DrsVMGroup -Name $DrsVMGroup -Cluster $Cluster -Append -VM $VM } catch{ Write-Error "Error adding virtual machine $VM to DRS VM Group $DrsVMGroup" } } } #endregion script body } #************************** function Remove-DrsVMFromDrsVMGroup{ #Requires -Modules VMware.VimAutomation.Core, DRSRule #region script help <# .SYNOPSIS Removes virtual machines from a DRS VM group based on datastore location .DESCRIPTION Removes virtual machines from a DRS VM group based on datastore location .NOTES Version: 1.0 Author: Tim Carman Twitter: @tpcarman Github: tpcarman .LINK https://github.com/tpcarman/PowerCLI-Scripts .PARAMETER DrsVMGroup Specifies the DRS VM Group This parameter is mandatory but does not have a default value. .PARAMETER Cluster Specifies the cluster which contains the DRS VM Group This parameter is mandatory but does not have a default value. .PARAMETER Prefix Specifies a prefix string for the datastore name This parameter is optional and does not have a default value. .PARAMETER Suffix Specifies a suffix string for the datastore name This parameter is optional and does not have a default value. .PARAMETER Datastore Specifies a datastore name This parameter is optional and does not have a default value. .EXAMPLE Remove-DrsVMFromDrsVMGroup -DRSVMGroup 'SiteA-VMs' -Cluster 'Production' -Prefix 'SiteA-' .EXAMPLE Remove-DrsVMFromDrsVMGroup -DRSVMGroup 'SiteA-VMs' -Cluster 'Production' -Suffix '-02' .EXAMPLE Remove-DrsVMFromDrsVMGroup -DRSVMGroup 'SiteB-VMs' -Cluster 'Production' -Datastore 'VMFS-01' #> #endregion script help #region script parameters [CmdletBinding()] Param( [Parameter(Mandatory=$True,HelpMessage='Specify the name of the DRS VM Group')] [ValidateNotNullOrEmpty()] [String]$DrsVMGroup='', [Parameter(Mandatory=$True,HelpMessage='Specify the cluster name')] [ValidateNotNullOrEmpty()] [String]$Cluster='', [Parameter(Mandatory=$False,ParameterSetName=’Prefix’,HelpMessage='Specify the prefix string for the datastore name')] [ValidateNotNullOrEmpty()] [String]$Prefix='', [Parameter(Mandatory=$False,ParameterSetName=’Suffix’,HelpMessage='Specify the suffix string for the datastore name')] [ValidateNotNullOrEmpty()] [String]$Suffix='', [Parameter(Mandatory=$False,ParameterSetName=’Datastore’,HelpMessage='Specify the datastore name')] [ValidateNotNullOrEmpty()] [String]$Datastore='' ) #endregion script parameters #region script body if($Prefix){ $VMs = Get-Datastore | where{($_.name).StartsWith($Prefix)} | Get-VM | sort Name } if($Datastore){ $VMs = Get-Datastore | where{($_.name) -eq $Datastore} | Get-VM | sort Name } if($Suffix){ $VMs = Get-Datastore | where{($_.name).EndsWith($Suffix)} | Get-VM | sort Name } $objDrsVMGroup = Get-DrsVMGroup -Name $DrsVMGroup -Cluster $Cluster foreach($VM in $VMs){ if(($objDrsVMGroup).VM -contains $VM){ Write-Host "Removing virtual machine $VM from DRS VM Group $DrsVMGroup" try{ Set-DrsVMGroup -Name $DrsVMGroup -Cluster $Cluster -RemoveVM $VM } catch{ Write-Error "Error removing virtual machine $VM from DRS VM Group $DrsVMGroup" } } } #endregion script body } #******************************** #Import script modules Import-Module VMware.VimAutomation.Core, DrsRule # Connect to vCenter Server #Connect-VIServer -Server $vcenter -Credential $creds # Add DC1 VMs to DC1 DRS VM Group #Add-DrsVMtoDrsVMGroup -DrsVMGroup 'DC1_VMs' -Cluster 'Production' -Prefix 'DC1-' # Remove DC2 VMs from DC1 DRS VM Group #Remove-DrsVMFromDrsVMGroup -DrsVMGroup 'DC2_VMs' -Cluster 'Production' -Prefix 'DC1-' # Add DC2 VMs to DC2 DRS VM Group #Add-DrsVMtoDrsVMGroup -DrsVMGroup 'DC2_VMs' -Cluster 'Production' -Prefix 'DC2-' # Remove DC1 VMs from DC2 DRS VM Group #Remove-DrsVMFromDrsVMGroup -DrsVMGroup 'DC1_VMs' -Cluster 'Production' -Prefix 'DC2-' # Disconnect from vCenter Server #Disconnect-VIServer -Server $vcenter -Confirm:$false #**************************************
Leave a Reply