= VM Affinity Rules =
**Summary**: Info and tips about VM Affinity rules on VMware, as well as scripts on how to export and import them. \\
**Date**: Around 2014 \\
**Refactor**: 1 May 2025: Checked links and formatting. \\
{{tag>vmware powershell}}
If a service request regarding VM affinity is received you should follow this procedure to implement the service request:
# Check validity of service request
# Create groups if required
# Create affinity rule
# Update documentation
= Check validity of service request =
VMs can only have a (anti-)affinity if they are part of the same cluster. So always check first if the VMs are in the same cluster. If not, deny the request, if they are, continue.
= Create Groups If Required =
If the request if to host a VM onto specific hosts you first need to create groups, even if it's just one VM of just one host. VM-Host rules only work with groups.
To create a group follow these steps:
* Right-click the specific cluster and select "Edit Settings"
* Go to "VMware DRS" -> DRS Groups Manager
* Click Add on the Virtual Machines DRS groups of Host DRS Group section
* Enter a name and select the VMs/Hosts that should be in the group
* Click OK to create the group
= Create Affinity Rule =
To create the actual affinity rule follow these steps:
* Right-click the specific cluster and select "Edit Settings"
* Go to "VMware DRS" -> Rules
* Click Add
* Enter a name and select the type:
* Keep Virtual Machines together
* Separate Virtual Machines
* Virtual Machines to Hosts
* Select the required VMs, or if selected the Virtual Machines to Hosts option the required VM and Hosts group you just created.
* Note that in the last case you also have these options:
* Must run on hosts in group
* Should run on hosts in group
* Must not run on hosts in group
* Should not run on hosts in group
* Save the rule by clicking OK
= Update Documentation =
Because DRS rules can get lost when DRS gets disabled you should document the rules very precise. Luckily there are export and import scrips:
== Export Script ==
$outfile = "C:\rules.txt"
Remove-Item $outfile
$clusterName =
$rules = get-cluster -Name $clusterName | Get-DrsRule
foreach($rule in $rules){
$line = (Get-View -Id $rule.ClusterId).Name
$line += ("," + $rule.Name + "," + $rule.Enabled + "," + $rule.KeepTogether)
foreach($vmId in $rule.VMIds){
$line += ("," + (Get-View -Id $vmId).Name)
}
$line | Out-File -Append $outfile
}
== Import Script ==
$file = "C:\rules.txt"
$rules = Get-Content $file
foreach($rule in $rules){
$ruleArr = $rule.Split(",")
if($ruleArr[2] -eq "True"){$rEnabled = $true} else {$rEnabled = $false}
if($ruleArr[3] -eq "True"){$rTogether = $true} else {$rTogether = $false}
get-cluster $ruleArr[0] | `
New-DrsRule -Name $ruleArr[1] -Enabled $rEnabled -KeepTogether $rTogether -VM (Get-VM -Name ($ruleArr[4..($ruleArr.Count - 1)]))
}
= Useful Links =
> The scripts are originally created by [[http://www.lucd.info/|LucD]]