VMware Cloud Community
bernz
Enthusiast
Enthusiast

PowerCLI script to list VMFS,RDM and Free LUN

Hi anyone

Can add some details on the script to get Provisioned & Free Space?

Credit to Sreejesh Damodaran

PowerCLI script to list VMFS,RDM and Free LUNs in a cluster | Ping4info

#

# .SYNOPSIS

# PowerCLI Script for collecting the details of storage connected to a cluster.

# .DESCRIPTION

# This PowerCLI scritpt will help to identify how the disks/LUNs connected to the host are presented(RDM,VMFS or None).

# .VERSION

# v1.1

# .NOTES

# File Name : Get-DiskDetails.ps1

# Author : Sreejesh Damodaran

# Requires : PowerCLI 5.1 Release 2 or above, vCenter 5.1 or above, Powershell 3.0 or above

# .LINK

# This script posted in: http://www.pingforinfo.com

# .EXAMPLE

#   Get-DiskDetails.ps1

#

#####################################

# VMware VirtualCenter server name, #

#Cluster Name and output file(csv) #

#####################################

Connect-VIServer "vCenter Name or IP"

$outputFile = "Output csv file, eg : c:\DiskRep.csv"

$cltName = "Cluster Name "

new-variable -Name clusterName -Scope global -Value $cltName -Force

new-variable -Name LUNDetails -Scope global -Value @() -Force

new-variable -Name LUNDetTemp -Scope global -Value @() -Force

new-variable -Name LUNDetFinal -Scope global -Value @() -Force

####################################################

#Function to creeate objects and insert into array.#

####################################################

function insert-obj(){

[CmdletBinding()]

param(

[PSObject]$esxHost,

[PSObject]$vmName,

[PSObject]$dsName,

[PSObject]$cnName,

[PSObject]$rnName,

[PSObject]$Type,

[PSObject]$CapacityGB,

[PSObject]$ArrayName

)

$object = New-Object -TypeName PSObject

$object | Add-Member -Name 'Cluster' -MemberType Noteproperty -Value $global:clusterName

$object | Add-Member -Name 'Host' -MemberType Noteproperty -Value $esxHost

$object | Add-Member -Name 'DatastoreName' -MemberType Noteproperty -Value $dsName

$object | Add-Member -Name 'VMName' -MemberType Noteproperty -Value $vmName

$object | Add-Member -Name 'CanonicalNames' -MemberType Noteproperty -Value $cnName

$object | Add-Member -Name 'LUN' -MemberType Noteproperty -Value $rnName.Substring($rnName.LastIndexof(“L”)+1)

$object | Add-Member -Name 'Type' -MemberType Noteproperty -Value $Type

$object | Add-Member -Name 'CapacityGB' -MemberType Noteproperty -Value $CapacityGB

if ($ArrayName -eq "LUNDetails"){

$global:LUNDetails += $object

}

elseif($ArrayName -eq "LUNDetTemp"){

$global:LUNDetTemp += $object

}

}

######################################

#Collect the hostnames in the cluster#

######################################

$Hosts = Get-Cluster $clusterName | Get-VMHost | select -ExpandProperty Name

#############################################

#Collecting datastore, RDM and LUN Details.#

#############################################

foreach($vmHost in $Hosts) {

Write-Host "Collecting Datastore details from host $vmHost ...."

get-vmhost -Name $vmHost | Get-Datastore | % {

$naaid = $_.ExtensionData.Info.Vmfs.Extent | select -ExpandProperty DiskName

$RuntimeName = Get-ScsiLun -vmhost $vmHost -CanonicalName $naaid | Select -ExpandProperty RuntimeName

insert-obj -esxHost $vmHost -dsName $_.Name -cnName $naaid -rnName $RuntimeName -Type $_.Type -CapacityGB $_.CapacityGB -ArrayName LUNDetails

}

Write-Host "Collecting RDM Disk details from host $vmHost ...."

get-vmhost -Name $vmHost | Get-VM | Get-HardDisk -DiskType "RawPhysical","RawVirtual" | % {

$naaid = $_.SCSICanonicalName

$RuntimeName = Get-ScsiLun -vmhost $vmHost -CanonicalName $naaid | Select -ExpandProperty RuntimeName

insert-obj -esxHost $vmHost -vmName $_.Parent -cnName $naaid -rnName $RuntimeName -Type RDM -CapacityGB $_.CapacityGB -ArrayName LUNDetails

}

Write-Host "Collecting Free SCSI LUN(Non-RDM/VMFS) details from host $vmHost ...."

(get-view (get-vmhost -name $vmHost | Get-View ).ConfigManager.DatastoreSystem).QueryAvailableDisksForVmfs($null) | %{

$naaid = $_.CanonicalName

$DiskTemp = Get-ScsiLun -vmhost $vmHost -CanonicalName $naaid

insert-obj -esxHost $vmHost -cnName $naaid -rnName $DiskTemp.RuntimeName -Type FREE -CapacityGB $DiskTemp.CapacityGB -ArrayName LUNDetails

}

Write-Host "Collecting details of Unallocated LUNs from host $vmHost ...."

Get-ScsiLun -VmHost $vmHost | %{

$naaid = $_.CanonicalName

$naaidTemp = $LUNDetails | select -ExpandProperty CanonicalNames

If ($naaidTemp -notcontains $naaid){

insert-obj -esxHost $vmHost -cnName $naaid -rnName $_.RuntimeName -Type UNKNOWN -CapacityGB $_.CapacityGB -ArrayName LUNDetTemp

}

}

$global:LUNDetails += $global:LUNDetTemp

$global:LUNDetFinal += $global:LUNDetails

$global:LUNDetails.Clear()

$global:LUNDetTemp.Clear()

}

############################

#Export output to CSV file #

############################

$global:LUNDetFinal | Sort-Object Host,{[int]$_.LUN} |

select Cluster,Host,CanonicalNames,Type,LUN,DatastoreName,VMName,CapacityGB  | Export-Csv -NoTypeInformation  $outputFile

$global:LUNDetFinal.Clear()

Reply
0 Kudos
2 Replies
vXav
Expert
Expert

Hi,

I didn't read all your script sorry Smiley Happy.

I'll just copy/paste a bit of one of my functions that you can adapt to your needs.

$DS = get-datastore "whatever"

$CapacityGB    = [Math]::Round(($DS.extensiondata.summary.capacity   / 1GB),2)

$FreeGB             = [Math]::Round(($DS.extensiondata.summary.FreeSpace  / 1GB),2)

$UsedGB            = [Math]::Round((($DS.extensiondata.summary.capacity  / 1GB) - ($DS.extensiondata.summary.FreeSpace / 1GB)),2)

$ProvisionedGB = [Math]::Round((($DS.extensiondata.summary.capacity  / 1GB) - ($DS.extensiondata.summary.FreeSpace / 1GB) + ($DS.extensiondata.summary.Uncommitted / 1GB)),2)

$ProvisionedPercent = $ProvisionedGB / $CapacityGB

Reply
0 Kudos
sampara_avesh
Contributor
Contributor

This script takes lot of time to complete and if I want to run it on the whole vcenter not on a cluster. Can someone please help.

Reply
0 Kudos