Dsc Tooling DevOpsGuys

Tagged: 

This topic contains 8 replies, has 3 voices, and was last updated by Profile photo of Dave Wyatt Dave Wyatt 2 years, 1 month ago.

  • Author
    Posts
  • #19667
    Profile photo of Selimir Kesten
    Selimir Kesten
    Participant

    Hi,

    i am trying to use the modified DSC Tools from DevOpsGuys and have tried the SampleBuild.ps1 (https://github.com/devopsguys/DSC/tree/development)

    My current folder structure looks like this:

    C:\DSC-development>tree
    Folder PATH listing
    Volume serial number is CA45-B0D3
    C:.
    ├───DSC_Configuration
    │   ├───AllNodes
    │   ├───Applications
    │   ├───Credentials
    │   ├───Services
    │   └───SiteData
    ├───DSC_Resources
    └───DSC_Tooling
        ├───cDscDiagnostics
        ├───cDscResourceDesigner
        ├───dscbuild
        ├───DscConfiguration
        ├───DscDevelopment
        ├───DscOperations
        └───Pester
            ├───bin
            ├───en-US
            ├───Examples
            │   ├───Calculator
            │   └───Validator
            ├───Functions
            │   └───Assertions
            ├───ObjectAdaptations
            ├───templates
            └───vendor
                └───tools
    

    SampleBuild.ps1 is located at C:\DSC-development

    end
    {
    	$PSScriptRoot
    	
        Import-Module Pester -ErrorAction Stop
        Import-Module dscbuild -ErrorAction Stop
        Import-Module dscconfiguration -ErrorAction Stop
    
        $params = @{
            WorkingDirectory = (Get-TempDirectory).FullName
            SourceResourceDirectory = "$PSScriptRoot\DSC_Resources"
            SourceToolDirectory = "$PSScriptRoot\DSC_Tooling"
            DestinationRootDirectory = 'C:\Program Files\WindowsPowerShell\DscService'
            DestinationToolDirectory = $env:TEMP
            ConfigurationData = Get-DscConfigurationData -Path .\DSC_Configuration -Force
            ConfigurationModuleName = 'SampleConfiguration'
            ConfigurationName = 'SampleConfiguration'
            Configuration = $true
            Resource = $true
        }
    
        Invoke-DscBuild @params
    }
    
    begin
    {
        function Get-TempDirectory
        {
            [CmdletBinding()]
            [OutputType([System.IO.DirectoryInfo])]
            param ( )
    
            do
            {
                $tempDir = Join-Path -Path ([System.IO.Path]::GetTempPath()) -ChildPath ([System.IO.Path]::GetRandomFileName())
            }
            until (-not (Test-Path -Path $tempDir -PathType Container))
    
            return New-Item -Path $tempDir -ItemType Directory -ErrorAction Stop
        }
    }
    

    When i run it i get the following message:
    Import-Module : The specified module 'Pester' was not loaded because no valid module file was found in any module directory.

    I am using Powershell v4 on Windows 2008 R2. Do i need to change provide the full path to the modules or am i missing something?`

    Do i need to manually copy Pester,dscbuild,dscconfiguration to "C:\Program Files\WindowsPowerShell\Modules"

    Thanks

  • #19668
    Profile photo of Don Jones
    Don Jones
    Keymaster

    On target nodes, DSC resources need to be installed in one of the folders listed in PSModulePath, usually C:\Program Files\WindowsPowerShell\Modules. However, given the folder hierarchy you've shown, I don't know what you'd copy. A DSC resource module must have at least a root .PSM1 file, and then a DSCResources subfolder, which I don't see anywhere.

    Have you considered contacting the authors?

  • #19669
    Profile photo of Selimir Kesten
    Selimir Kesten
    Participant

    Hi Don,

    i hope that Dave Wyatt will answer this 🙂

    Thanks

  • #19671
    Profile photo of Dave Wyatt
    Dave Wyatt
    Moderator

    Everything that's in your DSC_Tooling folder should exist in your PSModulePath (probably \Program Files\WindowsPowershell\Modules' ) before you run Invoke-DscBuild. You would also need the SampleConfiguration module from the Tooling\Examples\ folder of the DSC repository in that location as well.

    If you want to actually execute the sample build, you will need the StackExchangeResources, cWebAdministration and cSmbShare modules; those should be placed into your DSC_Resources folder, which will cause the Invoke-DscBuild command to test them and to produce zip files / checksums for them.

    When we set up the TeamCity pipeline for DevOpsGuys, we created two steps. One was to install the dependencies (tooling modules, Pester, certificates needed for credentials encryption), and the second was to actually run Invoke-DscBuild. That first "install dependencies" step isn't part of the DSC repo's examples yet, but I'll ask if it's okay to share that as well.

  • #19672
    Profile photo of Dave Wyatt
    Dave Wyatt
    Moderator

    On a side note, I haven't really used the DSC_Tooling portion of Invoke-DscBuild yet, and I'm not sure what Steve's use case for that was. I've been meaning to ask. It seems like a bit of a "chicken or egg" situation, since you need many of the tooling modules before you can run Invoke-DscBuild. That's why we created a separate "Install Dependencies" step in TeamCity.

  • #19693
    Profile photo of Selimir Kesten
    Selimir Kesten
    Participant

    Hi Dave,

    thanks now it works so far. I have a small problem or found a bug in DscConfiguration.psm1

    param
    (
        [string]
        $ConfigurationDataPath,
        [string]
        $LocalCertificateThumbprint = $null
    )
    Write-Warning "$($LocalCertificateThumbprint -eq $null)"
    if ($null -eq $LocalCertificateThumbprint )
    {
        try
        {
            $LocalCertificateThumbprint = "$((Get-DscLocalConfigurationManager).CertificateId)"
        }
        catch { }
    }
    

    Result is:
    WARNING: False

    So it never comes to this: $LocalCertificateThumbprint = "$((Get-DscLocalConfigurationManager).CertificateId)"

    if i change this:

    if ($null -eq $LocalCertificateThumbprint )
    {
    ...
    }
    

    to this:

    if (!$LocalCertificateThumbprint )
    {
    ...
    }
    

    then it works to get the LocalCertificateThumbprint otherwise it is always empty.

    Thanks

  • #19698
    Profile photo of Dave Wyatt
    Dave Wyatt
    Moderator

    Whoops, good catch. PowerShell converts $null to an empty string; that's a common gotcha.

    I think it's probably a good idea to get rid of the arguments to the module itself; most people don't even realize they're there, and auto-loading the module misses that point anyway. That parameter would be more discoverable and intuitive in the commands that need to use the certificate. (You can already control the ConfigurationDataPath that way.)

  • #19701
    Profile photo of Selimir Kesten
    Selimir Kesten
    Participant

    Yeas maybe this would be a good idea.

    I have seen your example and would like to know the purpose of Roles like "BaseServer","WebServer" for further use?

    @{
        Nodes = 'WebServer02'
        Roles = 'WebServer', 'BaseServer'
    
        BaseServerSettings = @{
            PowerPlan = 'High Performance'
        }
    ....
    

    Are the examples finished? Or is the "BaseServer" part missing?

    Thanks
    Selimir

  • #19706
    Profile photo of Dave Wyatt
    Dave Wyatt
    Moderator

    That's old stuff I forgot to remove. You no longer need a Roles key in your service hashtables. Will update that now.

You must be logged in to reply to this topic.