Separando Dados de Configuração e de AmbienteSeparating configuration and environment data

Aplica-se a: Windows PowerShell 4.0, Windows PowerShell 5.0Applies To: Windows PowerShell 4.0, Windows PowerShell 5.0

Isto pode ser útil para separar os dados usados em uma configuração do DSC da configuração em si usando dados da configuração.It can be useful to separate the data used in a DSC configuration from the configuration itself by using configuration data. Fazendo isso, você pode usar uma configuração simples para vários ambientes.By doing this, you can use a single configuration for multiple environments.

Por exemplo, se estiver desenvolvendo um aplicativo, você pode usar uma configuração para os ambientes de desenvolvimento e produção e usar dados de configuração para especificar dados para cada ambiente.For example, if you are developing an application, you can use one configuration for both development and production environments, and use configuration data to specify data for each environment.

O que são dados de configuração?What is configuration data?

Dados de configuração são dados definidos em uma tabela de hash e passados a uma configuração de DSC ao compilar a configuração.Configuration data is data that is defined in a hashtable and passed to a DSC configuration when you compile that configuration.

Para obter uma descrição detalhada da tabela de hash ConfigurationData, veja Usar dados de configuração.For a detailed description of the ConfigurationData hashtable, see Using configuration data.

Um exemplo simplesA simple example

Vamos observar um exemplo muito simples para ver como isso funciona.Let's look at a very simple example to see how this works. Vamos criar uma única configuração que garante que IIS esteja presente em alguns nós e que Hyper-V esteja presente em outros:We'll create a single configuration that ensures that IIS is present on some nodes, and that Hyper-V is present on others:

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 desse script compila a configuração, passando $MyData como o valor do parâmetro ConfigurationData.The last line in this script compiles the configuration, passing $MyData as the value ConfigurationData parameter.

O resultado é a criação de dois arquivos MOF:The result is that two MOF files are created:

    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  

O $MyData especifica dois nós diferentes, cada um com seu próprio NodeName e Role.$MyData specifies two different nodes, each with its own NodeName and Role. A configuração cria dinamicamente blocos de por meio da coleção de nós que obtém do $MyData (especificamente, $AllNodes) e filtra essa coleção em relação à propriedade Role.The configuration dynamically creates Node blocks by taking the collection of nodes it gets from $MyData (specifically, $AllNodes) and filters that collection against the Role property..

Usar dados de configuração para definir os ambientes de desenvolvimento e produçãoUsing configuration data to define development and production environments

Vejamos um exemplo completo que usa uma única configuração para configurar ambientes de desenvolvimento e de produção de um site.Let's look at a complete example that uses a single configuration to set up both development and production environments of a website. No ambiente de desenvolvimento, o IIS e o SQL Server são instalados em um único nó.In the development environment, both IIS and SQL Server are installed on a single nodes. No ambiente de produção, o IIS e o SQL Server são instalados em nós separados.In the production environment, IIS and SQL Server are installed on separate nodes. Vamos usar um arquivo de dados de configuração .psd1 para especificar os dados para os dois ambientes diferentes.We'll use a configuration data .psd1 file to specify the data for the two different environments.

Arquivo de dados de configuraçãoConfiguration data file

Vamos definir os dados do ambiente de desenvolvimento e de produção em um arquivo chamado DevProdEnvData.psd1 da seguinte maneira:We'll define the development and production environment data in a file namd DevProdEnvData.psd1 as follows:

@{

    AllNodes = @(

        @{
            NodeName        = "*"
            SQLServerName   = "MySQLServer"
            SqlSource       = "C:\Software\Sql"
            DotNetSrc       = "C:\Software\sxs"
        },

        @{
            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\"
        }
    )
}

Arquivo de script para configuraçãoConfiguration script file

Agora, na configuração, definida por um arquivo .ps1, filtramos os nós que definimos em DevProdEnvData.psd1 por função (MSSQL, Dev ou ambas) e os configuramos adequadamente.Now, in the configuration, which is defined in a .ps1 file, we filter the nodes we defined in DevProdEnvData.psd1 by their role (MSSQL, Dev, or both), and configure them accordingly. O ambiente de desenvolvimento tem o SQL Server e o IIS em um nó, enquanto que o ambiente de produção os tem em dois nós diferentes.The development environment has both the SQL Server and IIS on one node, while the production environment has them on two different nodes. O conteúdo do site também é diferente, conforme especificado pelas propriedades SiteContents.The site contents is also different, as specified by the SiteContents properties.

No final do script de configuração, chamamos a configuração (compilamos isso em um documento MOF), passando o DevProdEnvData.psd1 como o parâmetro $ConfigurationData.At the end of the configuration script, we call the configuration (compile it into a MOF document), passing DevProdEnvData.psd1 as the $ConfigurationData parameter.

Observação: essa configuração requer que os módulos xSqlPs e xWebAdministration estejam instalados no nó de destino.Note: This configuration requires the modules xSqlPs and xWebAdministration to be installed on the target node.

Vamos definir a configuração em um arquivo chamado MyWebApp.ps1:Let's define the configuration in a file named MyWebApp.ps1:

Configuration MyWebApp
{
    Import-DscResource -Module PSDesiredStateConfiguration
    Import-DscResource -Module xSqlPs
    Import-DscResource -Module 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            = $WebSiteName
            State           = 'Started'
            PhysicalPath    = $Node.SitePath
            DependsOn       = '[File]WebContent'
        }

    }

}

MyWebApp -ConfigurationData DevProdEnvData.psd1

Ao executar essa configuração, são criados três arquivos MOF (um para cada entrada nomeada na matriz AllNodes):When you run this configuration, three MOF files are created (one for each named entry in the AllNodes array):

    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

Usar dados sem nósUsing non-node data

Você pode adicionar mais chaves à tabela de hash ConfigurationData para dados que não são específicos de um nó.You can add additional keys to the ConfigurationData hashtable for data that is not specific to a node. A configuração a seguir garante a presença dos dois sites.The following configuration ensures the presence of two websites. Os dados de cada site são definidos na matriz AllNodes.Data for each website are defined in the AllNodes array. O arquivo Config.xml é usado para ambos os sites, portanto podemos defini-lo em uma outra chave com o nome NonNodeData.The file Config.xml is used for both websites, so we define it in an additional key with the name NonNodeData. Observe que você pode ter quantas chaves adicionais quiser, e pode nomeá-las como desejar.Note that you can have as many additional keys as you want, and you can name them anything you want. NonNodeData não é uma palavra reservada, é apenas o que decidimos usar como nome da chave adicional.NonNodeData is not a reserved word, it is just what we decided to name the additional key.

Acesse as chaves adicionais usando a variável especial $ConfigurationData.You access additional keys by using the special variable $ConfigurationData. Neste exemplo, ConfigFileContents é acessado com a linha:In this example, ConfigFileContents is accessed with the line:

 Contents = $ConfigurationData.NonNodeData.ConfigFileContents

no bloco de recurso File.in the File resource block.

$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émSee Also