Separar dados de configuração e de ambiente
Aplica-se a: Windows PowerShell 4.0, Windows PowerShell 5.0
Pode ser útil separar os dados utilizados numa configuração do DSC da própria configuração com dados de configuração. Ao fazê-lo, pode utilizar uma única configuração para vários ambientes.
Por exemplo, se estiver a desenvolver uma aplicação, pode utilizar uma configuração para ambientes de desenvolvimento e produção e utilizar dados de configuração para especificar dados para cada ambiente.
O que são os dados de configuração?
Os dados de configuração são dados definidos numa tabela hash e transmitidos para uma configuração do DSC quando compila essa configuração.
Para obter uma descrição detalhada da tabela hash ConfigurationData , veja Utilizar dados de configuração.
Um exemplo simples
Vejamos um exemplo muito simples para ver como isto funciona. Vamos criar uma única configuração que garante que o IIS está presente em alguns nós e que o Hyper-V está presente noutros:
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
A última linha neste script compila a configuração, passando $MyData
como o parâmetro ConfigurationData do valor.
O resultado é que são criados dois ficheiros 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
especifica dois nós diferentes, cada um com os seus próprios NodeName
e Role
. A configuração cria dinamicamente blocos de Nós ao tirar a coleção de nós de $MyData
onde obtém (especificamente, $AllNodes
) e filtra essa coleção na Role
propriedade..
Utilizar dados de configuração para definir ambientes de desenvolvimento e produção
Vejamos um exemplo completo que utiliza uma única configuração para configurar ambientes de desenvolvimento e produção de um site. No ambiente de desenvolvimento, tanto o IIS como o SQL Server são instalados num único nó. No ambiente de produção, o IIS e SQL Server são instalados em nós separados. Vamos utilizar um ficheiro .psd1 de dados de configuração para especificar os dados para os dois ambientes diferentes.
Ficheiro de dados de configuração
Vamos definir os dados do ambiente de desenvolvimento e produção num ficheiro com DevProdEnvData.psd1
o nome seguinte:
@{
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\"
}
)
}
Ficheiro de script de configuração
Agora, na configuração, que é definida num .ps1
ficheiro, filtramos os nós que definimos pela função (MSSQL
, Dev
ou ambos) e configuramo-los em DevProdEnvData.psd1
conformidade. O ambiente de desenvolvimento tem o SQL Server e o IIS num nó, enquanto o ambiente de produção os tem em dois nós diferentes. O conteúdo do site também é diferente, conforme especificado pelas SiteContents
propriedades.
No final do script de configuração, chamamos a configuração (compilá-la num documento MOF), passando DevProdEnvData.psd1
como o $ConfigurationData
parâmetro.
Nota: Esta configuração requer que os módulos sejam
xWebAdministration
instaladosxSqlPs
no nó de destino.
Vamos definir a configuração num ficheiro com o nome 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
Quando executa esta configuração, são criados três ficheiros MOF (um para cada entrada com nome na matriz 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
Utilizar dados não nó
Pode adicionar chaves adicionais à tabela hash ConfigurationData para dados que não sejam específicos de um nó. A seguinte configuração garante a presença de dois sites. Os dados de cada site são definidos na matriz AllNodes . O ficheiro Config.xml
é utilizado para ambos os sites, pelo que o definimos numa chave adicional com o nome NonNodeData
. Tenha em atenção que pode ter o número de chaves adicionais que quiser e pode dar-lhes o nome que quiser. NonNodeData
não é uma palavra reservada, é apenas o que decidimos nomear a chave adicional.
Pode aceder a chaves adicionais com a variável especial $ConfigurationData. Neste exemplo, ConfigFileContents
é acedido com a linha:
Contents = $ConfigurationData.NonNodeData.ConfigFileContents
no File
bloco de recursos.
$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
}
}
}