Configuratie- en omgevingsgegevens scheiden
Van toepassing op: Windows PowerShell 4.0, Windows PowerShell 5.0
Het kan handig zijn om de gegevens die in een DSC-configuratie worden gebruikt, te scheiden van de configuratie zelf met behulp van configuratiegegevens. Door dit te doen, kunt u één configuratie voor meerdere omgevingen gebruiken.
Als u bijvoorbeeld een toepassing ontwikkelt, kunt u één configuratie gebruiken voor zowel ontwikkel- 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
Met de laatste regel in dit script wordt de configuratie gecompileerd, waarbij de waarde ConfigurationData parameter wordt doorgegeven$MyData
.
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
$MyData
hiermee geeft u twee verschillende knooppunten op, elk met een eigen NodeName
en Role
. De configuratie maakt dynamisch knooppuntblokken door de verzameling knooppunten te nemen die afkomstig zijn van $MyData
(met name $AllNodes
) en die verzameling te filteren op basis van de Role
eigenschap..
Configuratiegegevens gebruiken om ontwikkel- en productieomgevingen te definiëren
Laten we eens kijken naar een volledig voorbeeld waarin één configuratie wordt gebruikt om zowel ontwikkel- als productieomgevingen van een website in te stellen. In de ontwikkelomgeving worden zowel IIS als SQL Server op één knooppunt geïnstalleerd. In de productieomgeving worden IIS en SQL Server op afzonderlijke knooppunten geïnstalleerd. We gebruiken een psd1-bestand met configuratiegegevens om de gegevens voor de twee verschillende omgevingen op te geven.
Configuratiegegevensbestand
We definiëren de gegevens van de ontwikkel- en productieomgeving als volgt in een bestand met de 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\"
}
)
}
Configuratiescriptbestand
Nu filteren we in de configuratie, die is gedefinieerd in een .ps1
bestand, de knooppunten waarin we hebben gedefinieerd op DevProdEnvData.psd1
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 verschilt ook, zoals opgegeven door de SiteContents
eigenschappen.
Aan het einde van het configuratiescript roepen we de configuratie aan (compileer deze in een MOF-document), waarbij we als parameter $ConfigurationData
doorgevenDevProdEnvData.psd1
.
Opmerking: Voor deze configuratie moeten de modules
xSqlPs
enxWebAdministration
op het doelknooppunt worden geïnstalleerd.
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-matrix ):
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
Niet-knooppuntgegevens 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 matrix AllNodes . Het bestand Config.xml
wordt gebruikt voor beide websites, 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 gewenste naam kunt geven. NonNodeData
is geen gereserveerd woord, het is precies wat we besloten om de extra sleutel te noemen.
U hebt toegang tot aanvullende sleutels met behulp van de speciale variabele $ConfigurationData. In dit voorbeeld ConfigFileContents
wordt geopend 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
}
}
}