Vytváření prostředku DSC založeného na MOF
Tento článek ukazuje, jak můžete vytvořit prostředek DSC založený na MOF napsáním schématu a vývojem modulu skriptu pro správu webu služby IIS.
Důležité
Od verze DSC 3.0 se nepodporují prostředky DSC založené na MOF. Pokud píšete nový prostředek DSC a chcete, aby fungoval s budoucími verzemi, napište místo toho prostředek DSC založený na třídě .
Vytvoření schématu MOF
Prostředek DSC založený na MOF musí mít soubor schématu (.mof
), který definuje spravovatelná nastavení pro softwarovou komponentu.
Vytvoření požadované struktury složek
Vytvořte následující strukturu složek. Schéma je definováno v souboru Demo_IISWebsite.schema.mof
a požadované funkce jsou definovány v Demo_IISWebsite.psm1
souboru .
Volitelně můžete vytvořit soubor manifestu (.psd1
) modulu.
$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)
Poznámka
Ve složce nejvyšší úrovně modulu musíte vytvořit složku s názvem DSCResources
. Složka pro každý prostředek DSC musí mít stejný název jako prostředek DSC.
Obsah souboru MOF
Následuje příklad souboru MOF, který popisuje vlastnosti webu pro prostředek DSC. Pokud chcete postupovat podle tohoto příkladu, uložte toto schéma do souboru s názvem Demo_IISWebsite.schema.mof
.
[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;
};
Všimněte si následujících informací o předchozím kódu:
- FriendlyName definuje název, který můžete použít pro odkaz na tento prostředek DSC. V tomto příkladu je
Website
FriendlyName . - Třída prostředku DSC musí být odvozena z
OMI_BaseResource
. - Kvalifikátor typu u vlastnosti označuje,
[Key]
že tato vlastnost jednoznačně identifikuje instanci prostředku. Každý prostředek DSC musí mít aspoň jednu[Key]
vlastnost. - Kvalifikátor
[Required]
označuje, že vlastnost je při použití tohoto prostředku DSC povinná. - Kvalifikátor
[write]
označuje, že tato vlastnost je volitelná. - Kvalifikátor
[read]
označuje, že prostředek DSC nemůže nastavit vlastnost a slouží pouze pro účely generování sestav. - Hodnoty omezují hodnoty, které lze přiřadit vlastnosti na seznam hodnot definovaných v ValueMap. Další informace najdete v tématech ValueMap a Value Kvalifikátory.
- Pro prostředky DSC, které může uživatel přidat a odebrat ze systému, se doporučuje zahrnout vlastnost s názvem Zajistit s hodnotami
Present
aAbsent
ve vašem prostředku DSC. - Pojmenujte soubor schématu pro prostředek DSC takto:
<classname>.schema.mof
, kde<classname>
je identifikátor, který následuje za klíčovým slovemclass
v definici schématu.
Psaní modulu skriptu
Skriptovací modul prostředku DSC založený na MOF implementuje logiku prostředku DSC. V tomto modulu musíte zahrnout tři funkce s názvem Get-TargetResource
, Set-TargetResource
a Test-TargetResource
. Všechny tři funkce musí mít sadu parametrů, která je identická se sadou vlastností definovaných ve schématu prostředku DSC. Uložte tyto tři funkce do souboru s názvem <ResourceName>.psm1
. V následujícím příkladu jsou funkce uloženy v souboru s názvem Demo_IISWebsite.psm1
.
Poznámka
Pokud použijete Invoke-DscResource
k nastavení požadovaného stavu se stejnými vlastnostmi více než jednou, neměly by se zobrazit žádné chyby a systém by měl zůstat ve stejném stavu jako po prvním použití. Chcete-li to provést, ujistěte se, že funkce Get-TargetResource
a Test-TargetResource
ponechá systém beze změny a že vyvolání Set-TargetResource
funkce více než jednou v sekvenci se stejnými hodnotami parametrů je vždy stejné jako vyvolání jednou.
V implementaci Get-TargetResource
funkce pomocí hodnot vlastností Key , které jsou zadané jako parametry, ověřte stav zadané instance prostředku DSC. Tato funkce musí vrátit tabulku hash, která obsahuje všechny vlastnosti prostředku DSC jako klíče a skutečné hodnoty těchto vlastností jako odpovídající hodnoty. Následující kód poskytuje příklad.
# The Get-TargetResource function is used to retrieve the current state of a
# website on the system.
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 hashtable
# This 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
}
V závislosti na hodnotách, které uživatel zadá pro vlastnosti prostředku DSC, Set-TargetResource
musí provést jednu z následujících věcí:
- Přidání nového webu
- Aktualizace existujícího webu
- Odebrání existujícího webu
Toto dokládá následující příklad.
# The Set-TargetResource function is used to add, update, or remove a website
# on the system.
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 doesn't exist, then add 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
#>
}
Test-TargetResource
Nakonec musí funkce převzít stejnou sadu parametrů jako Get-TargetResource
a Set-TargetResource
. V implementaci Test-TargetResource
nástroje ověřte aktuální stav systému podle hodnot zadaných v sadě parametrů. Pokud aktuální stav neodpovídá požadovanému stavu, vraťte $false
. V opačném případě vraťte $true
.
Následující kód implementuje Test-TargetResource
funkci.
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
$getParameters = @{
Ensure = $Ensure
Name = $Name
PhysicalPath = $PhysicalPath
State = $State
ApplicationPool = $ApplicationPool
BindingInfo = $BindingInfo
Protocol = $Protocol
}
$currentState = Get-TargetResource @getParameters
# 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
}
Poznámka
Pro snadnější ladění použijte rutinu Write-Verbose
v implementaci předchozích tří funkcí. Tato rutina zapisuje text do podrobného datového proudu zpráv. Ve výchozím nastavení se podrobný datový proud zpráv nezobrazuje, ale můžete ho $VerbosePreference
zobrazit změnou hodnoty proměnné nebo použitím parametru Verbose s Invoke-DscResource
.
Vytvoření manifestu modulu
Nakonec pomocí rutiny New-ModuleManifest
definujte <ResourceName>.psd1
soubor pro modul prostředků DSC. Jako hodnotu parametru NestedModules použijte soubor modulu skriptu (.psm1
) popsaný v předchozí části. Set-TargetResource
Jako hodnoty parametru FunctionsToExport zahrňte Get-TargetResource
, aTest-TargetResource
.
$ManifestParameters = @{
Path = 'Demo_IISWebsite.psd1'
NestedModules = 'Demo_IISWebsite.psm1'
FunctionsToExport = @(
'Get-TargetResource'
'Set-TargetResource'
'Test-TargetResource'
)
}
New-ModuleManifest @ManifestParameters
@{
# 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 = 'Create and configure IIS websites with DSC.'
# Minimum version of the Windows PowerShell engine required by this module
PowerShellVersion = '7.2'
# 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'
)
}
Restartování systému
Pokud akce provedené ve vaší Set-TargetResource
funkci vyžadují restartování, můžete pomocí globálního příznaku říct volajícímu, aby systém restartil.
Do funkce Set-TargetResource
přidejte následující řádek kódu.
# Include this line if the system requires a reboot.
$global:DSCMachineStatus = 1