Поделиться через


Разделение данных конфигурации и среды

Область применения: Windows PowerShell 4.0, Windows PowerShell 5.0

Может быть полезно отделить данные, используемые в конфигурации DSC, от самой конфигурации с помощью конфигурационных данных. Таким образом, вы можете использовать одну конфигурацию для нескольких сред.

Например, при разработке приложения можно использовать одну конфигурацию как для среды разработки, так и для рабочей среды, а также использовать данные конфигурации для указания данных для каждой среды.

Что такое конфигурационные данные?

Данные конфигурации — это данные, которые определяются в хэш-таблице и передаются в конфигурацию DSC при компиляции этой конфигурации.

Подробное описание хэш-таблицы ConfigurationData см. в разделе Использование данных конфигурации.

Простой пример

Давайте рассмотрим очень простой пример, чтобы увидеть, как это работает. Мы создадим единую конфигурацию, которая гарантирует, что IIS присутствует на одних узлах, а Hyper-V — на других:

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

Последняя строка в этом скрипте компилирует конфигурацию, передавая $MyData в качестве значения параметр ConfigurationData .

В результате создаются два 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 указывает два разных узла, каждый со своим и NodeNameRole. Конфигурация динамически создает блоки узлов , беря коллекцию узлов, от которых она получает ( $MyData в частности, $AllNodes), и фильтрует эту коллекцию по свойству Role .

Использование данных конфигурации для определения сред разработки и рабочей среды

Давайте рассмотрим полный пример, в котором используется одна конфигурация для настройки как среды разработки, так и рабочей среды веб-сайта. В среде разработки IIS и SQL Server устанавливаются на одном узле. В производственной среде IIS и SQL Server устанавливаются на отдельных узлах. Мы будем использовать файл конфигурационных данных .psd1, чтобы указать данные для двух разных сред.

Файл с конфигурационными данными

Мы определим данные среды разработки и производственной среды в файле с именем следующим образом DevProdEnvData.psd1 :

@{

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

Файл конфигурационного скрипта

Теперь в конфигурации, которая определена в файле .ps1 , мы фильтруем определенные DevProdEnvData.psd1 нами узлы по их роли (MSSQL, Devили обеим) и настраиваем их соответствующим образом. В среде разработки SQL Server и IIS находятся на одном узле, в то время как в производственной среде они находятся на двух разных узлах. Содержимое сайта также отличается, как указано в свойствах SiteContents .

В конце конфигурационного скрипта мы вызываем конфигурацию (компилируем ее в MOF-документ), передавая DevProdEnvData.psd1 ее в качестве параметра $ConfigurationData .

Заметка: Эта конфигурация требует, чтобы модули xSqlPs были xWebAdministration установлены на целевом узле.

Давайте определим конфигурацию в файле с именем 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

При запуске этой конфигурации создаются три MOF-файла (по одному для каждой именованной записи в массиве 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

Использование данных, не относящихся к узлам

Вы можете добавить дополнительные ключи в хэш-таблицу ConfigurationData для данных, которые не относятся к узлу. Следующая конфигурация обеспечивает наличие двух сайтов. Данные для каждого сайта определяются в массиве AllNodes . Файл Config.xml используется для обоих сайтов, поэтому мы определяем его в дополнительном ключе с именем NonNodeData. Обратите внимание, что у вас может быть столько дополнительных ключей, сколько вы хотите, и вы можете назвать их как угодно. NonNodeData это не зарезервированное слово, это просто то, как мы решили назвать дополнительный ключ.

Доступ к дополнительным ключам осуществляется с помощью специальной переменной $ConfigurationData. В данном примере доступ осуществляется с помощью строки: ConfigFileContents

 Contents = $ConfigurationData.NonNodeData.ConfigFileContents

в блоке 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
        }
    }
}

См. также