Search code examples
azuredeploymentazure-powershelldsc

Use custom, composite resource with Azure DSC extension


I have a VM template that deploys a DSC extension. It's been working fine but my configuration is growing so I've refactored it to use a composite resource and republished it to blob storage with Publish-AzureRmVMDscConfiguration.

I verified that the .ps1.zip file in blob storage contains my custom module and that the module is listed under dscmetadata.json. However, when I deploy, the DSC extension fails. The logs under C:\WindowsAzure\Logs\Plugins\Microsoft.Powershell.DSC\2.17.0.0 reveal the reason:

C:\Packages\Plugins\Microsoft.Powershell.DSC\2.17.0.0\bin..\DSCWork\AppServerDev.ps1.0\AppserverDev.ps1

PSDesiredStateConfiguration\node : The module 'xCustomResource' could not be loaded. For more information, run 'Import-Module xCustomResource'.

At C:\Packages\Plugins\Microsoft.Powershell.DSC\2.17.0.0\DSCWork\AppServerDev.ps1.0\AppserverDev.ps1:9 char:3

  • node "localhost"
  • ~~~~
    • CategoryInfo : ObjectNotFound: (xCustomResource\xCustomResource:String) [PSDesiredStateConfiguration\node], ParentContainsErrorRecordException
    • FullyQualifiedErrorId : CouldNotAutoLoadModule,PSDesiredStateConfiguration\node

Here are the relevant bits of my configuration file:

configuration AppServerDev
{
    param($environment)
    Import-DscResource -ModuleName 'PSDesiredStateConfiguration'
    Import-DscResource -ModuleName 'SaaSModule'

    node "localhost"
    {
        LocalConfigurationManager
        {
            RebootNodeIfNeeded = $true
            ConfigurationMode = "ApplyAndAutoCorrect"
            ConfigurationModeFrequencyMins = 1440
        }
        xDCTPlatformVM VM {
            OctopusParametersFile = $environment
            ChocolateyPackages = @(
                'googlechrome',
                'notepadplusplus',
                '7zip',
                'microsoftwse',
                'octopusdeploy.tentacle',
                'sqlserver-cmdlineutils'
                )
        }
    }
}

Running Get-Module -ListAvailable reveals that DankModule is found and I can, from powershell, run Import-Module DankModule and it works as expected. I assume the confusion is coming from it trying to import xCustomResource rather than DankModule but my .ps1 file under C:\Packages\Plugins\Microsoft.Powershell.DSC\2.17.0.0\DSCWork says

Import-Module "DankModule"

and not

Import-Module "xCustomType"

Why is it trying to import xCustomType rather than DankModule? How do I make it find DankModule which is available and contains xCustomType?

UPDATE: Get-Module -ListAvailable shows DankModule is installed but Get-DSCResource -Module DankModule doesn't return anything.


Solution

  • I'm not sure but I think this is a rookie mistake on my part because I have no experience building powershell modules. I was using this page as well as this one to construct my module and I'd gotten a valid module file by using New-ModuleManifest, I had the correct file structure mentioned in both of them e.g.

    C:\Program Files\WindowsPowerShell\Modules\
    
    DankModule
        DankModule.psd1
        DankModule.psm1
        DSCResources
            xCustomResource
                xCustomResource.psd1
                    RootModule = ‘xCustomResource.schema.psm1'
                xCustomResource.schema.psm1
                    Configuration, no Node block
    

    but I didn't realize I had some tweaking left. I needed to correct the RootModule property in DankModule.psd1 to look like this:

    RootModule = 'C:\Program Files\WindowsPowerShell\Modules\DankModule\DankModule.psm1'
    

    And also needed to add to my blank DankModule.psm1 a line referencing my xCustomResource.schema.psm1 equivalent:

    . .\DSCResources\xCustomResource\xCustomResource.schema.psm1
    

    That is the only line in my module-level .psm1 file and everything is now working. I also, at one point, removed all the \0s from both my .psd1 files but now I'm not sure if that was strictly necessary.