Separazione dei dati di configurazione e dell'ambiente

Si applica a: 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. In questo modo, è possibile usare una singola configurazione per più ambienti.

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.

Cosa sono i dati di configurazione?

I dati di configurazione sono dati definiti in una tabella hash e passati a una configurazione DSC quando si compila la configurazione.

Per una descrizione dettagliata della tabella hash ConfigurationData, vedere Uso dei dati di configurazione.

Un esempio semplice

Di seguito è riportato un esempio molto semplice che illustra il funzionamento. Verrà creata una singola configurazione che assicura che IIS sia presente in alcuni nodi e che Hyper-V sia presente in altri:

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.

Il risultato è che vengono creati due file 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 specifica due nodi diversi, ognuno con i propri NodeName e 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.

Uso dei dati di configurazione per definire gli ambienti di sviluppo e produzione

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. Nell'ambiente di sviluppo IIS e SQL Server vengono installati in un singolo nodo. Nell'ambiente di produzione IIS e SQL Server vengono installati in nodi separati. Nell'esempio verrà usato un file di dati di configurazione con estensione psd1 per specificare i dati per i due diversi ambienti.

File di dati di configurazione

I dati degli ambienti di sviluppo e produzione verranno definiti in un file denominato DevProdEnvData.psd1 come indicato di seguito:

@{

    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 configurazione

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. L'ambiente di sviluppo ha sia SQL Server sia IIS in un nodo, mentre per l'ambiente di produzione si trovano in nodi diversi. Anche il contenuto del sito è diverso, come specificato dalle proprietà SiteContents.

Alla fine dello script di configurazione viene chiamata la configurazione (compilata in un documento MOF), passando DevProdEnvData.psd1 come parametro $ConfigurationData.

Nota: per questa configurazione è necessario installare i moduli xSqlPs e xWebAdministration nel nodo di destinazione.

Definire la configurazione in un file denominato 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 si esegue questa configurazione, vengono creati tre file MOF (uno per ogni voce denominata nella matrice 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

Uso di dati non specifici per un nodo

È possibile aggiungere chiavi aggiuntive alla tabella hash ConfigurationData per i dati che non sono specifici di un nodo. La configurazione seguente garantisce la presenza di due siti Web. I dati per ogni sito Web sono definiti nella matrice AllNodes. Il file Config.xml viene usato per entrambi i siti Web, quindi viene definito in una chiave aggiuntiva con il nome NonNodeData. Si noti che non sono previsti limiti per il numero di chiavi aggiuntive e il nome che è possibile assegnare. NonNodeData non è una parola riservata, ma è semplicemente il nome di esempio scelto per la chiave aggiuntiva.

Per accedere alle chiavi aggiuntive, usare la variabile speciale $ConfigurationData. In questo esempio, l'accesso a ConfigFileContents avviene con la riga:

 Contents = $ConfigurationData.NonNodeData.ConfigFileContents

nel blocco di risorse File.

$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 anche