Separación de los datos de entorno y configuraciónSeparating configuration and environment data

Se aplica a: Windows PowerShell 4.0, Windows PowerShell 5.0Applies To: Windows PowerShell 4.0, Windows PowerShell 5.0

Puede ser útil separar los datos utilizados en una configuración DSC de la propia configuración mediante el uso de datos de configuración.It can be useful to separate the data used in a DSC configuration from the configuration itself by using configuration data. Al hacerlo, puede utilizar una sola configuración para varios entornos.By doing this, you can use a single configuration for multiple environments.

Por ejemplo, si está desarrollando una aplicación, puede usar una configuración para los entornos de producción y desarrollo, y usar datos de configuración para especificar datos para cada entorno.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.

¿Qué son lo datos de configuración?What is configuration data?

Los datos de configuración son datos que se definen en una tabla hash y se pasan a una configuración DSC al compilar esa configuración.Configuration data is data that is defined in a hashtable and passed to a DSC configuration when you compile that configuration.

Para una descripción detallada de la tabla hash ConfigurationData , consulte Separación de los datos de entorno y configuración.For a detailed description of the ConfigurationData hashtable, see Using configuration data.

Un ejemplo sencilloA simple example

Veamos un ejemplo muy sencillo de cómo funciona esto.Let's look at a very simple example to see how this works. Crearemos una única configuración que garantice que IIS esté presente en algunos nodos y que Hyper-V esté presente en otros: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

La última línea de este script compila la configuración; para ello, pasa $MyData como el valor del parámetro ConfigurationData .The last line in this script compiles the configuration, passing $MyData as the value ConfigurationData parameter.

El resultado es que se crean dos archivos 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

$MyData especifica dos nodos diferentes, cada uno con sus propios NodeName y Role.$MyData specifies two different nodes, each with its own NodeName and Role. La configuración crea de forma dinámica bloques de nodo al tomar la colección de nodos que se obtiene de $MyData (específicamente, $AllNodes) y al filtrar esa colección en la propiedad 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..

Uso de datos de configuración para definir entornos de desarrollo y producciónUsing configuration data to define development and production environments

Veamos un ejemplo completo que usa una única configuración para configurar los entornos de desarrollo y producción de un sitio web.Let's look at a complete example that uses a single configuration to set up both development and production environments of a website. En el entorno de desarrollo, IIS y SQL Server se instalan en un único nodo.In the development environment, both IIS and SQL Server are installed on a single nodes. En el entorno de producción, IIS y SQL Server se instalan en nodos independientes.In the production environment, IIS and SQL Server are installed on separate nodes. Vamos a usar un archivo. psd1 de datos de configuración para especificar los datos de los dos entornos diferentes.We'll use a configuration data .psd1 file to specify the data for the two different environments.

Archivo de datos de configuraciónConfiguration data file

Definiremos los datos del entorno de desarrollo y producción en un archivo denominado DevProdEnvData.psd1 de la siguiente forma:We'll define the development and production environment data in a file named DevProdEnvData.psd1 as follows:

@{

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

Archivo de script de configuraciónConfiguration script file

Ahora, en la configuración, que se define en un archivo .ps1, filtraremos los nodos que hemos definido en DevProdEnvData.psd1 por su rol (MSSQL, Dev o ambos) y los configuraremos según corresponda.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. El entorno de desarrollo tiene SQL Server e IIS en un nodo, mientras que el entorno de producción los tiene en dos nodos diferentes.The development environment has both the SQL Server and IIS on one node, while the production environment has them on two different nodes. El contenido del sitio también es diferente, según lo especificado por las propiedades SiteContents.The site contents is also different, as specified by the SiteContents properties.

Al final del script de configuración, llamamos a la configuración (compílela en un documento MOF) al pasar DevProdEnvData.psd1 como el 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.

Nota: Esta configuración requiere que los módulos xSqlPs y xWebAdministration estén instalados en el nodo de destino.Note: This configuration requires the modules xSqlPs and xWebAdministration to be installed on the target node.

Vamos a definir la configuración en un archivo denominado 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            = $Node.WebSiteName
            State           = 'Started'
            PhysicalPath    = $Node.SitePath
            DependsOn       = '[File]WebContent'
        }

    }

}

MyWebApp -ConfigurationData DevProdEnvData.psd1

Cuando se ejecuta esta configuración, se crean tres archivos MOF (uno para cada entrada con nombre en la 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

Uso de datos que no son de nodoUsing non-node data

Puede agregar claves adicionales a la tabla hash ConfigurationData para los datos que no son específicos de un nodo.You can add additional keys to the ConfigurationData hashtable for data that is not specific to a node. La siguiente configuración garantiza la presencia de dos sitios web.The following configuration ensures the presence of two websites. Los datos de cada sitio web se definen en la matriz AllNodes .Data for each website are defined in the AllNodes array. El archivo Config.xml se usa para ambos sitios web, por lo que lo definimos en una clave adicional con el nombre NonNodeData.The file Config.xml is used for both websites, so we define it in an additional key with the name NonNodeData. Tenga en cuenta que puede tener tantas claves adicionales como desee, y puede asignarles el nombre que desee.Note that you can have as many additional keys as you want, and you can name them anything you want. NonNodeData no es una palabra reservada, es lo que hemos decidido para asignar nombre a la clave adicional.NonNodeData is not a reserved word, it is just what we decided to name the additional key.

Tiene acceso a claves adicionales mediante la variable especial $ConfigurationData .You access additional keys by using the special variable $ConfigurationData . En este ejemplo, se accede a ConfigFileContents con la línea:In this example, ConfigFileContents is accessed with the line:

 Contents = $ConfigurationData.NonNodeData.ConfigFileContents

en el bloque de recursos 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 tambiénSee Also