Description

This PowerShell script will detach the LUN's from a specified DRS pool.

Objectives

In a scenario wherein ESXi host is decommissioned or if LUN’s attached to ESXI are meant to remove it becomes tedious to remove the LUN’s manually.

If number of LUN’s & ESXi hosts are large in numbers then it becomes time consuming & also it is prone to human errors.

This PowerShell script will detach the LUN’s from the ESXi hosts which belong to particular DRS pool.

Scenarios

 

 

PowerShell
Edit|Remove
<#  
 
  
 
.SYNOPSIS 
 
Detaches the LUN as per the input provided 
 
  
 
.DESCRIPTION 
 
This function will help to detach the LUN 
 
  
 
.PARAMETER 
 
DRSPoolName  
 
  
 
  
 
.INPUTS 
 
Datastore name to be accepted through the pipeline 
 
  
 
  
 
.AUTHOR 
 
  
 
Vivek Pophale 
 
  
 
.EXAMPLE 
 
PS C:\> Detach-Datastore 'DRSPoolName' 
 
  
 
  
 
.EXAMPLE 
 
Function input can be accepted through the pipeline 
 
PS C:\> 'DRSPoolName' | Detach-Datastore 
 
  
 
#> 
 
  
 
function Detach-Datastore 
 
{ 
 
  
 
    [cmdletBinding()] 
 
    Param( 
 
            [Parameter(Mandatory=$true,ValueFromPipeline=$true)] 
 
            $DRSPoolName 
 
    ) 
 
     
 
Import-Module VMware.VimAutomation.Core 
 
$VCServer=Read-Host "Enter VCenter server name"  
 
$vcLogin=Read-Host "Enter Login ID for VCenter" 
 
$esxName = gc C:\Temp\ESXI.csv 
 
$datastores=gc C:\Temp\Datastores.csv 
 
$credFile = "C:\temp\cred.txt" 
 
  
 
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($vcLogin, (Get-Content $credFile | ConvertTo-SecureString)) 
 
  
 
$connection=Connect-VIServer $VCServer -Credential $cred -WarningAction SilentlyContinue 
 
  
 
try 
 
    { 
 
        Connect-VIServer -Server $VCServer -Credential $cred -ea Stop -Verbose 
 
    } 
 
  
 
catch 
 
    { 
 
        Write-Error "There is an issue while connecting to VCenter...." 
 
    } 
 
  
 
$esx_count=0 
 
foreach($esxi in $esxName) 
 
{ 
 
    $esx_count+=1 
 
    $LUN_count=0 
 
    foreach($datastore in $datastores) 
 
    { 
 
        $esx = Get-VMHost -Name $esxi 
 
        $ds = Get-Datastore -Name $datastore 
 
        $canonicalName = $ds.ExtensionData.Info.Vmfs.Extent[0].DiskName 
 
  
 
        $storSys = Get-View $esx.Extensiondata.ConfigManager.StorageSystem 
 
  
 
        $device = $storsys.StorageDeviceInfo.ScsiLun | where {$_.CanonicalName -eq $canonicalName} 
 
  
 
        $numVM=$ds.ExtensionData.Vm.Count 
 
  
 
if($device.OperationalState[0] -eq 'ok' -and $numVM -eq 0) 
 
{ 
 
# unmount disk 
 
    $StorSys.UnmountVmfsVolume($ds.ExtensionData.Info.Vmfs.Uuid)  
 
    Start-Sleep 9 
 
    Write-Output "$datastore - unmounted from $esx" -Verbose 
 
  
 
# Detach disk 
 
    $storSys.DetachScsiLun($device.Uuid)  
 
    Start-Sleep 9 
 
    Write-Output "LUN associated with datastore $datastore has been detached from $esx" 
 
                 
 
                $LUN_count+=1 
 
  
 
} 
 
  
 
else 
 
{  
 
    Write-Warning "Datastore $datastore is not operational on $esx host" 
 
} 
 
} 
 
#No of LUNs removed 
 
    Write-Host "$LUN_count LUNs have been removed from $esx" -ForegroundColor DarkYellow 
 
} 
 
  
 
Write-host "All LUNs have been removed from below $esx_count hosts" -ForegroundColor DarkMagenta 
 
Write-host "$esxname" -ForegroundColor DarkMagenta 
 
  
 
if($connection) 
 
{ 
 
    Disconnect-VIServer * -Confirm:$false 
 
} 
 
  
 
}