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