Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: Windows PowerShell 4.0, Windows PowerShell 5.0
В реальных ситуациях конфигурации могут быть длительными и сложными, вызывая множество различных ресурсов и устанавливая огромное количество свойств. Чтобы решить эту сложность, можно использовать конфигурацию Windows PowerShell Desired State Configuration (DSC) в качестве ресурса для других конфигураций. Это называется составным ресурсом. Составной ресурс — это конфигурация DSC, которая принимает параметры. Параметры конфигурации выступают в качестве свойств ресурса.
Конфигурация сохраняется в виде файла с расширением .schema.psm1 . Он заменяет как схему MOF, так и сценарий ресурса в типичном ресурсе DSC. Дополнительные сведения о ресурсах DSC см. в разделе Ресурсы конфигурации требуемого состояния Windows PowerShell.
Создание составного ресурса
В нашем примере мы создаем конфигурацию, которая вызывает ряд существующих ресурсов для настройки виртуальных машин. Вместо указания значений, которые должны быть установлены в блоках конфигурации, конфигурация принимает параметры, которые затем используются в блоках конфигурации.
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, сохраните ее в структуре каталогов, как у любого другого ресурса на основе MOF, и присвойте ей имя с расширением .schema.psm1 . В этом примере мы назовем файл xVirtualMachine.schema.psm1. Кроме того, необходимо создать манифест с именем xVirtualMachine.psd1 , содержащим следующую строку.
RootModule = 'xVirtualMachine.schema.psm1'
Замечание
Это в дополнение к MyDscResources.psd1манифесту модуля для всех ресурсов в MyDscResources папке.
Когда вы закончите, структура папок должна быть следующей.
$env: psmodulepath
|- MyDscResources
|- MyDscResources.psd1
|- DSCResources
|- xVirtualMachine
|- xVirtualMachine.psd1
|- xVirtualMachine.schema.psm1
Теперь ресурс можно обнаружить с помощью Get-DscResource командлета, а его свойства можно обнаружить либо с помощью этого командлета, либо с помощью автозаполнения Ctrl+Space в интегрированной среде сценариев Windows PowerShell.
Использование составного ресурса
Далее мы создаем конфигурацию, которая вызывает составной ресурс. Эта конфигурация вызывает составной ресурс xVirtualMachine для создания виртуальной машины, а затем вызывает ресурс xComputer для ее переименования.
configuration RenameVM
{
Import-DSCResource -ModuleName xVirtualMachine
Node localhost
{
xVirtualMachine VM
{
VMName = "Test"
SwitchName = "Internal"
SwitchType = "Internal"
VhdParentPath = "C:\Demo\VHD\RTM.vhd"
VHDPath = "C:\Demo\VHD"
VMStartupMemory = 1024MB
VMState = "Running"
}
}
Node "192.168.10.1"
{
xComputer Name
{
Name = "SQL01"
DomainName = "fourthcoffee.com"
}
}
}
Вы также можете использовать этот ресурс для создания нескольких виртуальных машин, передав массив имен виртуальных машин в ресурс xVirtualMachine.
Configuration MultipleVms
{
Import-DSCResource -ModuleName xVirtualMachine
Node localhost
{
xVirtualMachine VMs
{
VMName = "IIS01", "SQL01", "SQL02"
SwitchName = "Internal"
SwitchType = "Internal"
VhdParentPath = "C:\Demo\VHD\RTM.vhd"
VHDPath = "C:\Demo\VHD"
VMStartupMemory = 1024MB
VMState = "Running"
}
}
}
Поддержка PsDscRunAsCredential
Замечание
PsDscRunAsCredential поддерживается в PowerShell 5.0 и более поздних версиях.
Свойство PsDscRunAsCredential можно использовать в блоке ресурсов конфигураций DSC , чтобы указать, что ресурс должен запускаться с указанным набором учетных данных. Дополнительные сведения см. в разделе Запуск DSC с учетными данными пользователя.
Чтобы получить доступ к пользовательскому контексту из пользовательского ресурса, можно использовать переменную $PsDscContextautomatic .
Например, следующий код запишет пользовательский контекст, в котором выполняется ресурс, в подробный поток вывода:
if ($PsDscContext.RunAsUser) {
Write-Verbose "User: $PsDscContext.RunAsUser";
}