次の方法で共有


構成データと環境データの分離

適用対象: Windows PowerShell 4.0、Windows PowerShell 5.0

構成データを使用して、DSC 構成で使用されるデータを構成自体から分離すると便利です。 これにより、複数の環境で 1 つの構成を使用できます。

たとえば、アプリケーションを開発する場合、開発環境と実稼働環境の両方に 1 つの構成を使用し、構成データを使用して各環境のデータを指定することができます。

構成データとは何ですか?

構成データは、ハッシュテーブルで定義され、その構成をコンパイルするときに DSC 構成に渡されるデータです。

ConfigurationData ハッシュテーブルの詳細については、「設定データの使用」を参照してください。

簡単な例

これがどのように機能するかを確認するために、非常に簡単な例を見てみましょう。 IIS が一部のノードに存在し、Hyper-V が他のノードに存在することを保証する 1 つの構成を作成します。

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 パラメーターとして渡します。

その結果、次の 2 つの 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 2 つの異なるノードを指定し、それぞれに独自の NodeNameRoleがあります。 この構成は、$MyData (具体的には $AllNodes) から取得したノードのコレクションを取得し、そのコレクションを Role プロパティに対してフィルター処理することで Node ブロックを動的に作成します。

構成データを使用した開発環境と実稼働環境の定義

単一の構成を使用して Web サイトの開発環境と本番環境の両方をセットアップする完全な例を見てみましょう。 開発環境では、IIS と SQL Server の両方が 1 つのノードにインストールされます。 運用環境では、IIS と SQL Server は別々のノードにインストールされます。 構成データの .psd1 ファイルを使用して、2 つの異なる環境のデータを指定します。

構成データファイル

開発環境と本番環境のデータを次のように 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 で定義したノードをロール (MSSQLDev、またはその両方) でフィルタリングし、それに応じて構成します。 開発環境では SQL Server と IIS の両方が 1 つのノードに搭載されていますが、運用環境では 2 つの異なるノードに 2 つのノードがあります。 サイトのコンテンツも、 SiteContents プロパティで指定されているように異なります。

構成スクリプトの最後に、構成を呼び出し(MOFドキュメントにコンパイル)、 DevProdEnvData.psd1$ConfigurationData パラメーターとして渡します。

手記: この構成では、モジュール xSqlPsxWebAdministration をターゲットノードにインストールする必要があります。

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

この構成を実行すると、3 つの MOF ファイルが作成されます ( AllNodes 配列の名前付きエントリごとに 1 つ)。

    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 ハッシュテーブルにキーを追加できます。 次の構成により、2 つの Web サイトが存在することが保証されます。 各 Web サイトのデータは、 AllNodes 配列で定義されます。 ファイル Config.xml は両方のWebサイトで使用されるため、 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
        }
    }
}

こちらもご覧ください