MOF ile özel DSC kaynağı yazma
Şunlar için geçerlidir: Windows PowerShell 4.0, Windows PowerShell 5.0
Bu makalede, bir MOF dosyasındaki Windows PowerShell Desired State Configuration (DSC) özel kaynağının şemasını tanımlayacak ve kaynağı bir Windows PowerShell betik dosyasına uygulayacağız. Bu özel kaynak, bir web sitesi oluşturmaya ve bakımını sağlamaya yöneliktir.
MOF şeması oluşturma
Şema, kaynağınızın DSC yapılandırma betiği tarafından yapılandırılabilir özelliklerini tanımlar.
MOF kaynağı için klasör yapısı
MOF şemasına sahip bir DSC özel kaynağı uygulamak için aşağıdaki klasör yapısını oluşturun. MOF şeması dosyasında Demo_IISWebsite.schema.mof
tanımlanır ve kaynak betiği içinde Demo_IISWebsite.psm1
tanımlanır. İsteğe bağlı olarak, bir modül bildirimi (psd1) dosyası oluşturabilirsiniz.
$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)
Not
En üst düzey klasör altında DSCResources adlı bir klasör oluşturmak ve her kaynağın klasörünün kaynakla aynı ada sahip olması gerekir.
MOF dosyasının içeriği
Aşağıda, özel bir web sitesi kaynağı için kullanılabilecek örnek bir MOF dosyası verilmiştir. Bu örneği izlemek için bu şemayı bir dosyaya kaydedin ve dosyasını Demo_IISWebsite.schema.mof
çağırın.
[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;
};
Önceki kod hakkında aşağıdakilere dikkat edin:
FriendlyName
, DSC yapılandırma betiklerinde bu özel kaynağa başvurmak için kullanabileceğiniz adı tanımlar. Bu örnekte,Website
yerleşik Arşiv kaynağının kolay adıylaArchive
eşdeğerdir.- Özel kaynağınız için tanımladığınız sınıfın öğesinden
OMI_BaseResource
türetilmiş olması gerekir. - Bir özellik üzerindeki tür niteleyicisi,
[Key]
bu özelliğin kaynak örneğini benzersiz olarak tanımlayacağını gösterir. En az bir[Key]
özellik gereklidir. - Niteleyici özelliğin
[Required]
gerekli olduğunu gösterir (bu kaynağı kullanan herhangi bir yapılandırma betiğinde bir değer belirtilmelidir). - Niteleyici,
[write]
yapılandırma betiğinde özel kaynak kullanılırken bu özelliğin isteğe bağlı olduğunu gösterir. Niteleyici,[read]
bir özelliğin bir yapılandırma tarafından ayarlanamayacağını ve yalnızca raporlama amaçlı olduğunu gösterir. Values
özelliğine atanabilecek değerleri içindeValueMap
tanımlanan değerler listesiyle kısıtlar. Daha fazla bilgi için bkz . ValueMap ve Değer Belirleyicileri.- Yerleşik DSC kaynaklarıyla tutarlı bir stil korumanın bir yolu olarak, değerleri
Present
Absent
ve kaynağınıza adlıEnsure
bir özelliğin dahil olması önerilir. - Özel kaynağınızın şema dosyasını şu şekilde adlandırın:
classname.schema.mof
, buradaclassname
şema tanımınızdaki anahtar sözcüğü izleyenclass
tanımlayıcıdır.
Kaynak betiğini yazma
Kaynak betiği, kaynağın mantığını uygular. Bu modülde , Set-TargetResource
ve Test-TargetResource
adlı Get-TargetResource
üç işlev eklemelisiniz. Üç işlevin de kaynağınız için oluşturduğunuz MOF şemasında tanımlanan özellik kümesiyle aynı bir parametre kümesi alması gerekir. Bu belgede, bu özellik kümesi "kaynak özellikleri" olarak adlandırılır. Bu üç işlevi adlı <ResourceName>.psm1
bir dosyada depolayın. Aşağıdaki örnekte, işlevler adlı Demo_IISWebsite.psm1
bir dosyada depolanır.
Not
Kaynağınızda aynı yapılandırma betiğini birden çok kez çalıştırdığınızda hata almamalısınız ve kaynak betiği bir kez çalıştırmakla aynı durumda kalmalıdır. Bunu başarmak için ve Test-TargetResource
işlevlerinizin Get-TargetResource
kaynağı değiştirmeden bıraktığından ve işlevi aynı parametre değerleriyle bir dizide birden çok kez çağırmanın Set-TargetResource
her zaman bir kez çağrılmaya eşdeğer olduğundan emin olun.
Get-TargetResource
İşlev uygulamasında, belirtilen kaynak örneğinin durumunu denetlemek için parametre olarak sağlanan anahtar kaynak özelliği değerlerini kullanın. Bu işlev, tüm kaynak özelliklerini anahtar olarak ve bu özelliklerin gerçek değerlerini ilgili değerler olarak listeleyen bir karma tablo döndürmelidir. Aşağıdaki kod bir örnek sağlar.
# 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
}
Yapılandırma betiğindeki kaynak özellikleri için belirtilen değerlere bağlı olarak, Set-TargetResource
aşağıdakilerden birini yapmalısınız:
- Yeni web sitesi oluşturma
- Mevcut web sitesini güncelleştirme
- Mevcut web sitesini silme
Aşağıdaki örnek bunu göstermektedir.
# 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
#>
}
Son olarak, işlevi ve Test-TargetResource
ile aynı parametre kümesini Get-TargetResource
Set-TargetResource
almalıdır. uygulamanızda Test-TargetResource
, anahtar parametrelerinde belirtilen kaynak örneğinin durumunu denetleyin. Kaynak örneğinin gerçek durumu parametre kümesinde belirtilen değerlerle eşleşmiyorsa döndür.$false
Aksi takdirde döndür.$true
Aşağıdaki kod işlevini uygular Test-TargetResource
.
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
}
Not
Daha kolay hata ayıklama için önceki üç işlevi uygulamanızda cmdlet'ini kullanın Write-Verbose
. Bu cmdlet, ayrıntılı ileti akışına metin yazar. Varsayılan olarak, ayrıntılı ileti akışı görüntülenmez, ancak $VerbosePreference değişkeninin değerini değiştirerek veya DSC cmdlet'lerinde Verbose parametresini kullanarak = new değerini görüntüleyebilirsiniz.
Modül bildirimi oluşturma
Son olarak, cmdlet'ini New-ModuleManifest
kullanarak özel kaynak modülünüz için bir <ResourceName>.psd1
dosya tanımlayın. Bu cmdlet'i çağırdığınızda, önceki bölümde açıklanan betik modülü (.psm1) dosyasına başvurun. Dışarı Get-TargetResource
aktaracak işlevler listesine , Set-TargetResource
ve Test-TargetResource
ekleyin. Aşağıda örnek bir bildirim dosyası verilmiştir.
# 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 = ''
}
PsDscRunAsCredential desteği
Not
PsDscRunAsCredential , PowerShell 5.0 ve sonraki sürümlerde desteklenir.
PsDscRunAsCredential özelliği, kaynağın belirtilen kimlik bilgileri kümesi altında çalıştırılması gerektiğini belirtmek için DSC yapılandırmaları kaynak bloğunda kullanılabilir. Daha fazla bilgi için bkz . DSC'yi kullanıcı kimlik bilgileriyle çalıştırma.
Özel bir kaynağın içinden kullanıcı bağlamlarına erişmek için otomatik değişkenini $PsDscContext
kullanabilirsiniz.
Örneğin aşağıdaki kod, kaynağın altında çalıştığı kullanıcı bağlamını ayrıntılı çıkış akışına yazar:
if (PsDscContext.RunAsUser) {
Write-Verbose "User: $PsDscContext.RunAsUser";
}
Düğümü Yeniden Başlatma
İşlevinizde Set-TargetResource
yapılan eylemler yeniden başlatma gerektiriyorsa, LCM'ye Düğümü yeniden başlatmasını söylemek için genel bir bayrak kullanabilirsiniz. Bu yeniden başlatma, işlev tamamlandıktan hemen sonra Set-TargetResource
gerçekleşir.
İşlevinizin Set-TargetResource
içine aşağıdaki kod satırını ekleyin.
# Include this line if the resource requires a system reboot.
$global:DSCMachineStatus = 1
LCM'nin Node'u yeniden başlatması için RebootNodeIfNeeded bayrağının olarak ayarlanması $true
gerekir.
ActionAfterReboot ayarı da varsayılan değer olan ContinueConfiguration olarak ayarlanmalıdır. LCM'yi yapılandırma hakkında daha fazla bilgi için bkz. Yerel Configuration Manager Yapılandırma veya Yerel Configuration Manager Yapılandırma (v4).