Partilhar via


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, Devou 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 instalados xSqlPs 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
        }
    }
}

Consulte também