Dela via


Avgränsa konfigurations- och miljödata

Gäller för: Windows PowerShell 4.0, Windows PowerShell 5.0

Det kan vara användbart att separera data som används i en DSC-konfiguration från själva konfigurationen med hjälp av konfigurationsdata. På så sätt kan du använda en enda konfiguration för flera miljöer.

Om du till exempel utvecklar ett program kan du använda en konfiguration för både utvecklings- och produktionsmiljöer och använda konfigurationsdata för att ange data för varje miljö.

Vad är konfigurationsdata?

Konfigurationsdata är data som definieras i en hash-tabell och skickas till en DSC-konfiguration när du kompilerar den konfigurationen.

En detaljerad beskrivning av ConfigurationData-hashtabellen finns i Använda konfigurationsdata.

Ett enkelt exempel

Nu ska vi titta på ett mycket enkelt exempel för att se hur det fungerar. Vi skapar en enda konfiguration som säkerställer att IIS finns på vissa noder och att Hyper-V finns på andra:

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

Den sista raden i det här skriptet kompilerar konfigurationen och skickas $MyData som värdet ConfigurationData-parameter .

Resultatet är att två MOF-filer skapas:

    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

$MyData anger två olika noder, var och en med egna NodeName och Role. Konfigurationen skapar dynamiskt Nodblock genom att ta den samling noder som den hämtar från $MyData (specifikt $AllNodes) och filtrerar samlingen mot Role egenskapen..

Använda konfigurationsdata för att definiera utvecklings- och produktionsmiljöer

Nu ska vi titta på ett fullständigt exempel som använder en enda konfiguration för att konfigurera både utvecklings- och produktionsmiljöer för en webbplats. I utvecklingsmiljön installeras både IIS och SQL Server på en enda nod. I produktionsmiljön installeras IIS och SQL Server på separata noder. Vi använder en .psd1-fil för konfigurationsdata för att ange data för de två olika miljöerna.

Konfigurationsdatafil

Vi definierar utvecklings- och produktionsmiljödata i en fil med namnet DevProdEnvData.psd1 enligt följande:

@{

    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\"
        }
    )
}

Konfigurationsskriptfil

I konfigurationen, som definieras i en .ps1 fil, filtrerar vi nu de noder som vi definierade i DevProdEnvData.psd1 efter deras roll (MSSQL, Dev, eller båda) och konfigurerar dem därefter. Utvecklingsmiljön har både SQL Server och IIS på en nod, medan produktionsmiljön har dem på två olika noder. Webbplatsinnehållet skiljer sig också, enligt SiteContents egenskaperna.

I slutet av konfigurationsskriptet anropar vi konfigurationen (kompilerar den till ett MOF-dokument) och skickar DevProdEnvData.psd1 den som parameter.$ConfigurationData

Observera: Den här konfigurationen kräver att modulerna xSqlPs och xWebAdministration installeras på målnoden.

Nu ska vi definiera konfigurationen i en fil med namnet 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

När du kör den här konfigurationen skapas tre MOF-filer (en för varje namngiven post i AllNodes-matrisen ):

    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

Använda icke-noddata

Du kan lägga till ytterligare nycklar i ConfigurationData-hashtabellen för data som inte är specifika för en nod. Följande konfiguration säkerställer förekomsten av två webbplatser. Data för varje webbplats definieras i matrisen AllNodes . Filen Config.xml används för båda webbplatserna, så vi definierar den i en ytterligare nyckel med namnet NonNodeData. Observera att du kan ha så många ytterligare nycklar som du vill, och du kan ge dem vad du vill. NonNodeData är inte ett reserverat ord, det är precis vad vi bestämde oss för att namnge den extra nyckeln.

Du kommer åt ytterligare nycklar med hjälp av specialvariabeln $ConfigurationData. I det här exemplet ConfigFileContents nås med raden :

 Contents = $ConfigurationData.NonNodeData.ConfigFileContents

i resursblocket File .

$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
        }
    }
}

Se även