PowerShell Desired State Configuration (DSC)
Although I have not blogged about PowerShell Desired State Configuration (DSC) very much, it has been my sole focus for the last several months. I have been doing Introduction to PowerShell DSC talks for customers and helping them get started with their DSC needs.
Composite Resources
One feature of DSC is something called composite resources. These are reusable configuration scripts that can act like DSC resources. See the PowerShell Team blog post here for the full explanation:
Reusing Existing Configuration Scripts in PowerShell Desired State Configuration
Like most people I need to try it myself before a new concept sinks in. So I went into my Azure lab and started playing with these. Right away I realized there has to be a faster way to set up a composite resource. Over on the PowerShell.org github you can find a script to do just this. But like most PowerShell enthusiasts I wanted to make my own version with a few extra bells and whistles, and that is what I am sharing with you today.
Composite Resource Structure
After reading the PowerShell team post linked above you will understand there is a specific file and folder structure required for composite resources. On your DSC configuration build server you will end up with something like this:
C:\Program Files\WindowsPowerShell\Modules\
- contosoCompositeResources
- contosoCompositeResources.psd1
- contosoCompositeResources.psm1
- DSCResources
- contosoResourceName1
- contosoResourceName1.psd1
- RootModule = ‘contosoResourceName1.schema.psm1'
- contosoResourceName1.schema.psm1
- Configuration, no Node block
- contosoResourceName1.psd1
- contosoResourceName2
- contosoResourceName2.psd1
- RootModule = ‘contosoResourceName2.schema.psm1'
- contosoResourceName2.schema.psm1
- Configuration, no Node block
- contosoResourceName2.psd1
- etc.
- contosoResourceName1
PowerShell is really good at creating folders and files, so automating this should be a piece of cake.
Automating the Template
I wanted the following features in my solution. Yes. I am lazy. I want a script to do it all for me.
- Create the folder structure
- Create the psd1 and schema.psm1 files
- Supply template text with the appropriate names filled in
- List the file structure output as confirmation
- Open the template files in the ISE
Call the function like this:
New-DSCCompositeResource`-ModuleNamecontosoCompositeResources`-ResourceNamecontosoBaseBuildCompositeResource
Optionally you can specify a -ModuleRoot parameter. It defaults to $Env:Program Files\WindowsPowerShell\Modules, which should be sufficient in most cases.
Run the script elevated so that it has permissions to write into $Env:Program Files\WindowsPowerShell\.
Your ISE will now show you the template for the composite resource:
ConfigurationcontosoBaseBuildCompositeResource{Param()### Insert composite resource code here### NOTE: Composite resources do not include a NODE block}
And your ISE will also show you a template for how to reference the composite resource in a configuration:
### Example configuration referencing the new composite resourceConfigurationaaaaaa{Import-DscResource-ModuleNamecontosoCompositeResourcesNodelocalhost{contosoBaseBuildCompositeResourcebbbbbb{#property = value}}}
These files are conveniently stored in the new folder structure where you can edit them in-place.
Pro Tips
When working with composite resources here are a couple tips to keep in mind:
- Develop a company naming convention and stick with it.
- The resourcename.schema.psm1 file looks like a typical DSC configuration without a node block. This code should be parameterized for all of the resources it contains.
- In your parent configuration that calls the composite resource there is no support for the DependsOn property of traditional DSC resources. This might impact your design.
- With any other DSC custom resource you would normally zip it up, create a checksum, and publish it to the pull server. In this case, you do not have to publish composite resources. They reference other DSC resources which are the ones that need to be published on the pull server. Composite resources are only used when you generate the configuration MOF.
Knowing these tips will save you some learning curve.
Download today’s script at the TechNet Script Gallery here.
Learn PowerShell DSC Today
Do you remember five years ago when people were telling you to start learning PowerShell? Did you? Don’t you wish you started learning PowerShell earlier? PowerShell DSC is the same way. Start learning it today before you get behind the curve. Here are a few links to get you started:
- WMF 4.0 Release Notes / Quick References
- WMF 5.0 Preview Release Notes
- PowerShell.org DSC eBook
- PowerShell Team Blog (Documenting DSC)
- TechNet
- Visual Studio ALM Rangers DSC eBook and posters
Share these links with your peers and start learning today!