Windows PowerShell

Desired State Configuration のカスタム リソースを作成する

Ritesh Modi

Desired State Configuration (DSC) は、マイクロソフトが提供する構成管理と配置の新しいプラットフォームです。DSC は、Common Information Model (CIM) と Web Services for Management (WSMAN) という業界標準を基盤にビルドされていて、Windows PowerShell の拡張機能です。

開発者は、任意の Windows PowerShell コンソール内で宣言型の DSC スクリプトを記述し、DSC オブジェクトを生成して、その DSC オブジェクトをターゲットとするサーバーで実行することができます。DSC により、このような構成ドキュメントを使用して、サーバーのコンプライアンスを構成、監視、および確保できるようになります。

構成の記述は、ターゲット サーバーのポリシーを定義することに似ています。ポリシーは、リソースのグループと目的の状態を含み、それらがターゲット サーバーに適用されます。DSC は、各サーバーがそのポリシーに準拠するようにします。DSC の詳細については、bit.ly/1iDeRcF (英語) を参照してください。

リソースが、DSC の基本ビルディング ブロックです。リソースは、DSC インフラストラクチャの中で最も細かいコンポーネントで、再利用、配布、共有が可能です。また、DSC における最も低レベルの制御を提供し、DSC ドキュメントを作成してインフラストラクチャを構成するために使用されます。DSC のリソースは、IIS、Windows リモート管理 (WinRM)、レジストリ、Windows の機能やサービスの構成と管理など、Windows PowerShell を使って行えるすべての作業を実行できます。

最近のテクノロジは、拡張を可能にすることが求められます。DSC は開放/閉鎖原則に従います。つまり、拡張に対して開放され、変更に対して閉鎖されています。DSC には、新しいリソースを作成するために必要な拡張フックが用意されています。

今回は、DSC のカスタム リソースを開発し、サンプルの DSC 構成でそのリソースを使用する方法を示します。ここでは「TrustedHosts」というカスタム リソースを作成します。このリソースは、WinRM の信頼されたホストの構成を管理し、WinRM の TrustedHosts プロパティにコンピューター名を追加または削除します。

Windows PowerShell のリモート処理を使用して通信する (どのドメインにも参加していない) ワークグループのサーバーでは、WinRM での追加構成が必要です。具体的には、クライアント コンピューターの名前を WinRM の TrustedHosts のリストに追加して、このようなコンピューターからのリモート処理を許可します。

このリソースは、TrustedHosts のリスト内の 1 つのコンピューター名の管理を担当することになります。ただし、複数のコンピューター名が必要な場合は、構成ドキュメント内でこのリソースを使用して、複数のリソース セクションを追加できます。また、付属のリソースを変更することもできます。

次のように Get-Item コマンドを実行し、WSMAN プロバイダーを使用することで、信頼されたホストの構成を表示できます。

Get-Item WSMan:\localhost\client\TrustedHosts

同様に、Windows PowerShell コンソールを使って次のコマンドを実行することで、TrustedHosts プロパティを変更できます。

Set-Item WSMan:\localhost\client\TrustedHosts –Value "*.contoso.com" –force

カスタム リソースをビルドするために必要なビルディング ブロックと概念を理解することが重要です。DSC リソースのビルドの土台となる主要テクノロジは、CIM、管理オブジェクト フォーマット (MOF)、Windows PowerShell とそのモジュール、および WinRM に関する概念です。

DSC のリソース

カスタム リソースの実装に着手する前に、リソースをパッケージ化してサーバーに配置する方法を理解しておく必要があります。DSC のリソースは、Windows PowerShell のモジュール内に含めて、コードを再利用して配布できるようになっています。開発者は C# などの言語を使用して、Windows PowerShell のスクリプトまたはコンパイル済みのバイナリとしてそのモジュールを実装できます。

DSC では、モジュール インフラストラクチャを使用してリソースがホストされます。Windows PowerShell のモジュールは、ファイル システムの事前に定義されたフォルダーに配置されます。このフォルダーは、Windows PowerShell コンソールから Windows PowerShell 変数の $env:ModulePath を逆参照することで表示できます。Windows PowerShell は、利用可能なすべてのモジュールを C:\Windows\System32\Windows­PowerShell\v1.0\modules にインストールします。開発者は、すべてのカスタム モジュールを、C:\Program Files\WindowsPowerShell\modules に配置する必要があります。TrustedHosts カスタム リソースの場合、WinRM Windows PowerShell モジュールのモジュール ベース パスとホスト コンテナーとして、C:\Program Files\WindowsPowerShell\Modules を使用します。このフォルダーに、WinRM という新しいフォルダーを作成することになります。

