Tag Archives: powercli

Editing Storage DRS VM overrides : Java vSphere SDK and PowerCLI script

Recently I had an opportunity to work on one of customers requirement with respect to Storage DRS. Their requirement was to edit/remove Storage DRS “VM overrides” settings using vSphere API. As part of this exercise, I had written scripts both in PowerCLI as well as using vSphere Java SDK. I thought it is good to share with you as well. Before discussing about these scripts, let us first understand what exactly is Storage DRS VM overrides?

When user selects Storage DRS cluster (SDRS POD) as a storage for a VM, Storage DRS takes care of placing that VM on right datastore among all the datastores inside Storage DRS cluster. Once SDRS places that VM, all the default SDRS cluster level configuration gets applied on that VM such as ‘Storage DRS automation level’, ‘Keeps VMDK together’ etc. “VM overrides” settings comes to into picture if user wants to override some of Storage DRS cluster level settings. Ex. SDRS cluster level settings for “Automation level” is “Manual” and now for particular VM, user wants to have it as “Fully Automated” or user wants to disable SDRS on particular VM or user just wants to disable default affinity rule “Keeps VMDK together” for specific VM. This can be achieved using SDRS VM overrides settings. Let us look at some of vSphere web client screenshot on how to do it.

Above screenshot shows how to traverse to the “VM overrides” workflow using web client. You could see, currently there is NO VM for which SDRS settings are overridden. You can click on add button in order to override SDRS settings for specific VM as shown below.

Apart from this, there is another reason VM can get listed under “VM orderride” section i.e. When user is creating a VM and user wants to place that VM on a particular datastore among datastores in SDRS cluster instead of relaying on SDRS itself for initial placement, it does mean that user would like to take control of this VM , hence SDRS gets disabled on such VM and gets listed under “VM override” section. Take a look at below screenshot to understand the same.

You could see in above screenshot that if user wants to place the VM on a particular datastore from SDRS cluster instead of relaying on SDRS, we can select specific datastore only when we select checkbox for disabling SDRS. Once VM creation is completed, you could see that VM gets listed under “VM overrides” section as shown below.

Now that we understood, what is VM overrides? and how to configure it? Please take a look at scripts for editing/removing these Storage DRS VM overrides. Below are script locations.

1. Java SDK script on my github repo and on VMware Sample Exchange

2. PowerCLI equivalent on my github repo and on VMware Sample Exchange

If you have still not setup your YAVI JAVA Eclipse environment:Getting started tutorial

Important tutorials to start with: Part I & Part II

If you want to understand Storage DRS, take a look at this whitepaper

Let me know if you have any comments.

Some of useful VMware PowerCLI scripts added into VMware Sample Exchange

Recently while working on couple of customer cases, I had to write some useful vSphere PowerCLI scripts. I had submitted these scripts on VMware Sample Exchange, I thought to share on blog as well. If you haven’t still explored VMware Sample Exchange , please have your “My VMware” account created (Mandatory to have My VMware account to contribute or request) and enjoy the single pane of glass for VMware API samples across any product, any programming language and any platform (including CLIs). You can browse already existing samples as well as request new API sample that you are looking for. This is really cool site for learning VMware APIs, it is a must book-mark if you ask me. Here is the VMTN Sample Exchange community for more details.

Here we go for the PowerCLI scripts that I am talking about.

Below are the use-cases these script will help you on.

1. Report on vSphere compute cluster usage/capacity data on CPU, Memory and Storage.
2. Report on DRS VM-VM affinity rules associated with each VMs in the cluster.
3. Solution 1 : Report on VMs with “multi-writer” flag enabled.
4. Solution 2: Report on VMs with “multi-writer” flag enabled.

1. Report on vSphere compute cluster usage/capacity data on CPU, Memory and Storage. Sample exchange script location

< # .SYNOPSIS Getting Cluster usage/capacity data on CPU, Memory and Storage .NOTES Author: Vikas Shitole .NOTES Site: www.vThinkBeyondVM.com .NOTES Reference: http://vthinkbeyondvm.com/category/powercli/ .NOTES Please add the vCenter server IP/credentails as per your environment #>

