Configuratie- en omgevingsgegevens scheiden

Van toepassing op: Windows PowerShell 4.0, Windows PowerShell 5.0

Het kan nuttig zijn om de gegevens die in een DSC-configuratie worden gebruikt, te scheiden van de configuratie zelf door gebruik te maken van configuratiegegevens. Door dit te doen, kunt u een enkele configuratie gebruiken voor meerdere omgevingen.

Als u bijvoorbeeld een toepassing ontwikkelt, kunt u één configuratie gebruiken voor zowel ontwikkelings- als productieomgevingen en configuratiegegevens gebruiken om gegevens voor elke omgeving op te geven.

Wat zijn configuratiegegevens?

Configuratiegegevens zijn gegevens die zijn gedefinieerd in een hashtabel en worden doorgegeven aan een DSC-configuratie wanneer u die configuratie compileert.

Zie Configuratiegegevens gebruiken voor een gedetailleerde beschrijving van de hashtabel ConfigurationData.

Een eenvoudig voorbeeld

Laten we eens kijken naar een heel eenvoudig voorbeeld om te zien hoe dit werkt. We maken één configuratie die ervoor zorgt dat IIS aanwezig is op sommige knooppunten en dat Hyper-V aanwezig is op andere:

Configuration MyDscConfiguration {

  Node $AllNodes.Where{$_.Role -eq "WebServer"}.NodeName
    {
  WindowsFeature IISInstall {
    Ensure = 'Present'
    Name   = 'Web-Server'
  }

 }
    Node $AllNodes.Where{$_.Role -eq "VMHost"}.NodeName
    {
        WindowsFeature HyperVInstall {
            Ensure = 'Present'
            Name   = 'Hyper-V'
        }
    }
}

$MyData =
@{
    AllNodes =
    @(
        @{
            NodeName    = 'VM-1'
            Role = 'WebServer'
        },

        @{
            NodeName    = 'VM-2'
            Role = 'VMHost'
        }
    )
}

MyDscConfiguration -ConfigurationData $MyData

De laatste regel in dit script compileert de configuratie en geeft $MyData door als de waarde ConfigurationData parameter.

Het resultaat is dat er twee MOF-bestanden worden gemaakt:

    Directory: C:\DscTests\MyDscConfiguration


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        3/31/2017   5:09 PM           1968 VM-1.mof
-a----        3/31/2017   5:09 PM           1970 VM-2.mof

$MyDataSpecificeert twee verschillende knooppunten, elk met zijn eigen NodeName en .Role De configuratie maakt dynamisch knooppuntblokken door de verzameling knooppunten te nemen waar het vandaan komt (specifiek $MyData , $AllNodes) en filtert die verzameling op de Role eigenschap.

Configuratiegegevens gebruiken om ontwikkelings- en productieomgevingen te definiëren

Laten we eens kijken naar een compleet voorbeeld dat een enkele configuratie gebruikt om zowel de ontwikkelings- als de productieomgeving van een website op te zetten. In de ontwikkelomgeving worden zowel IIS als SQL Server op één knooppunt geïnstalleerd. In de productieomgeving worden IIS en SQL Server op afzonderlijke nodes geïnstalleerd. We gebruiken een .psd1-bestand met configuratiegegevens om de gegevens voor de twee verschillende omgevingen op te geven.

Gegevensbestand configuratie

We definiëren de gegevens van de ontwikkelings- en productieomgeving in een bestand met de volgende naam DevProdEnvData.psd1 :

@{

    AllNodes = @(

        @{
            NodeName        = "*"
            SQLServerName   = "MySQLServer"
            SqlSource       = "C:\Software\Sql"
            DotNetSrc       = "C:\Software\sxs"
            WebSiteName     = "New website"
        },

        @{
            NodeName        = "Prod-SQL"
            Role            = "MSSQL"
        },

        @{
            NodeName        = "Prod-IIS"
            Role            = "Web"
            SiteContents    = "C:\Website\Prod\SiteContents\"
            SitePath        = "\\Prod-IIS\Website\"
        },

        @{
            NodeName         = "Dev"
            Role             = "MSSQL", "Web"
            SiteContents     = "C:\Website\Dev\SiteContents\"
            SitePath         = "\\Dev\Website\"
        }
    )
}

Configuratie script bestand

Nu, in de configuratie, die is gedefinieerd in een .ps1 bestand, filteren we de knooppunten waarin DevProdEnvData.psd1 we hebben gedefinieerd op hun rol (MSSQL, Dev, of beide) en configureren we ze dienovereenkomstig. De ontwikkelomgeving heeft zowel de SQL Server als IIS op één knooppunt, terwijl de productieomgeving ze op twee verschillende knooppunten heeft. De inhoud van de site is ook anders, zoals aangegeven door de SiteContents eigenschappen.

Aan het einde van het configuratiescript roepen we de configuratie aan (compileer het in een MOF-document), waarbij DevProdEnvData.psd1 we doorgaan als de $ConfigurationData parameter.

