Kode

Skriv din egen PowerShell Desired State Configuration (DSC)-modul

PowerShell DSC er en fantastisk teknologi å ha i verktøybeltet for å administrere Windows-baserte servere. Dette innlegget er en del av en serie:


Når du får erfaring med PowerShell Desired State Configuration (DSC), kan du støtte på situasjoner der de tilgjengelige modulene ikke helt passer til det du ønsker å gjøre. Du kan skrive dine egne skriptressurser, men de skaleres dårlig, det er vanskelig å sende parametere, og de gir ingen metode for kryptering, etterlater passord i klartekst, men du kan skrive dine egne DSC-moduler.

I denne PowerShell DSC-opplæringen skal jeg forklare hvordan du skriver din første PowerShell DSC-modul.

Et verktøy som hjelper deg med å skrive PowerShell DSC-modulen

Å skrive din egen PowerShell DSC-modul er egentlig ikke så vanskelig. Den vanskeligste delen er å få filene og mappene på de riktige stedene fordi DSC er ganske spesifikk om hva som skal hvor. Microsoft innser imidlertid at dette kan være ganske frustrerende og har utviklet xDscResourceDesigner, en PowerShell-modul for å hjelpe deg i gang. Ved å bruke denne modulen kan du enkelt definere hvilke egenskaper ressursen din trenger, og den vil generere hele modulstrukturen for deg, inkludert MOF-skjemafilen. Hvis du er nybegynner, anbefaler jeg på det sterkeste å bruke denne modulen, det kan spare deg for mye frustrasjon. Og vil du ha fullstendig kontroll på dine koder, kan det være lurt å bruke GitHub.

Installerer xDscResourceDesigner

Installering av modulen er ikke forskjellig fra å installere andre moduler på systemet ditt:

Install-Module -Name xDscResourceDesigner

Å bruke xDscResourceDesigner

Å bruke xDscResourceDesigner er faktisk ganske enkelt, det er bare to funksjoner: New-DscResourceProperty og New-xDscResourceNew-DscResourceProperty er det du bruker til å definere egenskapene til DSC-ressursen din. Etter at du har gjort det, sender du denne informasjonen til New-xDscResource funksjonen, og den genererer alt du trenger for å implementere ressursen din:

-# Import the module for use
Import-Module -Name xDscResourceDesigner

# Define properties
$property1 = New-xDscResourceProperty -Name Property1 -Type String -Attribute Key
$property2 = New-xDscResourceProperty -Name Property2 -Type PSCredential -Attribute Write
$property3 = New-xDscResourceProperty -Name Property3 -Type String -Attribute Required -ValidateSet "Present", "Absent"

# Create my DSC Resource
New-xDscResource -Name DemoResource1 -Property $property1, $property2, $property3 -Path 'c:\Program Files\WindowsPowerShell\Modules' -ModuleName DemoModule

Og der har du det, din helt egen DSC-modul.

Forstå egenskapen for ressursattributt

For attributtkomponenten til en ressursegenskap i DSC er det fire mulige verdier:

  • Key
  • Read
  • Required
  • Write

Nøkkel (key)

Hver node som bruker ressursen din må ha en nøkkel som gjør noden unik. I likhet med databasetabeller trenger ikke denne nøkkelen å være en enkelt egenskap, men den kan bestå av flere egenskaper, som hver har nøkkelattributtet. I eksemplet ovenfor Property1 er nøkkelen vår for ressursen. Det kan imidlertid også gjøres på denne måten:

# Define properties
$property1 = New-xDscResourceProperty -Name Property1 -Type String -Attribute Key
$property2 = New-xDscResourceProperty -Name Property2 -Type PSCredential -Attribute Write
$property3 = New-xDscResourceProperty -Name Property3 -Type String -Attribute Required -ValidateSet "Present", "Absent"
$property4 = New-xDscResourceProperty -Name Property4 -Type String -Attribute Key
$property5 = New-xDscResourceProperty -Name Property5 -Type String -Attribute Key

I dette eksemplet er property1property4, og property5det som utgjør den unike verdien for noden. Nøkkelattributter er alltid skrivbare og er obligatoriske.

Lese (read)

Leseattributter er skrivebeskyttet og kan ikke ha verdier tilordnet dem.

Obligatorisk (required)

Nødvendige attributter er tilordnbare egenskaper som må spesifiseres når konfigurasjonen deklareres. Ved å bruke vårt eksempel ovenfra da vi opprettet ressursen vår, er Property3 egenskapen satt til å være påkrevd.

Skrive (write)

Skriveattributter er valgfrie attributter som du angir en verdi for når du definerer noden. I eksemplet Property2 er definert som et Write-attributt.