Connect-VIServer -Server 10.92.166.82 -User Administrator@vsphere.local -Password xyz!23

$report = @()

Write-host "Report Generation is in Progress..."

foreach ($cluster in Get-Cluster ){

$row = '' | select ClusterName,CpuCapacity , CpuUsed, MemCapacity,MemUsed ,StorageCapacity,StorageUsed

$cluster = Get-Cluster -Name $clusterName
$cluster_view = Get-View ($cluster)
$resourceSummary=$cluster_view.GetResourceUsage()
$row.ClusterName =$cluster_view.Name
$row.CpuCapacity =$resourceSummary.CpuCapacityMHz
$row.CpuUsed =$resourceSummary.CpuUsedMHz
$row.MemCapacity =$resourceSummary.MemCapacityMB
$row.MemUsed =$resourceSummary.MemUsedMB
$row.StorageCapacity =$resourceSummary.StorageCapacityMB
$row.StorageUsed =$resourceSummary.StorageUsedMB

$report += $row
}
$report | Sort ClusterName | Export-Csv -Path "D:Clusterstats.csv" #Please change the CSV file location

Write-host "Report Generation is completed, please chekc the CSV file"

2. Report on DRS VM-VM affinity rules associated with each VMs in the cluster. Sample Exchange script location

< # .SYNOPSIS Getting DRS VM-VM affinity rules associated with each VMs in the cluster. .NOTES Author: Vikas Shitole .NOTES Site: www.vThinkBeyondVM.com .NOTES Reference: http://vthinkbeyondvm.com/category/powercli/ .NOTES Please add the vCenter server IP/credetails as per your environment #>

Connect-VIServer -Server 10.192.x.y -User Administrator@vsphere.local -Password xyz!23

$clusterName = "BLR" #Your cluster name
$cluster = Get-Cluster -Name $clusterName
$vms = Get-View ($cluster| Get-VM)
$cluster_view = Get-View ($cluster)

$report = @()

Write-host "Report Generation is in Progress..."

foreach ($vm in $vms ){

$row = '' | select VMName, Rules
$rules=$cluster_view.FindRulesForVm($vm.MoRef)
$ruleNameArray=" "
#There can be more than one rule assciated with single VM
foreach($rule in $rules){
$ruleNameArray+=$rule.Name
$ruleNameArray+=","
}
$row.VMName =$vm.Name
$row.Rules = $ruleNameArray
$report += $row
}
$report | Sort Name | Export-Csv -Path "D:VMsRules.csv" #Please change the CSV file location

Write-host "Report Generation is completed, please chekc the CSV file"

3. Solution 1 : Report on VMs with “multi-writer” flag enabled. Sample exchange script location

< # .SYNOPSIS: This script first downloads all the VMX files (per host/cluster/datacenter/VC)at specified file location .Once downloaded, it will scan each VMX file one by one to get "multi-writer" entry inside VMX .Finally it will list all matching VMX file names into specified file location. .As it downloads all the VMX files, it is going to take more time, that should be fine. .It is all right to download the VMX file when VM is up and running. .If name of the VM is changed, VMX file can be different from VM display name (visible from inventory). .There are 2 file locations you need to specify. 1. Directory where VMX file will be downloaded 2. Output file. .NOTES Author: Vikas Shitole .NOTES Site: www.vThinkBeyondVM.com .NOTES Reference: http://vthinkbeyondvm.com/category/powercli/ and https://communities.vmware.com/message/2269363#2269363 .NOTES Please add the vCenter server IP/credetails as per your environment .NOTES Alternatively you can use this script where API properties are used. https://github.com/vThinkBeyondVM/vThinkBVM-scripts/blob/master/Powershell-PowerCLI/VMMultiWriterReport.ps1 #>

