PowerShell 4.0 und die Desired State Configuration (DSC) - Mein Start.

PowerShell 4.0 beinhaltet einige kleinere Neuerungen und auch Verbesserungen von Version 3.0 Features. Folgender Befehl in einer 4.0 PowerShell:

Get-help about_Windows_PowerShell_4.0              

liefert eine Liste der Neuerungen (inkl. Beschreibung). Hier mal ein paar editierte Auszüge:

  • Windows PowerShell Desired State Configuration (DSC)
  • Save-Help
  • Windows PowerShell debugger (workflows, remote running scripts)
  • RunNow Parameter (ScheduledJob)
  • Invoke-RestMethod and Invoke-WebRequest (added -Headers)
  • Get-Module (extended – easier to use)
  • default execution policy setting (is now “RemoteSigned”)
  • Asynchronous workflow jobs (no longer deleted when the time-out elapsed)
  • RepeatIndefinitely (new parameter for New-JobTrigger, Set-JobTrigger)

 

Windows PowerShell Desired State Configuration (DSC)

DSC ist für mich die wichtigste Neuerung gerade wenn man im Bereich Deployment, Automation von Multi-Server Umgebungen unterwegs ist. Als Admin beschreibt man dabei in einem “configuration” – PowerShell-Skript-Block wie ein oder mehrere Server (sog. “nodes”) auszusehen haben. Und die PowerShell DSC übernimmt die lästige Arbeit des Einrichtens und der Überwachung, dass das Zielsystem auch so bleibt wie in der “Wunschkonfiguration” vorgeben.

Ich kann also konkret beschreiben z.B. :

  • wo und ob Verzeichnisse oder Dateien vorhanden sein sollen,
  • welche Windows Rollen und Features aktiviert sind,
  • welche Software installiert
  • Gruppen und User vorhanden sein sollen.
  • etc.

Möglich machen dies Ressource Provider – und die PowerShell 4.0 bringt da schon einige mit. Das kann mit Get-DscResource abgefragt werden.

3 Schritte zur eigenen DSC Demo:

1) PowerShell ISE öffnen und Codeschnipsel sich anzeigen lassen mit STRG-J. Das Basis-Skript-Schnipsel lautet DSC Configuration (simple): PowerShell ISE with DSC Code Snippet

Im Rahmen eines MVA Kurses haben Carsten Rachfahl und ich eine Beispiel DSC-Konfiguration für einen Webserver geschrieben. Wir stellen sicher dass der IIS auf einem Windows Server 2012 R2 installiert ist und kopieren dann den Inhalt eines Shares (die html website) in den Standard – Webordner. Unsere finale Version ist:

configuration MyDSCWebConfig
{
Param([string]$ComputerName) #we use a parameter for node instead of hardcoded values

# One can evaluate expressions to get the node list
    # E.g: $AllNodes.Where("Role -eq Web").NodeName
node ($ComputerName)
{
# Call Resource Provider
# E.g: WindowsFeature, File
WindowsFeature WEBServer
{
Ensure = "Present"
Name = "Web-Server" #call "get-windowsfeature" to retrieve the name
}
File WebDirectory
{
Ensure = "Present"
SourcePath = "\\file-hlb01\Ressources\webcontent" #you may want to change this
Recurse = $true
DestinationPath = "c:\inetpub\wwwroot"
Type = "Directory"
DependsOn = "[WindowsFeature]WEBServer" #first the webserver then the content
}
}
}

 diesen Block führen wir in der ISE aus.

2) Wir rufen wir den Namen der configuration (hier: MyDSCWebConfig) auf und erzeugen uns damit eine  *.mof Datei im angegebenen Ordner.

MyDSCWebConfig -OutputPath "C:\myDSC" -ComputerName localhost   

Da wir mit einem Parameter (namens ComputerName) arbeiten anstatt hardcodierte Einträge zu verwenden, müssen wir diesen hier angeben. Anm.: wird der configuration Block einmal in der ISE ausgeführt erkennt IntelliSense den Namen des Parameters.

3) Mit folgendem Befehl starten wir die DSC und richten den Webserver auf dem Zielhost ein:
Start-DscConfiguration -Path "C:\myDSC" -Verbose -Wait

PowerShell und DSC: 3 Server kriegen ihre Konfiguration

Ziemlich beeindruckend wie ich finde.

Und das Beste die DSC kann etwaige Änderungen z.B. durch fehlerhaftes Löschen, Deinstallieren o.ä. nicht nur erkennen werden sondern auch automatisch reparieren. Das erfordert nur eine kleine Konfiguration des Local Configuration Managers (LCM) . Siehe dazu den folgenden Blogeintrag: PowerShell und DSC: Local Configuration Manager Setting ApplyAndAutoCorrect

 

Weiteres:

Das PowerShell Team ist sehr fleißig und hat in einem DSC Resource Kit Erweiterungen zu den Standardprovidern geschrieben um z.B. die Firewall Einträge auf einem Server zu setzen.