markdjones82
Expert
Expert

Unmount datastore help, modifying existing function

Jump to solution

I would like to modify the below function to be able to pass a single host parameter and a single datastore parameter instead of doing ALL hosts attached to lun.  I'd liek to be able to specify the info.

Function Unmount-Datastore {

[CmdletBinding()]

Param

(

[Parameter(ValueFromPipeline

=$true)]

$Datastore

)

Process

{

if (-not $Datastore) {

Write-Host "No Datastore defined as input"

Exit

}

Foreach ($ds in $Datastore) {

$hostviewDSDiskName = $ds.ExtensionData.Info.vmfs.extent[0].Diskname

if ($ds.ExtensionData.Host) {

$attachedHosts = $ds.ExtensionData.Host

Foreach ($VMHost in $attachedHosts) {

$hostview = Get-View $VMHost.Key

$StorageSys = Get-View $HostView.ConfigManager.StorageSystem

Write-Host "Unmounting VMFS Datastore $($DS.Name) from host $($hostview.Name)..."

$StorageSys.UnmountVmfsVolume($DS.ExtensionData.Info.vmfs.uuid);

}

}

}

}

I attempted to modify it to this, but don't think I have it correct.  I would run like this preferrably:

$esx = get-vmhost hostname

Unmount-Datastore -VMHost $esx -Datastore datastorename

Function

Unmount-Datastore {

[CmdletBinding()]

param(

[

VMware.VimAutomation.ViCore.Impl.V1.Inventory.VMHostImpl]$VMHost,

[

string]$Datastore

)

Process {

if (-not $Datastore) {

Write-Host "No Datastore defined as input"

Exit

}

$hostview = Get-View $VMHost.Key

$StorageSys = Get-View $HostView.ConfigManager.StorageSystem

#Write-Host "Unmounting VMFS Datastore $($DS.Name) from host $($hostview.Name)..."

$StorageSys.UnmountVmfsVolume($Datastore.ExtensionData.Info.vmfs.uuid);

}

}

http://www.twitter.com/markdjones82 | http://nutzandbolts.wordpress.com
1 Solution

Accepted Solutions
LucD
Leadership
Leadership

Try it like this

function Unmount-Datastore {
  [CmdletBinding()]
  param(
    [VMware.VimAutomation.ViCore.Impl.V1.Inventory.VMHostImpl]$VMHost,
    [
string]$Datastore
  )  
process {     if (-not $Datastore) {       Write-Host "No Datastore defined as input"
     
exit
    }

   
$ds = Get-Datastore -Name $Datastore
    $hostview = Get-View $VMHost
    $StorageSys = Get-View $HostView.ConfigManager.StorageSystem
   
#Write-Host "Unmounting VMFS Datastore $($DS.Name) from host $($hostview.Name)..."     $StorageSys.UnmountVmfsVolume($ds.ExtensionData.Info.vmfs.uuid)
  } }

Since Datastore is defined as a [string] I'm assuming you pass the datastorename.

So you will need to get the datastore object in $ds


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

View solution in original post

5 Replies
LucD
Leadership
Leadership

Try it like this

function Unmount-Datastore {
  [CmdletBinding()]
  param(
    [VMware.VimAutomation.ViCore.Impl.V1.Inventory.VMHostImpl]$VMHost,
    [
string]$Datastore
  )  
process {     if (-not $Datastore) {       Write-Host "No Datastore defined as input"
     
exit
    }

   
$ds = Get-Datastore -Name $Datastore
    $hostview = Get-View $VMHost
    $StorageSys = Get-View $HostView.ConfigManager.StorageSystem
   
#Write-Host "Unmounting VMFS Datastore $($DS.Name) from host $($hostview.Name)..."     $StorageSys.UnmountVmfsVolume($ds.ExtensionData.Info.vmfs.uuid)
  } }

Since Datastore is defined as a [string] I'm assuming you pass the datastorename.

So you will need to get the datastore object in $ds


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

View solution in original post

markdjones82
Expert
Expert

Cool, that worked

here is the final

Just run

$esx = get-vmhost hostname

Unmount-Datastore -Vmhost $esx -Datastore datastore_name

Function

Unmount-Datastore {

[CmdletBinding()]

param(

[

VMware.VimAutomation.ViCore.Impl.V1.Inventory.VMHostImpl]$VMHost,

[

string]$Datastore

)

Process {

if (-not $Datastore) {

Write-Host "No Datastore defined as input"

Exit

}

$ds = Get-Datastore -Name $Datastore

$StorageSys = Get-View $esx.Extensiondata.ConfigManager.StorageSystem

#Write-Host "Unmounting VMFS Datastore $($DS.Name) from host $($hostview.Name)..."

$StorageSys.UnmountVmfsVolume($ds.ExtensionData.Info.vmfs.uuid);

}

}

http://www.twitter.com/markdjones82 | http://nutzandbolts.wordpress.com
markdjones82
Expert
Expert

Here is a script to use the function to unmount a list of datastores against a list of hosts if anyone cares to use.

files:

unmount-function.ps1 with function above in the same directory

datastores.csv

contains one column with header datastore and datastores below

hostlist (specify any name you want it will prompt)  header is host and then list of hostnames below

#unmount-datastore.ps1

. .\unmount-function.ps1

$vcenter = Read-Host "Enter Vcenter Name"

$list = read-host "Enter host list filename"

Connect-VIServer $vcenter

$hostslist = import-csv $list

$datastorelist = import-csv datastores.csv

 

foreach

($vmhost in $hostslist){

   $hostname=$vmhost.host

   $esx = get-vmhost $hostname

     foreach ($ds in $datastorelist){

     $datastore = $ds.datastore

     Write-Host "Unmounting $datastore from $hostname"

     Unmount-Datastore -VMhost $esx -Datastore $datastore

     }

}

Disconnect-VIServer $vcenter -Confirm:$false

http://www.twitter.com/markdjones82 | http://nutzandbolts.wordpress.com
bsd1977jda
Contributor
Contributor

Thanks to both of you guys.  I have used both versions of these modified scripts for a large storage deprovisioning project and it has saved me and my team tons of time and effort.  Thank you!

0 Kudos
swamynaveen
Enthusiast
Enthusiast

Hello Guys,

It would be great if you would help me on this as i need detailed steps to unmount the list of Datastores from selected VM-Host. in ESXi5.5 

 

Best Regards,

Swamy Naveen

naveens9038@gmail.com

0 Kudos