Recursos compostos: utilizar uma configuração do DSC como recurso
Aplica-se a: Windows PowerShell 4.0, Windows PowerShell 5.0
Em situações reais, as configurações podem tornar-se longas e complexas, chamando muitos recursos diferentes e definindo um vasto número de propriedades. Para ajudar a resolver esta complexidade, pode utilizar uma configuração de Windows PowerShell Desired State Configuration (DSC) como um recurso para outras configurações. Isto chama-se recurso composto. Um recurso composto é uma configuração do DSC que utiliza parâmetros. Os parâmetros da configuração funcionam como as propriedades do recurso.
A configuração é guardada como um ficheiro com uma .schema.psm1
extensão. Assume o lugar do esquema MOF e do script de recursos num recurso DSC típico. Para obter mais informações sobre os recursos do DSC, veja Windows PowerShell Desired State Configuration Resources (Recursos do Windows PowerShell Desired State Configuration).
Criar o recurso composto
No nosso exemplo, criamos uma configuração que invoca vários recursos existentes para configurar máquinas virtuais. Em vez de especificar os valores a definir nos blocos de configuração, a configuração utiliza parâmetros que são utilizados nos blocos de configuração.
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")
}
}
}
Nota
Atualmente, o DSC não suporta a colocação de recursos compostos ou configurações aninhadas num recurso composto.
Guardar a configuração como um recurso composto
Para utilizar a configuração parametrizada como um recurso DSC, guarde-a numa estrutura de diretório como a de qualquer outro recurso baseado em MOF e dê-lhe um nome com uma .schema.psm1
extensão. Neste exemplo, vamos atribuir o nome ao ficheiro xVirtualMachine.schema.psm1
. Também tem de criar um manifesto com o nome xVirtualMachine.psd1
que contém a seguinte linha.
RootModule = 'xVirtualMachine.schema.psm1'
Nota
Isto para além MyDscResources.psd1
de , o manifesto do módulo para todos os recursos na MyDscResources
pasta.
Quando terminar, a estrutura da pasta deve ser a seguinte.
$env: psmodulepath
|- MyDscResources
|- MyDscResources.psd1
|- DSCResources
|- xVirtualMachine
|- xVirtualMachine.psd1
|- xVirtualMachine.schema.psm1
O recurso é agora detetável com o Get-DscResource
cmdlet e as respetivas propriedades são detetáveis por esse cmdlet ou através da conclusão automática doEspaçoCtrl+ na Windows PowerShell ISE.
Utilizar o recurso composto
Em seguida, criamos uma configuração que chama o recurso composto. Esta configuração chama o recurso composto xVirtualMachine para criar uma máquina virtual e, em seguida, chama o recurso xComputer para mudar o nome.
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"
}
}
}
Também pode utilizar este recurso para criar várias VMs ao transmitir uma matriz de nomes de VMs para o recurso 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"
}
}
}
Suportar PsDscRunAsCredential
Nota
O PsDscRunAsCredential é suportado no PowerShell 5.0 e posterior.
A propriedade PsDscRunAsCredential pode ser utilizada no bloco de recursos de configurações do DSC para especificar que o recurso deve ser executado num conjunto especificado de credenciais. Para obter mais informações, veja Executar o DSC com credenciais de utilizador.
Para aceder ao contexto do utilizador a partir de um recurso personalizado, pode utilizar a variável $PsDscContext
automática .
Por exemplo, o código seguinte escreveria o contexto de utilizador no qual o recurso está em execução no fluxo de saída verboso:
if ($PsDscContext.RunAsUser) {
Write-Verbose "User: $PsDscContext.RunAsUser";
}