ValidateSet switch

Switchen ValidateSet er noe som kan brukes med nøkkel- eller skriveattributter som spesifiserer de tillatte verdiene for en gitt egenskap. I vårt eksempel har vi spesifisert at det Property3 bare kan være enten Absent eller Present. Enhver annen verdi vil resultere i en feil.

DSC modul fil- og mappestruktur

Enten du bestemte deg for å gjøre det selv eller bruke verktøyet, vil mappe- og filstrukturen se slik ut:

$env:ProgramFiles\WindowsPowerShell\Modules (folder)
    |- DemoModule (folder)
        |- DSCResources (folder)
            |- DemoResource1 (folder)
                |- DemoResource1.psd1 (file, optional)
                |- DemoResource1.psm1 (file, required)
                |- DemoResource1.schema.mof (file, required)

MOF-filen

MOF står for Managed Object Format og er språket som brukes til å beskrive Common Information Model (CIM) klasser. Ved å bruke eksemplet fra verktøyet for å hjelpe deg med å skrive modul delen, vil den resulterende MOF-filen se slik ut:

[ClassVersion("1.0.0.0"), FriendlyName("DemoResource1")]
class DemoResource1 : OMI_BaseResource
{
    [Key] String Property1;
    [Write, EmbeddedInstance("MSFT_Credential")] String Property2;
    [Required, ValueMap{"Present","Absent"}, Values{"Present","Absent"}] String Property3;
};

MOF-filen vil kun inneholde egenskapene vi vil i modulen vår, sammen med deres attributter og datatyper. Med mindre vi legger til eller fjerner egenskaper, er dette stort sett alt vi gjør med MOF-filen.

psm1-filen

Psm1-filen er der hoveddelen av koden vår kommer til å være. Denne filen vil inneholde tre nødvendige funksjoner:

  • Get-TargetResource
  • Test-TargetResource
  • Set-TargetResource

Get-TargetResource

Funksjonen Get-TargetResource returnerer gjeldende verdi(e) av det ressursen er ansvarlig for. Vår stubbed funksjon ved å bruke  xDscResourceDesigners ser slik ut:

function Get-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Property1,

        [parameter(Mandatory = $true)]
        [ValidateSet("Present","Absent")]
        [System.String]
        $Property3
    )

    #Write-Verbose "Use this cmdlet to deliver information about command processing."

    #Write-Debug "Use this cmdlet to write debug information while troubleshooting."


    <#
    $returnValue = @{
    Property1 = [System.String]
    Property2 = [System.Management.Automation.PSCredential]
    Property3 = [System.String]
    }

    $returnValue
    #>
}

Merk at den valgfrie parameteren (skriveattributt) Property2 ikke er nødvendig for denne funksjonen.

Test-TargetResource

Funksjonen Test-TargetResource returnerer en boolsk verdi som indikerer hvorvidt ressursen er i ønsket tilstand eller ikke. Fra vårt genererte eksempel ser funksjonen slik ut:

function Test-TargetResource
{
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Property1,

        [System.Management.Automation.PSCredential]
        $Property2,

        [parameter(Mandatory = $true)]
        [ValidateSet("Present","Absent")]
        [System.String]
        $Property3
    )

    #Write-Verbose "Use this cmdlet to deliver information about command processing."

    #Write-Debug "Use this cmdlet to write debug information while troubleshooting."


    <#
    $result = [System.Boolean]

    $result
    #>
}

Set-TargetResource

Funksjonen Set-TargetResource brukes til å konfigurere ressursen til den angitte ønsket tilstand. Vårt genererte eksempel ser slik ut:

function Set-TargetResource
{
    [CmdletBinding()]
    param
    (
        [parameter(Mandatory = $true)]
        [System.String]
        $Property1,

        [System.Management.Automation.PSCredential]
        $Property2,

        [parameter(Mandatory = $true)]
        [ValidateSet("Present","Absent")]
        [System.String]
        $Property3
    )

    #Write-Verbose "Use this cmdlet to deliver information about command processing."

    #Write-Debug "Use this cmdlet to write debug information while troubleshooting."

    #Include this line if the resource requires a system reboot.
    #$global:DSCMachineStatus = 1
}
Sammendrag

Sammendrag

Enten det er forenklet eller komplekst, vil trinnene for å lage din egen PowerShell DSC-modul være de samme. Dette innlegget er rettet mot å få deg i gang i riktig retning. Herfra kan du lage modulen din slik at den passer til den ressursen du trenger for å konfigurere og holde i ønsket tilstand. 

Similar Posts