Here I am going to walkthrough a configuration that uses a number of the built in DSC resources to apply a configuration.
First, I want to back up a bit and mention a concept. If you read through many of the blog posts and TechNet documents out there all of the examples you see you could easily describe as being installation focused. Or only making changes to the system that one would do when installing something. And this observation is correct. DSC is still in that v1 state at this writing which means that folks are getting used to it, using it, extending it. And frankly talking about installation actions is relatively easy.
One thing I want to mention now is that anyone can build a Custom Resource. And if you want to configure an application, this is the way to go. Put all of your complex logic into that custom resource. Or, wait for the software vendor to write that custom resource so you can use it. And you may need to ask them to do that for you to get the ball rolling. There is nothing that says that DSC cannot be used to configure the applications that it also installs in a previous step. We will get closer to that later on.
Back to this example, installing a Citrix License Server using DSC resources.
Before we get into my example I want to mention a couple things:
- In my setup I am using the full XenDesktop media ISO as a ZIP archive and I am hosing it on an HTTP endpoint (IIS Server). This is an internally hosted, isolated, and unsecured endpoint - it is strictly an example to demonstrate different resources and possibilities. In other words, please learn from the example but please "don't do this at home".
- Also, I am not demonstrating any commands that are not already documented in Citrix eDocs nor the DSC documentation in TechNet. You need to read those sources for the definitive and current documentation.
Here is the configuration script sample:
Lets start to work through this example.
On line 3 is something new; Import-DscResource. This is now modules are invoked when they are not shipped as part of the operating system. Prior to being able to apply this configuration the module xPSDesiredStateConfiguration must be in the PowerShell path. If you observe the behavior of a Pull configuration you will notice that it uses the path "%programfiles%\WindowsPowerShell\Modules" - and because of that I tend to use that one myself. More on custom resources later.
On lines 7 - 12 you see the [File]citrixFolder resource that I have been showing in the previous articles.
On lines 14 - 31 is something new as well. The Script resource.
This is a utility resource that fills a gap when there is no other resource available to perform your actions. When you use the Script resource you essentially write a mini custom resource - it has all the same base requirements of a custom resource provider.
In this case I am using the web client to download the XenDesktop media to the %programdata% path I defined with [File]citrixFolder. You might also notice that there is a dependency on that previous resource to ensure that the path exists prior to downloading.
Lines 33 - 39 use the Archive resource. Here I define the path where I know the ZIP exists (previous dependency), and the destination I want it extracted to.
If you run the -Verbose switch when applying this configuration you will notice some interesting behavior with this provider. The archive provider actually opens the ZIP, reads every file and tests the destination for the existence of the file. If a file exists, it is not extracted, if it does not exist it is extracted. This is just a bit of insight into the thinking around how desired state works and what it means to apply a configuration.
Lines 41 - 50 use the Package resource. This resource is used to install or uninstall packages. It is centric to MSI packages but it can also be used with EXE packages. The installer must support silent installation. Also, as you can see I left the ProductId empty - that is a property of MSI packages so I had to define it this way.
Lines 52 - 57 are the reason for the Import-DscResource. Within that module is the provider xRemoteFile. This resource allows me to use a URI as the source. I defined the source file and my destination - and this places my license file right where my license server default path is. Ready to go!
Why didn't I use this in place of the script extension? Good question. It is because the file I am downloading using the script resource is too large and the download fails at 1.7 Gb in a very reliable way (it is actually a very old bug).
That is it. The hardest part is getting the infrastructure working to get the media and files delivered.
But quite honestly, MSFT is working on that problem. Have you heard of OneGet or PSGet? OneGet is all about packages, packages that could be used by DSC. PSGet is about PowerShell modules. And, you can set up your own internal version if you don't trust the public repositories. But the nifty thing is this; ISVs can publish their packages to OneGet - and then their customer just points to it and before you know it that application is downloaded and installed. Really nifty delivery method - almost like yum for Windows.