This is the third part of the Series on Desired State Configuration. In this part we will look at how to create a configuration and push the same to the target servers. In the part, we will look at steps for bringing a target server to the expected state using the configuration.
We will use the same configuration that we created during the first part of the series. For sake of recalling, adding the same Configuration script below.
In the above Configuration script, I have the top level Configuration element named “EnableFeatures”. Within this parent node, I have two nodes namely “WIN-PETR4TD7LAA” and “SCR2i”. These are the two servers which I want bring them into expected state i.e. to enable “Web-Server” feature on “WIN-PETR4TD7LAA” and “XPS-Viewer” on “SCR2i”. Above within the server nodes we have resource type “WindowsFeature” named “web-server” and “XPS”. These names could be any name that logically identifies it. Name within the resource reflects the name of the resource that we want to either add/remove from the environment or change its existing state if already added. “Ensure” reflects whether the resource should be installed or uninstalled depending on its value i.e. “Present” or “Absent”.
I would reflect the initial state of both the server with regard to their windows features and Roles.
Within the above Configuration, Server WIN-PETR4TD7LAA should have “Web-Server” Feature/Role available as its desired state and Server SCR2i should have “XPS-Viewer” Feature/Role removed from the server if it is already available.
Below is the screenshot for the server “WIN-PETR4TD7LAA” where Web Server is not installed
And the screenshot for the server “SCR2i” where XPS-Viewer is already installed.
So far we were looking at the environment that needs to adhere to the expected Configuration and also looked at the Configuration that needs to be reflected on the target servers. Now, we will look at steps to make the magic happens i.e. to run the configuration on individual target servers and change their state based on the configuration.
Step 1: Create the Configuration File.
We have already created this step and do not need to do it again. We will use the above Configuration file.
Step 2: Save the Configuration File to an appropriate location on file system.
Within Powershell ISE, while the configuration script is visible, select Menu-> Save as and save the configuration as ps1 file on file system. In my case, I have stored the file at “C:\“.
Step 3: dot-source ps1 file and load it in current session.
This step will enable to load the Test.ps1 file and keep in its scope the configuration data and function. If we do not dot-source it, the configuration would be loaded and unloaded immediately and would not be available to use in subsequent steps.
Step 4: Execute the Configuration
In last step we loaded the file containing the configuration script “EnableFeatures”. In this step, we will execute the same configuration “EnableFeatures” to generate the Management Object Format (MOF) files one for each server.
Executing a Configuration is similar to executing a cmdlet or calling a function. Just call it by its name!
Executing the Configuration would result in creating of one MOF file for each server containing all of its related resource types and configuration like name, ensure etc. These MOF Files would be generated within a folder created by executing the above configuration. The name of the folder is same of that of the configuration.
Step 5: Push the Configuration to the target server and execute
Start-DscConfiguration is a Powershell cmdlet provided by the Desired State Configuration module installed with Powershell 4.0. This Cmdlet is responsible for pushing the configuration to the target machines.
-wait lets the Powershell host wait until the cmdlet has finished executing
-verbose provides detailed actions executed by desired state configuration engine.
-force is self-explanatory.
Below is the screenshot while DSC Engine is bringing the target machine according to its configuration file.
And below is the verbose output while executing the configuration through Start-DscConfiguration.
Now, let’s check the result of executing the configuration.
Note: If you have different servers in your configuration either you can use the credentials property of individual resource or use the credential property of Start-DscConfiguration to run the configuration remotely.
In the next part, we will look into the anatomy of creating a new DSC resources.