Aracılığıyla paylaş


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.moftanımlanır ve kaynak betiği içinde Demo_IISWebsite.psm1tanı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ıyla Archive eşdeğerdir.
  • Özel kaynağınız için tanımladığınız sınıfın öğesinden OMI_BaseResourcetü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çinde ValueMaptanı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 PresentAbsent 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, burada classname şema tanımınızdaki anahtar sözcüğü izleyen class tanımlayıcıdır.

Kaynak betiğini yazma

Kaynak betiği, kaynağın mantığını uygular. Bu modülde , Set-TargetResourceve Test-TargetResourceadlı 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>.psm1bir dosyada depolayın. Aşağıdaki örnekte, işlevler adlı Demo_IISWebsite.psm1bir 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-TargetResourceSet-TargetResourcealmalı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-TargetResourceaktaracak işlevler listesine , Set-TargetResourceve 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 $PsDscContextkullanabilirsiniz.

Ö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ı $truegerekir. 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).