Deleting old vSAN partitions
In my current assignment I have to reuse “old” servers to build a new VMware Cloud Foundation platform. The servers already have a vSAN partition, which wasn’t removed before breaking down the old platform. But I guess nobody ever does delete the old vSAN partition, right?
I have to remove the vSAN partition on so many servers, that it doesn’t make sense to do this by hand. So why not write a Powershell script?
First create a csv file, in my example named vsanip.csv. Be sure to start with ip and then your ESXi servers management IPs:
ip 192.168.100.10 192.168.100.11 192.168.100.12 192.168.100.13 192.168.100.14
Use this script to clear the old vSAN partition.
<#
Author: Kabir Ali - info@kablog.nl
Scriptname: CVP (Clear vSAN Partition)
Version: 1.0 (Tested)
Date: Nov 29 2021
Why: Because clearing old vSAN partition data is slow and stupid
#>
<#
Example:
.\CVP.ps1 -InputCSV ".\vsanip.csv" -ESXiUser "root" -ESXiPass "VMware1!"
#>
Param (
[Parameter(Mandatory = $true)][string]$InputCSV,
[Parameter(Mandatory = $true)][string]$ESXiUser,
[Parameter(Mandatory = $true)][string]$ESXiPass
)
# To SSH into ESXi this module is needed
if (Get-Module -ListAvailable -Name Posh-SSH) {
Write-Host "Module exists"
}
else {
Write-Host "Module does not exist"
Install-Module Posh-SSH
}
# Read Input CSV file
$vmhosts = import-csv $InputCSV
# Accept invalid SSL certificate from ESXi
Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false | Out-Null
# Convert credentials to Secure String
$passwordsec = ConvertTo-SecureString -String $ESXiPass -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($ESXiUser,$passwordsec)
foreach ($vmhost in $vmhosts){
# Connect to the ESXi host
write-host "Connecting to ESXi host:" $vmhost.ip
try {
connect-viserver -server $vmhost.ip -user $user -password $password | Out-Null
}
Catch {
$_.Exception.ToString()
$error[0] | Format-List -Force
Write-Host "Connecting to ESXi host: " $vmhost.ip "failed! Check ESXi host IP and credentials" -ForegroundColor Red
Write-Error "Stopping!" -ErrorAction Stop
break
}
# SSH to the ESXi host and get some vSAN data
$ssh = new-sshsession -computername $vmhost.ip -credential $cred -acceptkey -keepaliveinterval 5
$vsanstoragelistcommand = "esxcli vsan storage list"
$vsanstoragelist = invoke-sshcommand -sessionid $ssh.sessionid -command $vsanstoragelistcommand -timeout 30
# Build an array with the data return from the above command
[array]$vsandata = @()
foreach($vsanstoragedata in $vsanstoragelist.Output){
$vsandata += New-Object PSObject -Property @{
VSAN_Disk_Group_Name = $vsanstoragedata | Select-String -Pattern "VSAN Disk Group Name"
}
}
Write-host "Found the following unique vSAN Disk Group Names:" -ForegroundColor Yellow
$vsandata.VSAN_Disk_Group_Name | sort -Unique
# In order to remove the disks the vSAN disk claim model must be set on manual
$diskclaim = "esxcli vsan storage automode set --enabled false"
try {
invoke-sshcommand -sessionid $ssh.sessionid -command $diskclaim -timeout 60 | Out-Null
Write-Host "Changed vSAN disk claim settings to manual" -ForegroundColor Yellow
}
Catch {
$_.Exception.ToString()
$error[0] | Format-List -Force
Write-Host "Changing mode failed on ESXi host: " $vmhost.ip -ForegroundColor Red
Write-Error "Stopping!" -ErrorAction Stop
break
}
# Mount the found disksgroups
foreach($diskmount in ($vsandata.VSAN_Disk_Group_Name | sort -Unique)){
$mountdisk = "esxcli vsan storage diskgroup mount -s "+ ($diskmount -replace "VSAN Disk Group Name: ").Split('',[System.StringSplitOptions]::RemoveEmptyEntries)
try {
invoke-sshcommand -sessionid $ssh.sessionid -command $mountdisk -timeout 60 | Out-Null
Write-Host "Mounted VSAN Disk Group Name" $mountdisk -ForegroundColor Yellow
}
Catch {
$_.Exception.ToString()
$error[0] | Format-List -Force
Write-Host "Mounting failed on ESXi host: " $vmhost.ip -ForegroundColor Red
Write-Error "Stopping!" -ErrorAction Stop
break
}
}
# Remove the vSAN partitions
foreach($diskuuid in ($vsandata.VSAN_Disk_Group_Name | sort -Unique)){
$removevsanpartition = "esxcli vsan storage remove -s "+ ($diskuuid -replace "VSAN Disk Group Name: ").Split('',[System.StringSplitOptions]::RemoveEmptyEntries)
try {
invoke-sshcommand -sessionid $ssh.sessionid -command $removevsanpartition -timeout 30 | Out-Null
Write-Host "Cleared VSAN Disk Group Name" $removevsanpartition -ForegroundColor Yellow
}
Catch {
$_.Exception.ToString()
$error[0] | Format-List -Force
Write-Host "Clearing the partition failed on ESXi host: " $vmhost.ip -ForegroundColor Red
Write-Error "Stopping!" -ErrorAction Stop
break
}
}
# Close SSH connection
Write-Warning "Closing SSH connection"
remove-sshsession -sessionid $ssh.sessionid
# Disconnect ESXi host
Write-Warning "Disconnecting ESXi host"
disconnect-viserver -Server * -confirm:$false
}
I hope this helps!