Notitie: Deze configuratie vereist dat de modules xSqlPsxWebAdministration worden geïnstalleerd op het doelknooppunt.

Laten we de configuratie definiëren in een bestand met de naam MyWebApp.ps1:

Configuration MyWebApp
{
    Import-DSCResource -ModuleName PSDesiredStateConfiguration
    Import-DSCResource -ModuleName xSqlPs
    Import-DSCResource -ModuleName xWebAdministration

    Node $AllNodes.Where{$_.Role -contains "MSSQL"}.NodeName
   {
        # Install prerequisites
        WindowsFeature installdotNet35
        {
            Ensure      = "Present"
            Name        = "Net-Framework-Core"
            Source      = "c:\software\sxs"
        }

        # Install SQL Server
        xSqlServerInstall InstallSqlServer
        {
            InstanceName = $Node.SQLServerName
            SourcePath   = $Node.SqlSource
            Features     = "SQLEngine,SSMS"
            DependsOn    = "[WindowsFeature]installdotNet35"

        }
   }

   Node $AllNodes.Where{$_.Role -contains "Web"}.NodeName
   {
        # Install the IIS role
        WindowsFeature IIS
        {
            Ensure       = 'Present'
            Name         = 'Web-Server'
        }

        # Install the ASP .NET 4.5 role
        WindowsFeature AspNet45
        {
            Ensure       = 'Present'
            Name         = 'Web-Asp-Net45'

        }

        # Stop the default website
        xWebsite DefaultSite
        {
            Ensure       = 'Present'
            Name         = 'Default Web Site'
            State        = 'Stopped'
            PhysicalPath = 'C:\inetpub\wwwroot'
            DependsOn    = '[WindowsFeature]IIS'

        }

        # Copy the website content
        File WebContent

        {
            Ensure          = 'Present'
            SourcePath      = $Node.SiteContents
            DestinationPath = $Node.SitePath
            Recurse         = $true
            Type            = 'Directory'
            DependsOn       = '[WindowsFeature]AspNet45'

        }


        # Create the new Website

        xWebsite NewWebsite

        {

            Ensure          = 'Present'
            Name            = $Node.WebSiteName
            State           = 'Started'
            PhysicalPath    = $Node.SitePath
            DependsOn       = '[File]WebContent'
        }

    }

}

MyWebApp -ConfigurationData DevProdEnvData.psd1

Wanneer u deze configuratie uitvoert, worden er drie MOF-bestanden gemaakt (één voor elke benoemde vermelding in de AllNodes-array ):

    Directory: C:\DscTests\MyWebApp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        3/31/2017   5:47 PM           2944 Prod-SQL.mof
-a----        3/31/2017   5:47 PM           6994 Dev.mof
-a----        3/31/2017   5:47 PM           5338 Prod-IIS.mof

Gegevens zonder knooppunt gebruiken

U kunt extra sleutels toevoegen aan de hashtabel ConfigurationData voor gegevens die niet specifiek zijn voor een knooppunt. De volgende configuratie zorgt voor de aanwezigheid van twee websites. Gegevens voor elke website worden gedefinieerd in de AllNodes-array . Het bestand Config.xml wordt voor beide websites gebruikt, dus we definiëren het in een extra sleutel met de naam NonNodeData. Houd er rekening mee dat u zoveel extra sleutels kunt hebben als u wilt, en dat u ze elke naam kunt geven die u wilt. NonNodeData is geen gereserveerd woord, het is gewoon wat we hebben besloten om de extra sleutel te noemen.

U krijgt toegang tot extra toetsen met behulp van de speciale variabele $ConfigurationData. In dit voorbeeld ConfigFileContents wordt benaderd met de regel:

 Contents = $ConfigurationData.NonNodeData.ConfigFileContents

in het File resourceblok.

$MyData =
@{
    AllNodes =
    @(
        @{
            NodeName           = "*"
            LogPath            = "C:\Logs"
        },

        @{
            NodeName = "VM-1"
            SiteContents = "C:\Site1"
            SiteName = "Website1"
        },


        @{
            NodeName = "VM-2"
            SiteContents = "C:\Site2"
            SiteName = "Website2"
        }
    );

    NonNodeData =
    @{
        ConfigFileContents = (Get-Content C:\Template\Config.xml)
     }
}

configuration WebsiteConfig
{
    Import-DscResource -ModuleName xWebAdministration -Name MSFT_xWebsite

    node $AllNodes.NodeName
    {
        xWebsite Site
        {
            Name         = $Node.SiteName
            PhysicalPath = $Node.SiteContents
            Ensure       = "Present"
        }

        File ConfigFile
        {
            DestinationPath = $Node.SiteContents + "\\config.xml"
            Contents = $ConfigurationData.NonNodeData.ConfigFileContents
        }
    }
}

Zie ook