Today, we are happy to announce a brand-new and open-sourced way to manage your vSphere environment. The Desired State Configuration (DSC) Resources for VMware allows partners, automation engineers, DevOps teams, and system administrators a new way to 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 'https://github.com/vmware/dscr-for-vmware/releases/download/v1.0/VMware.vSphereDSC.zip' -OutFile $env:userprofile\Downloads\VMware.vSphereDSC.zip } 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 'https://github.com/vmware/dscr-for-vmware/releases/download/v1.0/VMware.vSphereDSC.zip' -OutFile $env:userprofile\Downloads\VMware.vSphereDSC.zip # 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\WindowsPowerShell\Modules” -Name 'VMware.vSphereDSC' -Type Directory # Expand the downloaded zip file containing the VMware.vSphereDSC module into the prior directory Expand-Archive -Path $env:USERPROFILE\Downloads\VMware.vSphereDSC.zip -DestinationPath $dscDirectory 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # Download the 1.0 release of the VMware.vSphereDSC module from GitHub Try { Invoke-WebRequest -Uri 'https://github.com/vmware/dscr-for-vmware/releases/download/v1.0/VMware.vSphereDSC.zip' -OutFile $env : userprofile \ Downloads \ VMware . vSphereDSC . zip } 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 'https://github.com/vmware/dscr-for-vmware/releases/download/v1.0/VMware.vSphereDSC.zip' -OutFile $env : userprofile \ Downloads \ VMware . vSphereDSC . zip # 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 \ WindowsPowerShell \ Modules ” -Name 'VMware.vSphereDSC' -Type Directory # Expand the downloaded zip file containing the VMware.vSphereDSC module into the prior directory Expand-Archive -Path $env : USERPROFILE \ Downloads \ VMware . vSphereDSC . zip -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 1 Import-Module -Name VMware . vSphereDSC

We can also verify the DSC resources we have available:

Get-DscResource -Module VMware.vSphereDSC 1 Get-DscResource -Module VMware . vSphereDSC

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 1 winrm quickconfig

In my environment, this system already had WinRM setup so I received the following message:



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 Server Server Host Name User ESXi host username Password ESXi host password Setting NtpServer NTP server/s the host will use 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 1 2 3 4 5 6 7 8 9 10 # 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:



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

Test-DscConfiguration -ComputerName localhost -Path .\VMHostNtpSettings_Config\ 1 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:



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 1 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:

Get-DscConfiguration 1 Get-DscConfiguration

Again, I’ve added a second PowerShell session to show the current status of the host:



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}} 1 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.

Summary

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!

Check out the Desired State Configuration Resources for VMware on GitHub and let us know what you’re looking forward to using DSC on most in your vSphere environment!