Oddělení konfiguračních dat od dat prostředí

Platí pro: Windows PowerShell 4.0, Windows PowerShell 5.0

Může být užitečné oddělit data používaná v konfiguraci DSC od samotné konfigurace pomocí konfiguračních dat. Tímto způsobem můžete použít jednu konfiguraci pro více prostředí.

Pokud například vyvíjíte aplikaci, můžete použít jednu konfiguraci pro vývojové i produkční prostředí a pomocí konfiguračních dat určit data pro každé prostředí.

Co jsou konfigurační data?

Konfigurační data jsou data, která jsou definovaná v zatřiďovací tabulce a předávají se konfiguraci DSC při kompilaci této konfigurace.

Podrobný popis zatřiďovací tabulky ConfigurationData najdete v tématu Použití konfiguračních dat.

Jednoduchý příklad

Pojďme se podívat na velmi jednoduchý příklad, abychom viděli, jak to funguje. Vytvoříme jednu konfiguraci, která zajistí přítomnost služby IIS na některých uzlech a hyper-V na jiných:

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

Poslední řádek v tomto skriptu zkompiluje konfiguraci a předává $MyData jako hodnotu Parametr ConfigurationData .

Výsledkem je vytvoření dvou souborů MOF:

    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 určuje dva různé uzly, každý s vlastními NodeName uzly a Role. Konfigurace dynamicky vytváří bloky Node tak, že převezme kolekci uzlů, $AllNodesze $MyData které získá (konkrétně ), a filtruje ji podle Role vlastnosti .

Použití konfiguračních dat k definování vývojového a produkčního prostředí

Podívejme se na úplný příklad, který používá jednu konfiguraci k nastavení vývojového i produkčního prostředí webu. Ve vývojovém prostředí se služba IIS i SQL Server instalují na jeden uzel. V produkčním prostředí se služba IIS a SQL Server instalují na samostatné uzly. K určení dat pro dvě různá prostředí použijeme soubor konfiguračních dat .psd1.

Soubor konfiguračních dat

Data vývojového a produkčního prostředí definujeme v souboru s následujícím názvem 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\"
        }
    )
}

Soubor konfiguračního skriptu

Teď v konfiguraci, která je definovaná .ps1 v souboru, filtrujeme uzly, které jsme definovali DevProdEnvData.psd1 podle jejich role (MSSQL, Devnebo obojí) a odpovídajícím způsobem je nakonfigurujeme. Vývojové prostředí má SQL Server i službu IIS na jednom uzlu, zatímco produkční prostředí je má na dvou různých uzlech. Obsah webu se také liší podle vlastností SiteContents .

Na konci konfiguračního skriptu zavoláme konfiguraci (zkompilujeme ji do dokumentu MOF) a předáme DevProdEnvData.psd1 ji jako $ConfigurationData parametr .

Poznámka: Tato konfigurace vyžaduje, aby byly na cílovém uzlu nainstalované moduly xSqlPs a xWebAdministration .

Pojďme definovat konfiguraci v souboru s názvem 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

Při spuštění této konfigurace se vytvoří tři soubory MOF (jeden pro každou pojmenovanou položku v poli AllNodes ):

    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

Použití dat mimo uzly

Do zatřiďovací tabulky ConfigurationData můžete přidat další klíče pro data, která nejsou specifická pro uzel. Následující konfigurace zajistí přítomnost dvou webů. Data pro každý web jsou definována v poli AllNodes . Soubor Config.xml se používá pro oba weby, proto ho definujeme v dalším klíči s názvem NonNodeData. Mějte na paměti, že můžete mít tolik dalších klíčů, kolik chcete, a můžete je pojmenovat podle potřeby. NonNodeData není rezervované slovo, je to právě to, co jsme se rozhodli pojmenovat další klíč.

K dalším klíčům se dostanete pomocí speciální proměnné $ConfigurationData. V tomto příkladu ConfigFileContents se k němu přistupuje pomocí řádku :

 Contents = $ConfigurationData.NonNodeData.ConfigFileContents

v File bloku prostředků.

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

Viz také