DSC は、リソースが、Windows PowerShell モジュール内のファイルとフォルダーの構造に関連する規則に従うことを想定します。すべての DSC リソースを、モジュールの DSCResources フォルダーに配置されます。ここが、関連するすべてのリソースが含まれるルート フォルダーです。WinRM フォルダー内に、DSCResources というもう 1 つのフォルダーを作成します。このフォルダーがすべての DSC リソースをホストします。このフォルダー内には、リソースごとに 1 つずつフォルダーを作成します。今回は 1 つのリソースを作成するため、TrustedHosts というフォルダー 1 つだけになります。フォルダーとリソースの名前は同じにする必要があります。このリソース固有の TrustedHosts フォルダーにリソース固有のファイルを含めます。TrustedHosts リソースのフォルダー構造を図 1 に示します。

Windows PowerShell Desired State Configuration リソースのフォルダーとファイルの仕様
図 1 Windows PowerShell Desired State Configuration リソースのフォルダーとファイルの仕様

リソース実装の定義と提供に使用するファイルは以下のとおりです。

  1. <<ResourceName>>.psm1 は、リソース実装ファイルです。今回は TrustedHosts.psm1 です。
  2. <<ResourceName>>.psd1 は、リソース メタデータ ファイルです。今回は TrustedHosts.psd1 です。.psm1 スクリプト ファイルから必須の関数をエクスポートする場合、このファイルは必要ありません。
  3. <<ResourceName>>.Schema.mof: は、リソース定義です。今回は TrustedHosts.Schema.mof です。

すべての Windows PowerShell モジュールには、モジュール自体と同じ名前のモジュール マニフェスト ファイルがあります。モジュール マニフェスト ファイルは、昇格した特権を使用して、Windows PowerShell コンソールから New-ModuleManifest コマンドレットを使って、次のように生成します。

New-ModuleManifest -Path "C:\Program Files\WindowsPowerShell\Modules\WinRM\WinRM.psd1"

DSC リソースをパッケージ化するためのフォルダーとファイル構造の規則について理解したら、次は実装ファイルです。

TrustedHosts.Schema.mof

データセンター内での管理情報を交換できるようにする場合、MOF ファイルを使用して、CIM/WMI が使用するクラスを定義し、そのクラスのインスタンスを生成します。MOF クラスは、DSC リソースとそのプロパティを定義します。プロパティには、読み取りと書き込みが可能な属性、読み取り専用の属性、および必須属性を含めることができます。CIM/WMI には、必ず、オブジェクトを一意に特定する Key プロパティが存在します。プロパティには値が割り当てられ、その値が最終的には、監視対象およびメンテナンス対象のリソースが目的とする状態になります。MOF ファイルは MOF デザイナーを使用して生成できます。また、MOF ファイルは基本的にテキスト ファイルなので、メモ帳などのテキスト エディターで作成することもできます。

MOF クラスを作成する前に、コンピューターの TrustedHosts 構成で管理する必要がある情報を分析します。サーバーで TrustedHosts を管理する場合、3 つのプロパティが必要です。1 つは、TrustedHosts リストに追加するための ComputerName プロパティ、2 つ目は ComputerName の追加と削除を決定するための Ensure プロパティ、3 つ目は WinRM の TrustedHosts 構成にアクセスして管理するための資格情報です。

次に、TrustedHosts DSC リソース用に MOF クラスを作成します。

[ClassVersion ("1.0.0"), FriendlyName ("TrustedHosts")]
Class TrustedHosts: OMI_BaseResource
{
  [Key, Description ("Name of the host")] String ComputerName;
  [Write, ValueMap {"Present", "Absent"}, 
    Values {"Present", "Absent"}] string Ensure;
  [Write, EmbeddedInstance ("MSFT_Credential")] string Credential;
};

MOF クラスが CIM エコシステム全体に適合する方法も理解しておきます。すべての DSC リソースは、CIM 抽象クラスの OMI_BaseResource から派生します。この基本クラスは root\Microsoft\Windows\DesiredStateConfiguration 名前空間で定義され、すべての DSC リソースに必要な共通プロパティを提供します。

