Skip to content

Using Composite Resources

PowerShell Desired State Configuration (DSC) composite resources allow you to encapsulate multiple DSC resources into a single reusable resource, simplifying complex configurations. By combining existing resources (e.g., File, Registry, or Service) into a custom resource, you can abstract logic, reduce redundancy, and improve maintainability. This section explains how to integrate composite resources into DSC configurations to manage multi-step deployments efficiently.


Creating a Composite Resource

A composite resource is defined using the Configuration keyword and can include any valid DSC resource. For example, a WebServer composite resource might combine WindowsFeature, File, and Registry resources to configure IIS:

Configuration WebServerResource {
    param (
        [string]$WebsiteName = "DefaultWebSite",
        [string]$PhysicalPath = "C:\inetpub\wwwroot"
    )

    Import-DscResource -ModuleName PSDesiredStateConfiguration

    Node localhost {
        WindowsFeature IIS {
            Name = "Web-Server"
            Ensure = "Present"
        }

        File WebsiteContent {
            DestinationPath = $PhysicalPath
            Contents = "<html><body><h1>$WebsiteName</h1></body></html>"
            Ensure = "Present"
        }

        Registry WebsiteRegistry {
            Key = "HKLM:\Software\MyWebServer"
            ValueName = "SiteName"
            ValueData = $WebsiteName
            Ensure = "Present"
        }
    }
}

This resource ensures IIS is installed, creates a basic HTML file, and sets a registry value. The parameters (WebsiteName, PhysicalPath) allow customization.


Using Composite Resources in Configurations

To use a composite resource in a configuration, first compile it into a module or save it as a .ps1 file. Then, import it and call it like any other DSC resource. For example:

# Compile the composite resource
WebServerResource -WebsiteName "MyAppSite" -PhysicalPath "C:\AppContent" -OutputPath .\WebServerResource.mof

# Use the composite resource in another configuration
Configuration MyWebServerConfig {
    Import-DscResource -ModuleName WebServerResourceModule

    Node localhost {
        WebServerResource WebServer {
            WebsiteName = "MyAppSite"
            PhysicalPath = "C:\AppContent"
        }
    }
}

MyWebServerConfig -OutputPath .\MyWebServerConfig.mof

In this example, the WebServerResource is reused to configure a custom web server. The composite resource handles internal dependencies, reducing boilerplate code.


Best Practices

  • Encapsulate logic: Group related resources (e.g., installing software, configuring services, setting permissions) into a single resource.
  • Parameterize inputs: Use parameters to make the composite resource flexible and reusable across different environments.
  • Test thoroughly: Validate the composite resource in isolation before integrating it into larger configurations.
  • Version control: Track changes to composite resources to ensure compatibility with dependent configurations.

Key takeaways

  • Composite resources simplify complex DSC configurations by bundling multiple resources into a single, reusable unit.
  • They improve maintainability by abstracting logic and reducing redundancy.
  • Parameters allow customization, making composite resources adaptable to different deployment scenarios.
  • Always test composite resources in isolation to ensure reliability in production environments.