PowerCLI – Add Multiple VLAN Port Groups to vSphere Cluster Standard vSwitches

powercli-logoA recent change to my networking environment added the requirement to put different VM guests onto different VLANs according to their role. This is a fairly common configuration for a lot of virtualized datacenters. What is also common is that we don’t have the design fully prepared when we build our virtual infrastructure.

Limitations of Standard vSwitches

One of the negative points of standard vSwitches is that there are as many of them as there are ESX hosts and each must be separately created and managed. Add to that, multiple port groups on multiple uplinks and you have a growing administrative challenge.

While we don’t make these types of changes often, it is a change that can take a significant effort. More importantly, it is prone to human error.

Enter PowerCLI

With PowerCLI we have lots of great options. Because our hosts are in a cluster, the process flow will be fairly simple:

  1. Query a file with our VLAN information
  2. Query our vSphere cluster for hosts
  3. Add vSwitch port groups to each host in each cluster

Three easy steps, but the amount of clicks and typing to manually configure all of these port groups would be a real challenge. With a script we ensure consistency of the process.

Your Input File

We are working with a file that is named MyVLANs.csv and is located somewhere that the script can read it from as defined in the script itself. We assign a variable $InputFile and use the full path to find it in our script file.

The file has a header row and the data is organized as shown in our example here:


As we can see, we name the cluster, the vSwitch, the name to apply to the port group (VLANname) and the VLAN number to assign to that port group.

In your environment you could have numerous clusters, and you can use the same source file to manage additions to all of them at the same time.

The Script

I did say it was a three-step process, but one of those steps has a few more activities to perform. That being said, it still isn’t too much to do thanks to PowerCLI.

We assume that you are running your PowerCLI shell with privileges to administer your vCenter environment. This requires access to read the file and to add port groups to the vSphere vSwitches.

First we setup our input file:

$InputFile = “C:UsersewrightDocumentsSCRIPTS-TEMPMyVLANs.csv”

Next we import the file using the handy Import-CSV CmdLet:

$MyVLANFile = Import-CSV $InputFile

Now we just have to parse the contents. Because we have our header row, the columns are already assigned and we just loop through each line using ForEach to read the info, create our PowerCLI command to add the vSwitch and execute.

Because we have to read the cluster information for each line there is another loop inside to add the vSwitch to each host for the cluster.

ForEach ($VLAN in $MyVLANFile) {
$MyCluster = $VLAN.cluster
$MyvSwitch = $VLAN.vSwitch
$MyVLANname = $VLAN.VLANname

We define variables for each column in the file, then query the cluster for hosts and assign it to the $MyVMHosts variable:

$MyVMHosts = Get-Cluster $MyCluster | Get-VMHost | sort Name | % {$_.Name}

Next we loop through each host, query the vSwitch and create a new port group with the New-VirtualPortGroup CmdLet:

ForEach ($VMHost in $MyVMHosts) {
Get-VirtualSwitch -VMHost $VMHost -Name $MyvSwitch | New-VirtualPortGroup -Name $MyVLANname -VLanId $MyVLANid

Here is the view of the whole script, and here is the link to the file: http://www.discoposse.com/wp-content/uploads/AddVLANsToClusterHosts.ps1



 About the Errors

One of the things I haven’t done with this script is any error handling. Because I’m only adding switches on occasion it doesn’t need a lot of cleanliness. If you re-run the same file on an existing set of port groups it will throw an error because the port group exists. If I get some extra time I may add a little error housekeeping to clean things up.

Hope this saves you some time. Happy scripting!



7 thoughts on “PowerCLI – Add Multiple VLAN Port Groups to vSphere Cluster Standard vSwitches”

  1. nice work mate. it partially did what i was looking for, but in a cluster of 10 ESX hosts, i would’t wana run it. anyway to run it on individual ESX hosts? so instead of cluster just on a single node. or some housekeeping of removing it thorowing those errors.
    but regardless, its a good script and keep it coming.


Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.