このような共通プロパティには、ResourceID、SourceInfo、ModuleName、ModuleVersion、および DependsOn があります。MOF ファイルの生成中、上記の 3 つのプロパティをリソースのすべてのプロパティに追加することになります。追加するプロパティは DSC 固有の内部プロパティで、DSC だけが使用します。TrustedHosts クラスは、root\Microsoft\Windows\DesiredStateConfiguration 名前空間の一部にもなります。3 つのプロパティはすべての文字列型で、WinRM TrustedHosts リソースの定義を表します。

ComputerName プロパティには追加のメタデータ (Key と Description) があります。Key は型修飾子で、そのプロパティが必須であり、このプロパティ値がすべてのインスタンスで一意になることを示します。MOF クラス内の少なくとも 1 つのプロパティに Key メタデータを設定します。複数のプロパティに Key メタデータを設定してもかまいません。この場合は複合キーが作成され、どちらのプロパティもすべてのインスタンスで一意になる必要があります。今回は、ComputerName プロパティに Key メタデータを設定します。こうしておかないと、コンピューター名が TrustedHosts リストに既に存在するかどうか判断できないためです。

Description は、そのプロパティの意味をテキストで表現するものです。Ensure プロパティは、ValueMap を使って注釈を付けます。ValueMap は、そのプロパティが受け取ることができる一連の値で、列挙値と同義です。今回、Ensure は有効な値として "Present" または "Absent" を受け取ります。Ensure プロパティと Credential プロパティはどちらも、write 属性で修飾します。つまり、構成スクリプトで今回のカスタム リソースを使用する場合、このプロパティへの書き込みと変更が可能です。

TrustedHosts クラスには、ClassVersion と FriendlyName というメタデータもあります。クラス バージョンは、同じ MOF クラスの複数のバージョンを管理する場合に便利です。FriendlyName は重要なメタデータです。構成スクリプトは、このメタデータを使用してリソースを表すためです。構成スクリプトは、フレンドリ名を使ってリソースを認識します。TrustedHosts クラスの場合、クラス名とフレンドリ名を同じにしています。MOF ファイルの定義とそのメタデータの詳細については、bit.ly/1AEHLTj (英語) を参照してください。

MOF クラスを定義したら、先ほど作成した TrustedHostsfolder 内に TrustedHosts.Schema.mof というファイル名を付けて、ASCII 形式または Unicode 形式でファイル システムに保存します。DSC 構成でこのカスタム リソースを使用するときは、これらのプロパティに値を割り当てて目的の構成状態を示します。

TrustedHosts.psm1

今度は、カスタム DSC リソースの最も重要な側面として、リソース モジュール スクリプトを取り上げます。このスクリプトにはカスタム リソース実装を含め、そのしくみを決定します。また、目的の構成になるように調整し続けることで、リソースを管理します。すべての DSC リソース スクリプト モジュールには、3 つの関数を実装する必要があります。この 3 つの関数は必須で、各関数には実装を管理するための規則があります。

Get-TargetResource 関数では、MOF クラスのすべてのプロパティのうち、Key メタデータを設定したすべてのプロパティを宣言し、パラメータとして受け取る必要があります。また、必須プロパティと書き込み可能なプロパティもパラメーターとして受け取ることができます。Key パラメーターと必須パラメーターは、パラメーターの宣言時に、mandatory としてマークします。

Get-TargetResource 関数では、Key プロパティの値を使用して、リソースの現在状態を取得するスクリプトを実装します。この関数は、MOF クラスで定義されたすべてのプロパティのうち、リソースの現在状態を値として持つすべてのプロパティを含むハッシュテーブルを返します。

Set-TargetResource 関数では、MOF クラスのすべてのプロパティのうち、Key メタデータを設定したプロパティ、必須プロパティ、および書き込み可能なプロパティを宣言し、パラメーターとして受け取る必要があります。Key パラメーターと必須パラメーターは、パラメーターの宣言時に、mandatory としてマークします。Set-TargetResource 関数には、パラメーターとして指定されるすべてのリソースのプロパティの値を使用してリソースのインスタンスを取得し、次に示すいずれかの操作を実行するスクリプトを実装します。

  • 新しいリソース インスタンスを作成する。
  • 既存のリソース インスタンスを更新する。
  • 既存のリソース インスタンスを削除する。

Set-TargetResource 関数からは値を返さないようにします。

Test-TargetResource 関数は Set-TargetResource 関数と似ていますが、リソースの現在状態は返しません。代わりに、リソースの現在状態が、構成スクリプトで指定されたリソースの想定状態に一致するかどうかに応じて、ブール値の true または false を返します。現在状態と想定状態が完全に一致する場合、true を返します。Key プロパティ、必須プロパティ、または書き込み可能プロパティに不一致がある場合、false を返します。

この 3 つの関数は、DSC のローカル構成マネージャー (LCM) コンポーネントから呼び出されます。LCM は、Windows Management Framework 4.0 を実行するすべてのコンピューターで実行されるエージェントです。LCM は、ネットワーク内のすべてのサーバーで利用できる DSC クライアントと考えてください。DSC はこのクライアントと通信し、必要な構成情報を提供します。ターゲット コンピューターで構成へのコンプライアンスを管理、監視、および確保するのは、LCM (DSC クライアント) の役割です。この役割を果たすために、DSC リソースの関数を呼び出します。最初に Test-TargetResource 関数を呼び出して、リソースの構成が想定している構成に一致するかどうかを判断します。返された値が true の場合、リソースの現在状態が想定の構成と同じであることを意味します。ただし、状態が一致しない場合、false が返されます。

LCM が戻り値として false を受け取ると、Set-TargetResource を呼び出し、次の手順を実行します。

  1. リソースが存在せず、Ensure プロパティが Present に設定されている場合、リソースの新しいインスタンスを作成し、構成スクリプトから取得したプロパティ値を割り当てます。
  2. リソースが存在し、Ensure プロパティが Present に設定されていても、一部のプロパティ値が構成スクリプトで記述したプロパティ値に一致しない場合、一致しないリソース プロパティだけを更新します。
  3. リソースが存在し、Ensure プロパティが Present に設定されていて、すべてのプロパティ値が構成スクリプトで記述したプロパティの値に一致する場合、何も実行しません。
  4. リソースが存在し、Ensure プロパティが Absent に設定されている場合、リソースを削除します。
  5. リソースが存在せず、Ensure プロパティが Absent に設定されている場合、何も実行しません。

ここからは、TrustedHosts カスタム リソースに関連するこの 3 つの関数を実装します。Windows PowerShell ISE を開き、この 3 つの関数を実装し、TrustedHosts.psm1 という名前を付けて WinRM\DSC­Resources\TrustedHosts ディレクトリに保存します。

TrustedHosts カスタム リソース用の Get-TargetResource

この関数は、MOF ファイルで定義されたすべてのプロパティをパラメーターとして受け取ります。Credential パラメーターは PSCredential 型です。これはユーザー名とパスワードを取り込んで格納するために Windows PowerShell によって公開される Microsoft .NET Framework クラスです。残りのパラメーターは文字列型です。

この関数内で、リソースの現在プロパティを返すために、ハッシュテープルを作成します (図 2 参照)。WSMAN プロバイダーを使用して、TrustedHosts の現在の構成リストを読み取ります。スクリプトでは、利用可能なコンピューター名がリストに含まれているかどうかをチェックします。含まれている場合、利用可能なコンピューター名のリストをループして、指定されたコンピューター名と照合します。完全に一致する名前が見つかれば、Present 値または Absent 値で Ensure プロパティを更新します。さらに、返すハッシュテーブルにこのコンピューター名を追加します。

図 2 TrustedHosts リソース用の Get-TargetResource 関数

Function Get-TargetResource
{
  param(
  # Computer name to be checked within TrustedHosts List
  [parameter(mandatory)]
  [string] $ComputerName,
  # This property determines whether computer name
  # should be added or removed from TrustedHosts
  [parameter(mandatory)]
  [string] $Ensure,
  # Credentials needed to manage WinRM TrustedHosts configuration
  [parameter(mandatory)]
  [PSCredential] $Credential
  )
  # Hashtable containing values is returned from this function
  $retval = @{}
  $retval.Add("Ensure","")
  $retval.Add("ComputerName", "")
  try{
    # Get current TrustedHosts comma-separated list using supplied credentials
    $TH = $(Get-Item WSMan:\localhost\Client\TrustedHosts `
      -credential $Credential).value
    Write-Verbose "Current TrustedHosts Configuration has $TH"
    if($TH.Length -gt 0){
      $temp = $TH -split ","
      [string] $newNode = ""
      # Check if value in TrustedHosts list already have few computer names
      if($temp.Length -gt 0) {
        for($i = 0; $i -lt $temp.Length; $i++){
          if($temp[$i].Trim() -eq $ComputerName.Trim())
          {
            $retval.Ensure = "Present"  # Found computer name
            $retval.ComputerName = $ComputerName
            break;
          } else {
            $retval.Ensure = "Absent" # Computer name is not in the list
            $retval.ComputerName = $ComputerName
          }
        }
      }
    } else {
      # TrustedHosts list is empty
      $retval.Ensure = "Absent"
      $retval.ComputerName = $ComputerName
    }
  } catch {
     Write-Verbose " Error executing Get-TargetResource function"
     Write-Verbose $Error[0].Exception.ToString()
  }
}

TrustedHosts カスタム リソース用の Set-TargetResource

この関数は、Get-Target­Resource と同じパラメーターのセットを受け取ります。この関数では、指定される WSMAN を使用して、TrustedHosts リストから現在のコンピューター名を取得します。次に、Ensure プロパティの値に応じて、TrustedHosts リストにコンピューター名を追加するか、一覧から削除します。

値が Present の場合、コンピューター名をリストに追加します。値が Absent の場合、コンピューター名をリストから削除します。どちらの操作も Set-Item コマンドレットと WSMAN プロバイダーを使用して実行します (図 3 参照)。関数からの戻り値はありません。verbose スイッチを使用する場合は、Write-Verbose を使用してコンソールに追加のフィードバックを提供します。

図 3 TrustedHosts リソース用の Set-TargetResource 関数

Function Set-TargetResource
{
  param(
  # Computer name to be added within TrustedHosts List
  [parameter(mandatory)]
  [string] $ComputerName,
  # This property determines whether computer name should be
  # added or removed from TrustedHosts
  [parameter(mandatory)]
  [string] $Ensure,
  # Credentials needed to manage WinRM TrustedHosts configuration
  [parameter(mandatory)]
  [PSCredential] $Credential
  )
  try {
    # Get current TrustedHosts comma-separated list
    # using supplied credentials
    $TH = (Get-Item WSMan:\localhost\Client\TrustedHosts `
      -credential $Credential).value
    # Computer name should be added to the TrustedHosts list
    if($Ensure -eq "Present") {
      Write-Verbose "The current value is $TH"
      if($TH.Length -gt 0)
        {
          # Adding Computer name when the TrustedHosts list
           # configuration is not empty
          $TH += ",$ComputerName"
          Set-Item WSMan:\localhost\Client\TrustedHosts `
            -Value $TH -credential $Credential -FORCE
        } else {
          # Adding Computer name when the TrustedHosts list
           # configuration is empty
          $TH += "$ComputerName"
          Set-Item WSMan:\localhost\Client\TrustedHosts `
            -Value $TH -credential $Credential -FORCE
        }
          Write-Verbose "The New value is $TH"
      } else {
        # Computer name should be removed from TrustedHosts list
        Write-Verbose "The current value is $TH"
        if($TH.Length -gt 0) {
          $temp = $TH -split ","
          [string] $newNode = ""
          if($temp.Length -gt 0)
            {
               for($i = 0; $i -lt $temp.Length; $i++){
                 if($temp[$i].Trim() -ne $ComputerName.Trim())
                   {
                     $newNode += $temp[$i] + ","
                   }
                 }
                         $newNode = $newNode.TrimEnd(",")
                    # Updating list after removing the Computer name
                    Set-Item WSMan:\localhost\Client\TrustedHosts -Value $newNode
                      -credential $Credential -Force
                    Write-Verbose "The New value is $TH"
               }
             }
     }
   } catch {
      Write-Verbose " Error executing Set-TargetResource function"
      Write-Verbose $Error[0].Exception.ToString()
   }
}

TrustedHosts カスタム リソース用の Test-TargetResource

この関数は、Get-TargetResource に似ています。唯一の違いは、この関数がブール値の True または False を返すことです。まず、WSMAN プロバイダーを使用して TrustedHosts プロパティの現在値をクエリします。複数のコンピューター名をコンマで区切って指定できるため、ループ処理が必要です。

ループ中、構成で指定される名前と一致するコンピューター名が見つかると、Present るか、Absent かをチェックします。Ensure プロパティ値が Present で、コンピューター名が TrustedHosts の設定に存在する場合、戻り値を True に設定します。Ensure プロパティ値が Absent で、TrustedHosts の設定にコンピューター名が存在する場合、戻り値を False に設定します。

Ensure プロパティ値が Present で、コンピューター名が TrustedHosts の設定に存在しない場合、戻り値を False に設定します。Ensure プロパティ値が Absent で、コンピューター名が TrustedHosts の設定に存在しない場合、戻り値を True に設定します (図 4 参照)。

図 4 TrustedHosts リソース用の Test-TargetResource 関数

Function Test-TargetResource
{
  param(
  # Computer name to be added within TrustedHosts List
  [parameter(mandatory)]
  [string] $ComputerName,
  # This property determines whether computer name should
  # be added or removed from TrustedHosts
  [parameter(mandatory)]
  [string] $Ensure,
  # Credentials needd to manage WinRM TrustedHosts configuration
  [parameter(mandatory)]
  [PSCredential] $Credential
  )
  # Boolean return variable from this function
  $retval = $false
  try {
    # Get current TrustedHosts comma-separated list using supplied credentials
    $TH = (Get-Item WSMan:\localhost\Client\TrustedHosts `
      -credential $Credential).value
    if($TH.Length -gt 0) {
      $temp = $TH -split ","
      [string] $newNode = ""
      if($temp.Length -gt 0) {
        for($i = 0; $i -lt $temp.Length; $i++){
          if($temp[$i].Trim() -eq $ComputerName.Trim()) {
            # Computer name exists within TrustedHosts list
            if($Ensure -eq "Present")
            {
              # Computer name exists and expected to be present
              $retval= $true
              break;
            } else {
              # Computer name exists and is not expected to be present
              $retval = $false
            }
            break;
          } else {
            # Computer name does not exist
            if($Ensure -eq "Present")
            {
              $retval = $false
            } else {
              $retval = $true
            }
          }
        }
      }
    } else {
      # TrustedHosts list is empty
      if($Ensure -eq "Present"){
        $retval= $false
      } else {
        $retval = $true
      }
    }
      return $retval
  } catch {
    Write-Verbose " Error executing Test-TargetResource function"
    Write-Verbose $Error[0].Exception.ToString()
  }
}

カスタム リソース関数のエクスポート

3 つの必須 DSC リソース関数を実装後、この関数をエクスポートします。これには、次の 2 つのアプローチがあります。

  1. Windows PowerShell モジュールの .psd1 マニフェスト ファイルと .psm1 ファイルを作成する。
  2. Export-ModuleMember コマンドレットを使用してスクリプト ファイル自体の関数をエクスポートする。

ここでは関数をエクスポートするために 2 つ目のアプローチを使用します。このアプローチでは、Export-ModuleMember コマンドレットを使用して、モジュールのすべての関数のうち TargetResource サフィックスが付いた関数をエクスポートします。最初のアプローチを使用する場合は、DSC リソースごとにモジュールのマニフェスト ファイルを作成するため、先ほどと同じ手順に従います。主な手順としては、New-ModuleManifest コマンドを実行し、生成した .psd1 ファイルを TrustedHosts フォルダー内に .psm1 ファイルと .Schema.mof ファイルを一緒に保存します。

# Exports the three functiona as part of the module
Export-ModuleMember -Function *-TargetResource

構成でのカスタム リソース TrustedHosts の使用

次に、構成スクリプトを作成して、新しい TrustedHosts カスタム リソースを使用します。この構成を localhost ノードに適用し、TrustedHosts リソースの 3 つのプロパティに値を指定します。構成スクリプトは、[PSCredential] 型の必須 Credential パラメーターを受け取ります。このパラメーターを、リソースの credential プロパティに割り当てます (図 5 参照)。

図 5 TrustedHosts リソース用の Get-TargetResource 関数

Configuration TestWinRMTrustedHosts
{
  param([parameter(mandatory)] [pscredential] $Credential)
  import-dscresource -modulename WinRM
  node localhost
    {
      TrustedHosts TrustedHostEntry
        {
          ComputerName = "Client01.Contoso.com"
          Ensure ="Present"
          Credential = $Credential
        }
    }
}

既定では、DSC はプレーンなテキストで資格情報を使用することを許可しません。構成データのハッシュテーブルを使用してこれを回避します。このハッシュテーブル内で、PSDSCAllowPlainTextPassword プロパティを追加し、値に true を設定します。PSDSCAllowPlainTextPassword ではパスワードをプレーンなテキストとして MOF ファイルに格納できるため、これはキュリティのリスクにつながります。パスワードをプレーンなテキストとして MOF ファイルに保存しないためのベスト プラクティスとしてセキュリティの証明書を使用し、次の構成データを使用して安全に送信するようにします。

$ConfigData = @{
AllNodes = @(
  @{
    NodeName = "localhost"
    PSDscAllowPlainTextPassword = $true   
  }
  )
}

次に、構成オブジェクトを作成します。そのためには、MOF ファイルの場所、ConfigurationData 変数、および Get-Credential コマンドと資格情報を渡して、構成スクリプトを実行します。

TestWinRMTrustedHosts -OutputPath "C:\CR" -ConfigurationData $ConfigData `
  -credential (get-credential)

このコマンドを実行すると、C:\CR に localhost.mof という MOF ファイルが生成されます。これを実行すると、ユーザー名とパスワードの入力が求められます。MOF ファイルを生成したら、次は PUSH モードで構成を適用します。これを行うには、Start-DscConfiguration コマンドを実行します。

Start-DscConfiguration -Wait -Force -Path "C:\CR" -Verbose

構成を適用後、ローカルホストの WinRM TrustedHosts 設定の値をチェックします。DC01 という ComputerName 値が、TrustedHosts 値に含まれるようになります。このカスタム リソースを使用して、TrustedHosts 値にコンピューター名を追加または削除できます。

Import-DSCResource

カスタム リソースのデザイン時検証を実行するために、Import-DSCResource を使用してカスタム リソースを構成スクリプトにインポートします。これは、カスタム リソースを適切に作成するもう 1 つの方法です。カスタム リソースは、C:\ProgramFiles\WindowsPowerShell\Modules にあります。このようなモジュールをインポートして読み込むには、Import-DSCResource 関数を使用します。Import-DSCResource は動的関数で、構成スクリプトでのみ利用できます。この関数は構成ブロック外に配置できず、2 つのパラメーターを順序を問わず受け取ります。

  1. ModuleName: インポートするモジュールの名前。
  2. Name: インポートするリソースの名前。

ModuleName 引数だけを指定し、Name を指定しないと、モジュール内にある利用可能なリソースがすべてインポートされます。このアプローチを使用して、サンプル構成の TrustedHosts リソースを読み込むことができます。

Import-DSCResource –ModuleName WinRM

Name 引数だけを指定し、ModuleName を指定しないと、DSC は、$env:PSModulePath を使って利用可能なすべてのモジュールの場所を検索してリソースを検出します。リソースを見つけたら、そのリソースをインポートします。

Import-DSCResource –Name TrustedHosts

ModuleName 引数と Name 引数を両方指定すると、指定したモジュール名からリソースを読み込みインポートします。これは、DSC で広範な検索を行う必要がないため、リソースを見つけて読み込む非常に高速なメカニズムです。

Import-DSCResource –ModuleName WinRM –ResourceName TrustedHosts

コンマ区切りのリソース名を使用して、同時に複数のリソースを読み込むことができます。

まとめ

DSC は、新しいリソースを作成して構成で使用するために必要な拡張機能を開発者に提供します。Windows PowerShell は、必須の関数をいくつか実装することで、DSC カスタム リソースの作成を単純化します。このような関数は、実装でいくつかの規則に従う必要があります。

標準のリソースやコミュニティから入手したリソースがニーズに合わない場合に、独自のリソースを簡単に作成できます。今回は、完全な実装を使用して、シンプルなカスタム リソースを作成する方法を示しました。また、ファイルとフォルダーの構造を管理する規則を使用して、Windows PowerShell モジュール内にこのようなリソースをパッケージ化する方法についても説明しました。


Ritesh Modi* は、Microsoft Services のアーキテクトです。エンタープライズ ソリューションのビルドと配置に 10 年以上携わっています。Windows PowerShell、Desired State Configuration、および System Center の専門家です。TechEd で講演を行ったり、社内トレーニングを行っています。彼のブログは automationnext.wordpress.com (英語) で公開されています。連絡先は rimodi@microsoft.com (英語のみ) です。*

この記事のレビューに協力してくれた技術スタッフの Abhik Chatterjee に心より感謝いたします。