My notes and ramblings, normally about automation

PowerCLI - Using vSphere DSC Resources

· Read in about 6 min · (1145 Words)
PowerCLI PowerShell VMware

VMware has released a brand-new, and open-sourced, way to manage your vSphere environment. The Desired State Configuration (DSC) Resources for VMware lets us apply standard configuration management processes through PowerShell DSC and PowerCLI! Let’s take a walk through how we can get started using these DSC resources and apply our first configuration!

Desired State Configuration Resources for VMware Overview

PowerShell DSC has been out for a while, since Windows Server 2012 R2 as a matter of fact. To summarize in a single sentence: PowerShell DSC can manage and monitor a system’s configuration based on what’s known as configuration files, which happen to be written as PowerShell code. This is all made possible thanks to the Local Configuration Manager (LCM). LCM is the «engine» running locally on each of the target nodes that takes the configuration file, interprets it, and applies all the configured parts. These parts include a system’s configuration, in what manner the configuration is refreshed, and how often it is refreshed, just to name a few. The above is important because the DSC Resources for VMware operate a little differently than a standard DSC configuration. The DSC Resources for VMware make use of a proxy LCM host. This is because the LCM cannot run on the VCSA (both vCenter and PSC based appliances) nor can it run on ESXi hosts. An important note about this proxy LCM host, it has to be Windows PowerShell based. Furthermore, only PowerShell 5.1 and PowerCLI 10.1.1 or newer will be supported.

This first release of the DSC Resources for VMware will be able to manage a couple different areas for both vCenter and ESXi hosts. They are as follows:

  • vCenterStatistics
    • Level
    • PeriodLength
  • vCenterSettings
    • EventMaxAge
    • TaskMaxAge
    • Logging Level
  • VMHostNtpSettings
    • NTP Server
    • NTPD Service Policy
  • VMHostDnsSettings
    • HostName
    • DomainName
    • Address
  • VMHostSatpClaimRule
    • RuleName
    • Transport
    • Description
  • VMHostTpsSettings
    • ShareScanTime
    • ShareForceSalting

Installation Overview

We now know what it is and what it can do, how about the installation? On the designated proxy LCM system, we will want to download the module from GitHub and make it available in one of our designated PSModulePath directories. The zip file is available through the following link: Desired State Configuration Resources for VMware

Here’s some code that can streamline the download and initialization process:

# Download the 1.0 release of the VMware.vSphereDSC module from GitHub
Try {
    Invoke-WebRequest -Uri '' -OutFile $env:userprofile\Downloads\
Catch [System.Net.WebException] {
    # On error, the SecurityProtocol for the local PowerShell session will be updated to access TLS 1.2 and the download will be attempted again.
    $secProtocol = [Net.ServicePointManager]::SecurityProtocol
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Invoke-WebRequest -Uri '' -OutFile $env:userprofile\Downloads\
    # The SecurityProtocol will be then reverted back to the state it was at prior
    [Net.ServicePointManager]::SecurityProtocol = $secProtocol

# Create a new VMware.vSphereDSC directory in the PowerShell Modules folder which is located in the Program Files directory
$dscDirectory = New-Item -Path “$env:ProgramFiles\Windows PowerShell\Modules” -Name 'VMware.vSphereDSC' -Type Directory

# Expand the downloaded zip file containing the VMware.vSphereDSC module into the prior directory
Expand-Archive -Path .\Downloads\ -DestinationPath $dscDirectory

After we have installed the module we should be able to list the newly acquired module and import it into our active PowerShell Session:

Import-Module -Name VMware.vSphereDSC

Example: Importing the VMware.vSphereDSC Module

We can also verify the DSC resources we have available:

Get-DscResource -Module VMware.vSphereDSC

Example: Output of available DSC Resources

Next, we need to make sure the proxy LCM system can understand the DSC configuration files. This is done through the Windows Remote Management service. We can setup the WinRM service or verify that the WinRM service is setup with the following code:

winrm quickconfig

In my environment, this system already had WinRM setup so I received the following message: Example: Windows Remote Management Configuration

We should now be all set to start setting up DSC resources in our environment!

Managing an ESXi Host’s NTP

The DSC Resources for VMware repository has some pre-created configuration files which can be sourced to create the MOF file. The MOF file, which stands for Managed Object Format, is the output from a configuration file which has been compiled by the LCM. These configuration files are located in the repo at the following location: \Source\VMware.vSphereDSC\Configurations

In my environment, I’ve created my own fork of the repository and cloned it to my local system where I’ll be referencing the files. In our example, we’re going to setup DSC to manage an ESXi host’s NTP configuration. We can see some parameters and some settings by opening the VMHostNtpSettings_Config.ps1 file that’s located in the ESXiConfigs directory.

Input Type Input Name Input Description
Parameter Name Resource Name
Parameter Server Server Host Name
Parameter User ESXi host username
Parameter Password ESXi host password
Setting NtpServer NTP server/s the host will use
Setting NtpServicePolicy Status for the NTPD service

For my lab environment, I’m going to update the NtpServer values and accept the service policy setting of ‘automatic’. I’m also going to apply this configuration at the ESXi host level, so my host name and server name will match. We can do this with the following commands:

# Use splatting to fill the parameter values
$ntpConfigInput = @{
    name = 'esx01.corp.local'
    server = 'esx01.corp.local'
    user = 'root'
    pass = 'VMware1!'

# Compile the MOF in the current directory
. VMHostNtpSettings_Config.ps1 @ntpConfigInput

As part of the output, we should see the following MOF file having been created: Example: Configuring and creating MOF file

We can then test the MOF file against our host with the following command:

Test-DscConfiguration -ComputerName localhost -Path .\VMHostNtpSettings_Config

Added to the output, I have also included another PowerShell session which is polling the host for the current NTP server/s and service policy: Example: Pre-DSC Configuration

In the above example, notice the ‘InDesiredState’ property with a value of False. Now, we’re ready to start applying our configuration. We do this with the following command:

Start-DscConfiguration -ComputerName localhost -Path .\\VMHostNtpSettings\_Config\\ -Wait -Force

After a few moments, we’re ready to check the current DSC configuration with the following command:


Again, I’ve added a second PowerShell session to show the current status of the host: Example: Post DSC Configuration Status

For reference, this is the code I’m running to show the current status of the host’s NTP configuration:

Get-VMHost -Name VMHostName | Sort Name | Select Name, @{N=“NTPServer“;E={$\_ | Get-VMHostNtpServer}}, @{N=“NTPPolicy“;E={(Get-VMHostService -VMHost $\_ | Where-Object {$\_.key-eq “ntpd“}).Policy}}

In some later blog posts, we’ll take a look at some of the other areas of this module including applying configurations to multiple hosts, applying vCenter settings, applying values to multiple hosts in a vCenter, and some ways to apply better security practices to both the credentials and the MOF.


PowerCLI is back with a brand-new feature, Desired State Configuration Resources for VMware! These resources allow PowerCLI to make use of PowerShell DSC to define the configuration of a desired node. The DSC Resources for VMware can define ESXi host settings such as NTP servers, DNS servers, and TPS share scan times. We can also define vCenter settings such as statistics level and logging level. As an additional benefit, these resources are also open-source and community contributions are absolutely welcome!