Write-host "Connecting to vCenter server.."
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false -DisplayDeprecationWarnings:$false -Scope User
Connect-VIServer -Server 10.192.67.143 -User administrator@vsphere.local -Password Admin!23

$tgtFolder = "C:\Temp\VMX\" #Create this directory as per your environment
#$tgtString = 'scsi0:0.sharing="multi-writer"'
$tgtString = '"multi-writer"'
foreach ($vm in Get-VM ){

Get-VM -Name $vm.get_Name() | %{
$dsName,$vmxPath = $_.ExtensionData.Config.Files.VmPathName.Split()
$dsName = $dsName.Trim('[]')
$ds = Get-Datastore -Name $dsName
New-PSDrive -Location $ds -Name DS -PSProvider VimDatastore -Root "\" | Out-Null
Copy-DatastoreItem -Item "DS:$vmxPath" -Destination $tgtFolder
Remove-PSDrive -Name DS -Confirm:$false
}

}
Get-ChildItem -Path $tgtFolder -Filter "*.vmx" | Where {Get-Content -Path $_.FullName | Select-String -Pattern $tgtString} | Select Name | Out-File C:\test1.txt
Write-host "Execution is done... please check the file with all VMX file names."

# Below cmdlet can help to scan VMs per Datacenter/Datastore/Host/Cluster. Please modify the script as required.

#$myDatacenter = Get-Datacenter -Name "MyDatacenter"
#Get-VM -Location $myDatacenter

#$myDatastore = Get-Datastore -Name "MyDatastore"
#Get-VM -Datastore $myDatastore

#$myHost=Get-VMHost -Name "HostName"
#Get-VM -Location $myHost

#$myCluster=Get-Cluster -Name "ClusterName"
#Get-VM -Location $myCluster

4. Solution 2 : Report on VMs with “multi-writer” flag enabled. Sample Exchange script location

< # .SYNOPSIS: This script connects to the vCenter Server and prepares a report on All VMs with at-least one disk enabled with "Multi-Writer" sharing. .Report will be generated as CSV file with "VM Name". This can be modified to add some more columns as needed .VC IP/UserName/Password are hardcoded below, please change them as per your environment .By default this script scans all the VMs/VMDK in the vCenter Server. It can be easily twicked to scan VM per cluster or host or datacenter .NOTES Author: Vikas Shitole .NOTES Site: www.vThinkBeyondVM.com .NOTES Reference: http://vthinkbeyondvm.com/category/powercli/ .NOTES Please add the vCenter server IP/credetails as per your environment Alternate solution by scanning VMX file is here: https://github.com/vThinkBeyondVM/vThinkBVM-scripts/blob/master/Powershell-PowerCLI/VMMultiWriterReport2.ps1 #>

Write-host "Connecting to vCenter server.."
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false -DisplayDeprecationWarnings:$false -Scope User
Connect-VIServer -Server 10.192.x.y -User administrator@vsphere.local -Password xyz@123

$report = @()
Write-host "Report Generation is in Progress..."

foreach ($vm in Get-VM ){
$view = Get-View $vm
$settings=Get-AdvancedSetting -Entity $vm
if ($view.config.hardware.Device.Backing.sharing -eq "sharingMultiWriter" -or $settings.value -eq "multi-writer"){
$row = '' | select Name
$row.Name = $vm.Name
$report += $row
}

}
$report | Sort Name | Export-Csv -Path "D:MultiWriter.csv" #Please change the CSV file location

Write-host "Report is generated successfully, please check the CSV file at specified location"

#If you want to generate report per Datacenter/Datastore/Host/Cluster, modify script using below code.

#$myDatacenter = Get-Datacenter -Name "MyDatacenter"
#Get-VM -Location $myDatacenter

#$myDatastore = Get-Datastore -Name "MyDatastore"
#Get-VM -Datastore $myDatastore

#$myHost=Get-VMHost -Name "HostName"
#Get-VM -Location $myHost

#$myCluster=Get-Cluster -Name "ClusterName"
#Get-VM -Location $myCluster