在实际情况下,DSC 配置可能会变得漫长而复杂,需要调用多个不同的 DSC 资源并设置数十个属性。 为了帮助解决这种复杂性,可以将 DSC 配置用作其他 DSC 配置的 DSC 资源。 这称为复合 DSC 资源。 复合 DSC 资源是采用参数的 DSC 配置。 DSC 配置的参数充当 DSC 资源的属性。 DSC 配置保存为扩展名的文件 .schema.psm1
。 有关 DSC 资源的详细信息,请参阅 DSC 资源。
重要
复合 DSC 资源不适用于 Invoke-DscResource
。 在 DSC 2.0 及更高版本中,它们仅支持与 Azure Automanage 的计算机配置功能配合使用。
创建复合资源
在我们的示例中,我们将创建一个配置,该配置调用多个现有资源来配置虚拟机。 配置采用了之后将在配置块中使用的参数,而没有指定应该在配置块中设置的值。
Configuration xVirtualMachine {
param(
# Name of VMs
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[String[]] $VMName,
# Name of Switch to create
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[String] $SwitchName,
# Type of Switch to create
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[String] $SwitchType,
# Source Path for VHD
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[String] $VHDParentPath,
# Destination path for diff VHD
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[String] $VHDPath,
# Startup Memory for VM
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[String] $VMStartupMemory,
# State of the VM
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[String] $VMState
)
# Import the module that defines custom resources
Import-DSCResource -ModuleName xComputerManagement, xHyper-V
# Install the Hyper-V role
WindowsFeature HyperV {
Ensure = 'Present'
Name = 'Hyper-V'
}
# Create the virtual switch
xVMSwitch $SwitchName {
Ensure = 'Present'
Name = $SwitchName
Type = $SwitchType
DependsOn = '[WindowsFeature]HyperV'
}
# Check for Parent VHD file
File ParentVHDFile {
Ensure = 'Present'
DestinationPath = $VHDParentPath
Type = 'File'
DependsOn = '[WindowsFeature]HyperV'
}
# Check the destination VHD folder
File VHDFolder {
Ensure = 'Present'
DestinationPath = $VHDPath
Type = 'Directory'
DependsOn = '[File]ParentVHDFile'
}
# Create VM specific diff VHD
foreach ($Name in $VMName) {
xVHD "VHD$Name" {
Ensure = 'Present'
Name = $Name
Path = $VHDPath
ParentPath = $VHDParentPath
DependsOn = @(
'[WindowsFeature]HyperV'
'[File]VHDFolder'
)
}
}
# Create VM using the above VHD
foreach($Name in $VMName) {
xVMHyperV "VMachine$Name" {
Ensure = 'Present'
Name = $Name
VhdPath = (Join-Path -Path $VHDPath -ChildPath $Name)
SwitchName = $SwitchName
StartupMemory = $VMStartupMemory
State = $VMState
MACAddress = $MACAddress
WaitForIP = $true
DependsOn = @(
"[WindowsFeature]HyperV"
"[xVHD]VHD$Name"
)
}
}
}
注意
DSC 不支持在复合 DSC 资源定义中放置复合 DSC 资源块。
将 DSC 配置另存为复合 DSC 资源
若要将参数化 DSC 配置用作 DSC 资源,请将其保存在目录结构(如 基于 MOF 的 DSC 资源的目录结构中),并使用扩展将其 .schema.psm1
命名。 在此示例中,我们将文件命名为 xVirtualMachine.schema.psm1
。 你还需要创建一个名为 xVirtualMachine.psd1
并包含下列行的清单。
RootModule = 'xVirtualMachine.schema.psm1'
注意
这独立于 MyDscResources.psd1
文件夹下 MyDscResources
所有 DSC 资源的模块清单。
完成操作后,文件夹结构应如下所示。
$env: psmodulepath
|- MyDscResources
|- MyDscResources.psd1
|- DSCResources
|- xVirtualMachine
|- xVirtualMachine.psd1
|- xVirtualMachine.schema.psm1
DSC 资源现在可通过 Get-DscResource
cmdlet 发现,其属性可通过该 cmdlet 或 VS Code 中的 Ctrl+Space 自动完成来发现。
使用复合资源
接下来,我们将创建一个 DSC 配置,用于调用复合 DSC 资源。 此 DSC 配置调用 xVirtualMachine
复合 DSC 资源来创建虚拟机。
Configuration CreateVM {
Import-DSCResource -ModuleName xVirtualMachine
xVirtualMachine VM {
VMName = "Test"
SwitchName = "Internal"
SwitchType = "Internal"
VhdParentPath = "C:\Demo\VHD\RTM.vhd"
VHDPath = "C:\Demo\VHD"
VMStartupMemory = 1024MB
VMState = "Running"
}
}
还可以使用此复合 DSC 资源通过为复合 DSC 资源的 VMName 属性传入 VM 名称数组来创建多个 VM。
Configuration MultipleVms {
Import-DSCResource -ModuleName xVirtualMachine
xVirtualMachine VMs {
VMName = @(
"IIS01"
"SQL01"
"SQL02"
)
SwitchName = "Internal"
SwitchType = "Internal"
VhdParentPath = "C:\Demo\VHD\RTM.vhd"
VHDPath = "C:\Demo\VHD"
VMStartupMemory = 1024MB
VMState = "Running"
}
}