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ů, $AllNodes
ze $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
, Dev
nebo 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
axWebAdministration
.
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
}
}
}