Een aangepaste DSC-resource schrijven met MOF
Van toepassing op: Windows PowerShell 4.0, Windows PowerShell 5.0
In dit artikel definiëren we het schema voor een aangepaste dsc-resource (Windows PowerShell Desired State Configuration) in een MOF-bestand en implementeren we de resource in een Windows PowerShell scriptbestand. Deze aangepaste resource is bedoeld voor het maken en onderhouden van een website.
Het MOF-schema maken
Het schema definieert de eigenschappen van uw resource die kunnen worden geconfigureerd door een DSC-configuratiescript.
Mapstructuur voor een MOF-resource
Als u een aangepaste DSC-resource met een MOF-schema wilt implementeren, maakt u de volgende mapstructuur. Het MOF-schema wordt gedefinieerd in het bestand Demo_IISWebsite.schema.mof
en het resourcescript wordt gedefinieerd in Demo_IISWebsite.psm1
. U kunt desgewenst een modulemanifestbestand (psd1) maken.
$env:ProgramFiles\WindowsPowerShell\Modules (folder)
|- MyDscResources (folder)
|- MyDscResources.psd1 (file, required)
|- DSCResources (folder)
|- Demo_IISWebsite (folder)
|- Demo_IISWebsite.psd1 (file, optional)
|- Demo_IISWebsite.psm1 (file, required)
|- Demo_IISWebsite.schema.mof (file, required)
Notitie
Het is noodzakelijk om een map met de naam DSCResources onder de map op het hoogste niveau te maken en dat de map voor elke resource dezelfde naam moet hebben als de resource.
De inhoud van het MOF-bestand
Hieronder volgt een voorbeeld van een MOF-bestand dat kan worden gebruikt voor een aangepaste websiteresource. Als u dit voorbeeld wilt volgen, slaat u dit schema op in een bestand en roept u het bestand Demo_IISWebsite.schema.mof
aan.
[ClassVersion("1.0.0"), FriendlyName("Website")]
class Demo_IISWebsite : OMI_BaseResource
{
[Key] string Name;
[Required] string PhysicalPath;
[write,ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] string Ensure;
[write,ValueMap{"Started","Stopped"},Values{"Started", "Stopped"}] string State;
[write] string Protocol[];
[write] string BindingInfo[];
[write] string ApplicationPool;
[read] string ID;
};
Let op het volgende over de vorige code:
FriendlyName
definieert de naam die u kunt gebruiken om te verwijzen naar deze aangepaste resource in DSC-configuratiescripts. In dit voorbeeldWebsite
is gelijk aan de beschrijvende naamArchive
voor de ingebouwde archiefresource.- De klasse die u voor uw aangepaste resource definieert, moet zijn afgeleid van
OMI_BaseResource
. - De typekwalificatie,
[Key]
, voor een eigenschap geeft aan dat deze eigenschap het resource-exemplaar uniek identificeert. Er is ten minste één[Key]
eigenschap vereist. - De
[Required]
kwalificatie geeft aan dat de eigenschap vereist is (een waarde moet worden opgegeven in een configuratiescript dat gebruikmaakt van deze resource). - De
[write]
kwalificatie geeft aan dat deze eigenschap optioneel is bij het gebruik van de aangepaste resource in een configuratiescript. De[read]
kwalificatie geeft aan dat een eigenschap niet kan worden ingesteld door een configuratie en is alleen voor rapportagedoeleinden. Values
beperkt de waarden die kunnen worden toegewezen aan de eigenschap tot de lijst met waarden die zijn gedefinieerd inValueMap
. Zie ValueMap en Value Qualifiers voor meer informatie.- Het opnemen van een eigenschap met de naam
Ensure
waardenPresent
enAbsent
in uw resource wordt aanbevolen als een manier om een consistente stijl te behouden met ingebouwde DSC-resources. - Geef het schemabestand voor uw aangepaste resource de volgende naam:
classname.schema.mof
, waarbijclassname
de id is die het trefwoord in uwclass
schemadefinitie volgt.
Het resourcescript schrijven
Met het resourcescript wordt de logica van de resource geïmplementeerd. In deze module moet u drie functies opnemen met de naam Get-TargetResource
, Set-TargetResource
en Test-TargetResource
. Alle drie de functies moeten een parameterset hebben die identiek is aan de set eigenschappen die is gedefinieerd in het MOF-schema dat u voor uw resource hebt gemaakt. In dit document wordt deze set eigenschappen aangeduid als de 'resource-eigenschappen'. Sla deze drie functies op in een bestand met de naam <ResourceName>.psm1
. In het volgende voorbeeld worden de functies opgeslagen in een bestand met de naam Demo_IISWebsite.psm1
.
Notitie
Wanneer u hetzelfde configuratiescript meerdere keren op uw resource uitvoert, ontvangt u geen fouten en moet de resource in dezelfde status blijven als het uitvoeren van het script. Om dit te bereiken, moet u ervoor zorgen dat de Get-TargetResource
functies en Test-TargetResource
de resource ongewijzigd blijven en dat het meerdere keren aanroepen van de Set-TargetResource
functie in een reeks met dezelfde parameterwaarden altijd gelijk is aan het eenmaal aanroepen ervan.
Gebruik in de functie-implementatie Get-TargetResource
de waarden van de sleutelresource-eigenschap die als parameters worden opgegeven om de status van het opgegeven resource-exemplaar te controleren. Deze functie moet een hash-tabel retourneren met alle resource-eigenschappen als sleutels en de werkelijke waarden van deze eigenschappen als de bijbehorende waarden. De volgende code biedt een voorbeeld.
# DSC uses the Get-TargetResource function to fetch the status of the resource instance
# specified in the parameters for the target machine
function Get-TargetResource
{
param
(
[ValidateSet("Present", "Absent")]
[string]$Ensure = "Present",
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$Name,
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$PhysicalPath,
[ValidateSet("Started", "Stopped")]
[string]$State = "Started",
[string]$ApplicationPool,
[string[]]$BindingInfo,
[string[]]$Protocol
)
$getTargetResourceResult = $null;
<#
Insert logic that uses the mandatory parameter values to get the website and
assign it to a variable called $Website
Set $ensureResult to "Present" if the requested website exists and to "Absent" otherwise
#>
# Add all Website properties to the hash table
# This simple example assumes that $Website is not null
$getTargetResourceResult = @{
Name = $Website.Name
Ensure = $ensureResult
PhysicalPath = $Website.physicalPath
State = $Website.state
ID = $Website.id
ApplicationPool = $Website.applicationPool
Protocol = $Website.bindings.Collection.protocol
Binding = $Website.bindings.Collection.bindingInformation
}
$getTargetResourceResult
}
Afhankelijk van de waarden die zijn opgegeven voor de resource-eigenschappen in het configuratiescript, moet de Set-TargetResource
een van de volgende handelingen uitvoeren:
- Een nieuwe website maken
- Een bestaande website bijwerken
- Een bestaande website verwijderen
In het volgende voorbeeld ziet u dit.
# The Set-TargetResource function is used to create, delete or configure a website on the target machine.
function Set-TargetResource
{
[CmdletBinding(SupportsShouldProcess=$true)]
param
(
[ValidateSet("Present", "Absent")]
[string]$Ensure = "Present",
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$Name,
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$PhysicalPath,
[ValidateSet("Started", "Stopped")]
[string]$State = "Started",
[string]$ApplicationPool,
[string[]]$BindingInfo,
[string[]]$Protocol
)
<#
If Ensure is set to "Present" and the website specified in the mandatory input parameters
does not exist, then create it using the specified parameter values
Else, if Ensure is set to "Present" and the website does exist, then update its properties
to match the values provided in the non-mandatory parameter values
Else, if Ensure is set to "Absent" and the website does not exist, then do nothing
Else, if Ensure is set to "Absent" and the website does exist, then delete the website
#>
}
Ten slotte moet de Test-TargetResource
functie dezelfde parameterset hebben als Get-TargetResource
en Set-TargetResource
. Controleer in uw implementatie van Test-TargetResource
de status van het resource-exemplaar dat is opgegeven in de sleutelparameters. Als de werkelijke status van het resource-exemplaar niet overeenkomt met de waarden die zijn opgegeven in de parameterset, retourneert $false
u . Anders retourneert $true
u .
Met de volgende code wordt de Test-TargetResource
functie geïmplementeerd.
function Test-TargetResource
{
[CmdletBinding()]
[OutputType([System.Boolean])]
param
(
[ValidateSet("Present","Absent")]
[System.String]
$Ensure,
[parameter(Mandatory = $true)]
[System.String]
$Name,
[parameter(Mandatory = $true)]
[System.String]
$PhysicalPath,
[ValidateSet("Started","Stopped")]
[System.String]
$State,
[System.String[]]
$Protocol,
[System.String[]]
$BindingData,
[System.String]
$ApplicationPool
)
# Get the current state
$currentState = Get-TargetResource -Ensure $Ensure -Name $Name -PhysicalPath $PhysicalPath -State $State -ApplicationPool $ApplicationPool -BindingInfo $BindingInfo -Protocol $Protocol
# Write-Verbose "Use this cmdlet to deliver information about command processing."
# Write-Debug "Use this cmdlet to write debug information while troubleshooting."
# Include logic to
$result = [System.Boolean]
# Add logic to test whether the website is present and its status matches the supplied
# parameter values. If it does, return true. If it does not, return false.
$result
}
Notitie
Voor eenvoudigere foutopsporing gebruikt u de Write-Verbose
cmdlet in uw implementatie van de vorige drie functies. Deze cmdlet schrijft tekst naar de uitgebreide berichtenstroom. Standaard wordt de uitgebreide berichtenstroom niet weergegeven, maar u kunt deze weergeven door de waarde van de variabele $VerbosePreference te wijzigen of door de parameter Uitgebreid in de DSC-cmdlets = nieuw te gebruiken.
Het modulemanifest maken
Gebruik ten slotte de New-ModuleManifest
cmdlet om een <ResourceName>.psd1
bestand voor uw aangepaste resourcemodule te definiëren. Wanneer u deze cmdlet aanroept, verwijst u naar het scriptmodulebestand (.psm1) dat in de vorige sectie wordt beschreven. Neem Get-TargetResource
, Set-TargetResource
en Test-TargetResource
op in de lijst met functies die u wilt exporteren. Hier volgt een voorbeeld van een manifestbestand.
# Module manifest for module 'Demo.IIS.Website'
#
# Generated on: 1/10/2013
#
@{
# Script module or binary module file associated with this manifest.
# RootModule = ''
# Version number of this module.
ModuleVersion = '1.0'
# ID used to uniquely identify this module
GUID = '6AB5ED33-E923-41d8-A3A4-5ADDA2B301DE'
# Author of this module
Author = 'Contoso'
# Company or vendor of this module
CompanyName = 'Contoso'
# Copyright statement for this module
Copyright = 'Contoso. All rights reserved.'
# Description of the functionality provided by this module
Description = 'This Module is used to support the creation and configuration of IIS Websites through Get, Set and Test API on the DSC managed nodes.'
# Minimum version of the Windows PowerShell engine required by this module
PowerShellVersion = '4.0'
# Minimum version of the common language runtime (CLR) required by this module
CLRVersion = '4.0'
# Modules that must be imported into the global environment prior to importing this module
RequiredModules = @("WebAdministration")
# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
NestedModules = @("Demo_IISWebsite.psm1")
# Functions to export from this module
FunctionsToExport = @("Get-TargetResource", "Set-TargetResource", "Test-TargetResource")
# Cmdlets to export from this module
#CmdletsToExport = '*'
# HelpInfo URI of this module
# HelpInfoURI = ''
}
Ondersteuning voor PsDscRunAsCredential
Notitie
PsDscRunAsCredential wordt ondersteund in PowerShell 5.0 en hoger.
De eigenschap PsDscRunAsCredential kan worden gebruikt in het resourceblok DSC-configuraties om op te geven dat de resource moet worden uitgevoerd onder een opgegeven set referenties. Zie DSC uitvoeren met gebruikersreferenties voor meer informatie.
Als u toegang wilt krijgen tot de gebruikerscontext vanuit een aangepaste resource, kunt u de automatische variabele $PsDscContext
gebruiken.
De volgende code schrijft bijvoorbeeld de gebruikerscontext waaronder de resource wordt uitgevoerd naar de uitgebreide uitvoerstroom:
if (PsDscContext.RunAsUser) {
Write-Verbose "User: $PsDscContext.RunAsUser";
}
Het knooppunt opnieuw opstarten
Als de acties in uw Set-TargetResource
functie opnieuw moeten worden opgestart, kunt u een globale vlag gebruiken om de LCM te laten weten dat het knooppunt opnieuw moet worden opgestart. Deze herstart vindt direct plaats nadat de Set-TargetResource
functie is voltooid.
Voeg in uw Set-TargetResource
functie de volgende regel code toe.
# Include this line if the resource requires a system reboot.
$global:DSCMachineStatus = 1
Om ervoor te zorgen dat de LCM het knooppunt opnieuw kan opstarten, moet de vlag RebootNodeIfNeeded worden ingesteld op $true
.
De instelling ActionAfterReboot moet ook worden ingesteld op ContinueConfiguration. Dit is de standaardinstelling. Zie De lokale Configuration Manager configureren of De lokale Configuration Manager(v4) configureren voor meer informatie over het configureren van de LCM.