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!




People, Process, and Technology. Powered by Community!

You might also like


  • John Terry
    April 18, 2013 at 1:03 pm

    Thanks for this. Well written and works great. Exactly what I was looking for!

    • DiscoPosse
      April 19, 2013 at 5:25 am

      Thank you for the kind words John! I’m glad that it was able to help 🙂

  • Anton
    October 4, 2013 at 7:32 am

    Thanks, this was very helpful. The major plus is…it works! Now if I can just make the business move to vDS instead…lol

    • DiscoPosse
      October 4, 2013 at 10:00 am

      Thanks Anton! I’m glad that it helped. I know the feeling of wishing for vDS!

  • Kaiser
    December 17, 2013 at 10:13 am

    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.

    • DiscoPosse
      December 17, 2013 at 10:15 am

      Thanks Kaiser! I appreciate the feedback 🙂


Proudly Sponsored By

infinio nutanix vembu Turbonomic

GC On-Demand

Subscribe to the Blog

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Upcoming events:

no event