If you are someone who are involved in building VMware infrastructures like me then i am pretty sure you might have had moments of regret creating some portgroups that you didnt wanted or wanted them but not quite the way you liked it. Well, you are not alone. I too have to shoot some portgroups every now and then (almost atleast thrice a week) and here is my way of getting that s**t done...wink wink..
So first we wanna get the variables for this purpose.
(Now i am not too systematic with commas, indentation and stuff like that, i just go for the kill without having to bother too much about rules of scripting or coding. so dont hate me for it. it works so thats enough for me.)
If you wanna perform this on all clusters then keep that * there or replace that * in the $cluster with the name of your cluster within quotes.
next up is we wanna connect to the vcenter or host or hosts and list all the hosts.
So here $vmhosts is the list of all the hosts of the vcenter
Now what if we have these diseased (or soon to be diseased..lol) portgroups are not on all hosts but on just few hosts? so let us filter the the lists of hosts with the hosts with the portgroup name $portgroup in them.
So now here $pgs is the list of all the portgroups in the $vmhost. Now let us search for the $portgroup that we wanna remove.
So first we wanna get the variables for this purpose.
#variables
$cluster
= "*"
$portgroup = "VMkernel"
(Now i am not too systematic with commas, indentation and stuff like that, i just go for the kill without having to bother too much about rules of scripting or coding. so dont hate me for it. it works so thats enough for me.)
If you wanna perform this on all clusters then keep that * there or replace that * in the $cluster with the name of your cluster within quotes.
next up is we wanna connect to the vcenter or host or hosts and list all the hosts.
#Connect to vcenter server or a single host or hosts
Connect-VIServer
$vmhosts
= get-cluster
"*" |
Get-VMHost |
sort
So here $vmhosts is the list of all the hosts of the vcenter
Now what if we have these diseased (or soon to be diseased..lol) portgroups are not on all hosts but on just few hosts? so let us filter the the lists of hosts with the hosts with the portgroup name $portgroup in them.
foreach ($vmhost in $vmhosts)
{
$pgs = get-vmhost
$vmhost |
get-virtualportgroup | select name
}
foreach ($vmhost in $vmhosts)
{
$pgs
= get-vmhost
$vmhost |
get-virtualportgroup | select name
if ($pgs -match
"VMkernel")
{
$vmk = Get-VMHostNetworkAdapter
-VMHost $vmhost
| where
PortgroupName -eq
$portgroup
Write-Host
found $portgroup
with vmkernel
$vmk on $vmhost -ForegroundColor
yellow
}
}
So now we can see that we have an if condition where if $pgs (which is a list of all the protgroups in the $vmhost) contains a portgroup by the name $portgroup (in our case VMkernel) then find the vmkernel adapter associated with that portgroup, if not don't bother and move to the next host. Once it finds the host with the portgroup and the vmkernel adapter in it then it will display a message about it's findings. Now that we have found the $vmhost with the portgroup $portgroup with the $vmk adapter in it, we want to remove that.
foreach ($vmhost in $vmhosts)
{
$pgs
= get-vmhost
$vmhost |
get-virtualportgroup | select name
if ($pgs -match
"VMkernel")
{
$vmk = Get-VMHostNetworkAdapter
-VMHost $vmhost
| where
PortgroupName -eq
$portgroup
Write-Host
found $portgroup
with vmkernel
$vmk on $vmhost -ForegroundColor
yellow
Write-Host
removing vmkernel
$vmk on $vmhost -ForegroundColor
Green
#removing
vmkernel
Remove-VMHostNetworkAdapter
-Nic $vmk
-confirm:$false
}
}
Okay now that we deleted the vmkernel $vmk from the portgroup $portgroup, let us delete the portgroup too.
foreach ($vmhost in $vmhosts)
{
$pgs
= get-vmhost
$vmhost |
get-virtualportgroup | select name
if ($pgs -match
"VMkernel")
{
$vmk = Get-VMHostNetworkAdapter
-VMHost $vmhost
| where
PortgroupName -eq
$portgroup
Write-Host
found $portgroup
with vmkernel
$vmk on $vmhost -ForegroundColor
yellow
Write-Host
removing vmkernel
$vmk on $vmhost -ForegroundColor
Green
#removing
vmkernel
Remove-VMHostNetworkAdapter
-Nic $vmk
-confirm:$false
#removing
portgroup
get-virtualportgroup
-Name $portgroup
| Remove-VirtualPortGroup
-Confirm:$false
}
}
Deleting a regular vm portgroup is very easy as mentioned here with just an one liner but it would be nice if we can have a common script where you can just delete all kind of portgroups with or without vmkernel....
I will keep this updated here https://github.com/gajuambi/vmware