Press "Enter" to skip to content

Automated vSphere VM sizing & cost calculator for DR to Microsoft Azure

Joshua Stenhouse 14

Note: Updated to v2 08/15/19 to use PowerCLI from the PowerShell gallery rather than the deprecated installer, other than that still working great. Thanks to Doug Dockter for the heads up.

When planning DR or migrations from VMware vSphere to Microsoft Azure, one very important task is to configure the appropriate VM/instance sizing to match your current VM settings. This needs to be done in advance for the following key reasons:

  • Ensure adequate performance of the VM when running in Azure
  • Select the VM size that supports the number of vNICS and vDisks required
  • Perform a cost analysis of VM runtime and storage costs

In ZVR 5.0 selecting the Azure VM size is very easy in the GUI:


But what this doesn’t do is tell you exactly which one to pick and neither does it tell you how much it is going to cost!

So how are you going to select the correct instance size and calculate the cost for all your VMware VMs? That sounds like a manual and tedious task that thousands of people are going to have to tackle over the next few years. Of course, you already know I have something that is going to help you otherwise you wouldn’t be reading this far!Click on the link below to download a small PowerShell script and CSV which will automatically calculate all of this for you. All you need to do is specify the vCenter IP, your username, password (with view permissions) and that’s it! You’ll need to ensure you have PowerCLI installed before running it:

Automated vSphere VM sizing SS2.PNG

The script uses the supplied CSV as a template to select the correct Azure VM sizes, connects to your vCenter, pulls a list of the VMs, counts vNICs and vDisks then recommends the minimum size for each VM and calculates the cost. The template and script supplied are using current US East pricing and I included only the VM sizes that were applicable for my VM performance profile. You can easily add your own preferred VM sizes and update prices etc:

Automated vSphere VM sizing SS3.PNG

After running the script, you will see 2 exported CSV files in the same directory. These are:

  • AzureVMSizingExport.csv
    – A list of all the vSphere VMs, their size, settings and the appropriate Azure VM size to use
  • AzureVMSizingExportSummary.csv
    – A summary of the total cost of replicating to Azure, using ZVR to replicate & the cost of DR testing



And that’s it! I hope you find this useful, it saves you a bunch of time and helps you in your journey to the cloud. If it did any of these then please like, tweet and share this post! Happy scripting,


  1. Jamie Jamie

    Hey, when I’m running this I’m only pulling the data about the cost. I’m getting some errors about powershell/vm snap-ins, do you have any idea how to fix the errors?

    • Hey Jamie. Do you have PowerCLI installed? You need it for the script to connect to the vCenter. Let me know you get on.

  2. Rob Sims Rob Sims

    Could see this being a very useful script! When running it on our lab, every VM is getting registered as Linux as its guest OS. Thoughts on what I might be doing wrong?

    • Hey Rob. On script line 107 can you add the following snippet:

      write-host “GuestID =” $VM.GuestID
      write-host “Script Interpreted This As: $VMGuestOS”

      Run the script again, but in PowerShell ISE, then can you tell me what the GuestIDs of the VMs being identified as Linux? Thanks!

      • Looks like the guest IDs are showing up blank. I looked over the VMs to see if it might be VMWare Tools related but while a couple are uninstalled or in a guest managed state, most are running on the current version just fine. I also tried it partially on one of our production sites to see if it had something to do with the lab setup but was getting the same – Not pulling any guest IDs.


      • Interesting. There is definitely something going wrong with the Get-VM command on line 86, which shouldn’t be happening as it’s a very simple command:

        $VMList = get-vm | Where {($_.PowerState -eq “PoweredOn”) -and ($_.Name -notlike “*Z-VRA-*”) -and ($_.Name -notlike “*ZVM*”) -and ($_.Name -notlike “*NestedESXi*”) -and ($_.Name -notlike “*vCenter*”)}

        Add the below at line 93 to see a complete list:

        $VMList | select Name,GuestID

        What version of vSphere and PowerCLI are you using? Does the account you are using to connect to the vCenter have any permission restrictions on any VM folder etc? I’m using vCenter 6.5 with PowerCLI if that helps. Thanks for troubleshooting, always half the fun!

      • Rob Sims Rob Sims

        Think I figured it out, thanks for mentioning the Get-VM command as that got me looking at it. On my workstation that I was running it from I’m using PowerCli 5.1R1 and was connecting to vCenters on 6.0 Looks like the variable name is just “Guest” instead of “GuestID” in this version. Changing it to that makes the script correctly look for Windows instance pricing.

        Agreed on the troubleshooting, I especially like it when someone else has already written the code. 😉

    • Glad to hear it is working and thank you for the feedback. To compensate for this I’ve updated the script to use this instead:

      # Getting Guest OS for pricing
      if (($VM.GuestID -like “*windows*”) -or ($VM.Guest -like “*windows*”))
      $VMGuestOS = “Windows”
      $VMGuestOS = “Linux”

  3. Rob Sims Rob Sims

    Thanks Joshua! I should probably use this as a reminder to update my PowerCLI anyway, but I’ll remember what we found here anyway.

    If I could suggest one other change (though of course I can simply change it myself on our side) – Line 86 lists the VM name types to ignore. in ($_.Name -notlike “*Z-VRA-*”), if you removed the last dash in the name before the wildcard, it would also ignore VRAHs which we’d also probably not care about in terms of replication pricing.

    Thanks again, excited to see what kind of uses we get out of this going forward.

  4. Kopper Kopper

    really good script
    it will make life easier for sure

  5. karlochacon karlochacon

    Joshua, is the zip attached the script with the latest version? I mean with changes that commented in the comments?

  6. Alex Graf Alex Graf


    Awesome script. I have been using it recently and it has been awesome. I Think there might be an issue with the $FailoverRunningPricePerDay variable as it is never set so the TotalAzureCostPY variable doesn’t seem to include the 20 days of run-time you have setup in the script.

    Thanks for providing the script and awesome articles!

Leave a Reply

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

%d bloggers like this: