Import-DSCResource の使用
Import-DSCResource
は動的キーワードです。これは、Configuration で必要となるすべてのリソースをインポートするために、Configuration のスクリプト ブロック内でのみ使用できます。
$PSHOME
の下にあるリソースは自動的にインポートされますが、ご自身の Configuration 内で使用されるすべてのリソースを明示的にインポートするのがやはりベスト プラクティスと考えられます。
Import-DSCResource
の構文は次に示すとおりです。 モジュールを名前で指定するときは、1 行に 1 つずつ列記する必要があります。
Import-DscResource [-Name <ResourceName(s)>] [-ModuleName <ModuleName>] [-ModuleVersion <ModuleVersion>]
パラメーター
-
-Name
- インポートする必要がある DSC リソースの名前です。 モジュール名を指定した場合は、このコマンドにより、そのモジュール内でこれらの DSC リソースが検索されます。それ以外の場合は、このコマンドにより、すべての DSC リソース パスで DSC リソースが検索されます。 ワイルドカードを利用できます。 -
-ModuleName
- モジュール名またはモジュールの指定です。 モジュールからインポートするリソースを指定した場合は、このコマンドにより、それらのリソースだけのインポートが試みられます。 モジュールのみを指定した場合は、このコマンドにより、モジュール内のすべての DSC リソースがインポートされます。 -
-ModuleVersion
- PowerShell 5.0 以降では、構成で使用するモジュールのバージョンを指定できます。 詳細については、「インストールされているリソースの特定のバージョンをインポートする」を参照してください。
Import-DscResource -ModuleName xActiveDirectory
例:構成内で Import-DSCResource を使用する
Configuration MSDSCConfiguration
{
# Search for and imports Service, File, and Registry from the module PSDesiredStateConfiguration.
Import-DSCResource -ModuleName PSDesiredStateConfiguration -Name Service, File, Registry
# Search for and import Resource1 from the module that defines it.
# If only –Name parameter is used then resources can belong to different PowerShell modules as well.
# TimeZone resource is from the ComputerManagementDSC module which is not installed by default.
# As a best practice, list each requirement on a different line if possible. This makes reviewing
# multiple changes in source control a bit easier.
Import-DSCResource -Name File
Import-DSCResource -Name TimeZone
# Search for and import all DSC resources inside the module PSDesiredStateConfiguration.
# When specifying the modulename parameter, it is a requirement to list each on a new line.
Import-DSCResource -ModuleName PSDesiredStateConfiguration
# In PowerShell 5.0 and later, you can specify a ModuleVersion parameter
Import-DSCResource -ModuleName ComputerManagementDsc -ModuleVersion 6.0.0.0
...
Note
同じコマンド内でリソース名およびモジュール名に複数の値を指定することはサポートされていません。 同じリソースが複数のモジュールに存在する場合、どのモジュールからどのリソースが読み込まれるかについて、決定論的でない動作が含まれることがあります。 次のコマンドでは、コンパイル中にエラーが発生します。
Import-DscResource -Name UserConfigProvider*,TestLogger1 -ModuleName UserConfigProv,PsModuleForTestLogger
Name パラメーターのみを使用するときに考慮すべき事項:
- コンピューターにインストールされているモジュールの数によっては、リソースを大量に消費する操作です。
- 指定した名前で最初に見つかったリソースが読み込まれます。 同じ名前で複数のリソースがインストールされている場合は、間違ったリソースが読み込まれる可能性があります。
推奨される使用方法は、以下で説明するように、-Name
パラメーターと共に –ModuleName
を指定することです。
この使用方法には次のようなメリットがあります。
- 指定したリソースに検索範囲が制限されるため、パフォーマンスへの影響が減少します。
- リソースが定義されているモジュールを明示的に定義することで、正しいリソースが確実に読み込まれます。
Note
PowerShell 5.0 では、DSC リソースに複数バージョンを用意することができ、コンピューターにその複数のバージョンをサイド バイ サイドでインストールできます。 これを実装するには、リソース モジュールの複数のバージョンを同じモジュール フォルダーに格納します。 詳細については、「複数のバージョンがあるリソースの使用」を参照してください。
Import-DSCResource での IntelliSense
ISE で DSC 構成を作成する場合、PowerShell はリソースとリソースのプロパティに IntelliSense を提供します。
$pshome
モジュール パスの下にあるリソースの定義が、自動的に読み込まれます。
Import-DSCResource
キーワードを使ってリソースをインポートすると、指定したリソース定義が追加されて、インポートされたリソースのスキーマを含むように IntelliSence が拡張されます。
Note
PowerShell 5.0 以降では、DSC リソースとそのプロパティ用の ISE に対して Tab 補完機能が追加されました。 詳しくは、リソースに関する記事をご覧ください。
Configuration をコンパイルするとき、PowerShell では、インポートされたリソース定義を使って、構成内のすべてのリソース ブロックが検証されます。 リソースのスキーマ定義を使って、各リソース ブロックで次の規則が検証されます。
- スキーマで定義されているプロパティのみが使用されている。
- 各プロパティのデータ型が正しい。
- キー プロパティが指定されている。
- 読み取り専用プロパティが使用されていない。
- 値の検証が型にマップされる。
以下のような構成について考えます。
Configuration SchemaValidationInCorrectEnumValue
{
# It is best practice to explicitly import all resources used in your Configuration.
# This includes resources that are imported automatically, like WindowsFeature.
Import-DSCResource -Name WindowsFeature
Node localhost
{
WindowsFeature ROLE1
{
Name = "Telnet-Client"
Ensure = "Invalid"
}
}
}
この Configuration をコンパイルすると、結果はエラーになります。
PSDesiredStateConfiguration\WindowsFeature: At least one of the values 'Invalid' is not supported or
valid for property 'Ensure' on class 'WindowsFeature'. Please specify only supported values:
Present, Absent.
IntelliSence とスキーマ検証により、解析とコンパイル時の間にさらに多くのエラーをキャッチでき、実行時の問題を回避できます。
Note
各 DSC リソースは、名前と、リソースのスキーマによって定義された FriendlyName を持つことができます。 "MSFT_ServiceResource.shema.mof" の先頭の 2 行を次に示します。
[ClassVersion("1.0.0"),FriendlyName("Service")]
class MSFT_ServiceResource : OMI_BaseResource
このリソースを Configuration で使用するときは、MSFT_ServiceResource または Service を指定できます。
PowerShell の v4 と v5 の違い
Configuration を作成するときに、複数の相違点が PowerShell 4.0 と PowerShell 5.0 以降の間に存在します。 このセクションでは、特にこの記事に関連する相違点を示します。
複数のリソース バージョン
複数のバージョンのリソースのサイド バイ サイドでのインストールと使用は、PowerShell 4.0 ではサポートされていませんでした。 リソースをご自身の Configuration にインポートするときに問題がある場合は、インストールされているリソースのバージョンが 1 つだけであることを確認してください。
次の図では、2 つのバージョンの xPSDesiredStateConfiguration モジュールがインストールされています。
必要なモジュールのバージョンの内容を、モジュール ディレクトリの最上位レベルにコピーします。
リソースの場所
Configuration を作成してコンパイルするとき、PSModulePath で指定した任意のディレクトリにリソースを格納できます。
PowerShell 4.0 の LCM では、すべての DSC リソース モジュールが "Program Files\WindowsPowerShell\Modules" または $pshome\Modules
に格納されている必要があります。 PowerShell 5.0 以降では、この要件はなくなり、PSModulePath
で指定した任意のディレクトリにリソース モジュールを格納できます。
ModuleVersion の追加
PowerShell 5.0 以降では、-ModuleVersion
パラメーターを使用すると、構成内で使用するモジュールのバージョンを指定できます。