Separazione dei dati di configurazione e dell'ambienteSeparating configuration and environment data

Si applica a: Windows PowerShell 4.0, Windows PowerShell 5.0Applies To: Windows PowerShell 4.0, Windows PowerShell 5.0

Può essere utile separare i dati usati in una configurazione DSC dalla configurazione stessa usando i dati di configurazione.It can be useful to separate the data used in a DSC configuration from the configuration itself by using configuration data. In questo modo, è possibile usare una singola configurazione per più ambienti.By doing this, you can use a single configuration for multiple environments.

Ad esempio, se si sviluppa un'applicazione, è possibile usare una sola configurazione per l'ambiente di sviluppo e per quello di produzione e usare i dati di configurazione per specificare i dati per ogni 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.

Cosa sono i dati di configurazione?What is configuration data?

I dati di configurazione sono dati definiti in una tabella hash e passati a una configurazione DSC quando si compila la configurazione.Configuration data is data that is defined in a hashtable and passed to a DSC configuration when you compile that configuration.

Per una descrizione dettagliata della tabella hash ConfigurationData , vedere Uso dei dati di configurazione.For a detailed description of the ConfigurationData hashtable, see Using configuration data.

Un esempio sempliceA simple example

Di seguito è riportato un esempio molto semplice che illustra il funzionamento.Let's look at a very simple example to see how this works. Verrà creata una singola configurazione che assicura che IIS sia presente in alcuni nodi e che Hyper-V sia presente in altri: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

L'ultima riga in questo script consente di compilare la configurazione, passando $MyData come valore del parametro ConfigurationData .The last line in this script compiles the configuration, passing $MyData as the value ConfigurationData parameter.

Il risultato è che vengono creati due file 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 specifica due nodi diversi, ognuno con i propri NodeName e Role.$MyData specifies two different nodes, each with its own NodeName and Role. La configurazione crea in modo dinamico i blocchi Node eseguendo la raccolta dei nodi che riceve da $MyData (in particolare, $AllNodes) e filtra tale raccolta usando la proprietà 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 dei dati di configurazione per definire gli ambienti di sviluppo e produzioneUsing configuration data to define development and production environments

Di seguito è riportato un esempio completo che usa una singola configurazione per impostare sia l'ambiente di sviluppo che quello di produzione di un sito Web.Let's look at a complete example that uses a single configuration to set up both development and production environments of a website. Nell'ambiente di sviluppo IIS e SQL Server vengono installati in un singolo nodo.In the development environment, both IIS and SQL Server are installed on a single nodes. Nell'ambiente di produzione IIS e SQL Server vengono installati in nodi separati.In the production environment, IIS and SQL Server are installed on separate nodes. Nell'esempio verrà usato un file di dati di configurazione con estensione psd1 per specificare i dati per i due diversi ambienti.We'll use a configuration data .psd1 file to specify the data for the two different environments.

File di dati di configurazioneConfiguration data file

I dati degli ambienti di sviluppo e produzione verranno definiti in un file denominato DevProdEnvData.psd1 come indicato di seguito: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\"
        }
    )
}

File di script di configurazioneConfiguration script file

Nella configurazione, definita in un file .ps1, i nodi definiti in DevProdEnvData.psd1 vengono ora filtrati in base al ruolo (MSSQL, Dev o entrambi) e configurati di conseguenza.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. L'ambiente di sviluppo ha sia SQL Server sia IIS in un nodo, mentre per l'ambiente di produzione si trovano in nodi diversi.The development environment has both the SQL Server and IIS on one node, while the production environment has them on two different nodes. Anche il contenuto del sito è diverso, come specificato dalle proprietà SiteContents.The site contents is also different, as specified by the SiteContents properties.

Alla fine dello script di configurazione viene chiamata la configurazione (compilata in un documento MOF), passando DevProdEnvData.psd1 come parametro $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: per questa configurazione è necessario installare i moduli xSqlPs e xWebAdministration nel nodo di destinazione.Note: This configuration requires the modules xSqlPs and xWebAdministration to be installed on the target node.

Definire la configurazione in un file denominato 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

Quando si esegue questa configurazione, vengono creati tre file MOF (uno per ogni voce denominata nella matrice 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 di dati non specifici per un nodoUsing non-node data

È possibile aggiungere chiavi aggiuntive alla tabella hash ConfigurationData per i dati che non sono specifici di un nodo.You can add additional keys to the ConfigurationData hashtable for data that is not specific to a node. La configurazione seguente garantisce la presenza di due siti Web.The following configuration ensures the presence of two websites. I dati per ogni sito Web sono definiti nella matrice AllNodes .Data for each website are defined in the AllNodes array. Il file Config.xml viene usato per entrambi i siti Web, quindi viene definito in una chiave aggiuntiva con il nome NonNodeData.The file Config.xml is used for both websites, so we define it in an additional key with the name NonNodeData. Si noti che non sono previsti limiti per il numero di chiavi aggiuntive e il nome che è possibile assegnare.Note that you can have as many additional keys as you want, and you can name them anything you want. NonNodeData non è una parola riservata, ma è semplicemente il nome di esempio scelto per la chiave aggiuntiva.NonNodeData is not a reserved word, it is just what we decided to name the additional key.

Per accedere alle chiavi aggiuntive, usare la variabile speciale $ConfigurationData .You access additional keys by using the special variable $ConfigurationData . In questo esempio, l'accesso a ConfigFileContents avviene con la riga:In this example, ConfigFileContents is accessed with the line:

 Contents = $ConfigurationData.NonNodeData.ConfigFileContents

nel blocco di risorse 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
        }
    }
}

Vedere ancheSee Also