Desired State Configuration (DSC)

Eintrag zuletzt aktualisiert am: 24.05.2023

Desired State Configuration (DSC) ist ein deklaratives Verfahren zur Systemkonfiguration, das Microsoft mit der PowerShell Version 4.0 im Jahr 2013 neu eingeführt hat.

Bei klassischer scriptbasierter Konfiguration legt der Administrator die einzelnen Schritte zur Zielkonfiguration fest. Er muss in der Regel vor Beginn eines Konfigurationsschrittses prüfen, ob die Konfiguration schon vorhanden ist, bevor er sie ausführt. Auch das Rückgängigmachen einer Konfiguration muss er durch einzelne Schritte realisieren.

Bei DSC beschreibt der Administrator deklarativ nur das Ziel einer Konfiguration. DSC ist selbst in der Lage, den aktuellen Zustand zu prüfen, einen nicht notwendigen Schritt zu überspringen, eine aus (vielen) Teilen bestehende Konfiguration durchzusetzen und auch diese Schritte wieder rückgängig zu machen.

DSC wird seit 2023 auch im Windows Package Manager (WinGet) verwendet für die Konfiguration von Rechnern.

Idempotente Ausführung

Aus der Sicht von DSC ist es kein Fehler, wenn eine Konfiguration schon vorhanden ist (idempotente Ausführung).

Ressourcen

DSC kennt „Ressourcen“. Für eine Ressource (z.B. Benutzer, Gruppen, Dienste, Umgebungsvariablen, Prozesse, Registry) definiert der Administrator den Zielzustand. Zu jeder konfigurierbaren Ressource gibt es in der PowerShell einen DSC-Ressourcentyp (z.B. User, Group, Service, Environment, Process, Registry).

Eine sehr universelle Ressource ist die „Script“-Ressource. Mit dieser kann man beliebige PowerShell-Skripte in einer DSC-Datei verwenden und so auch Aktionen ermöglichen, die nicht durch eine der bestehenden Ressourcen abgedeckt sind.

Die Ressourcentypen sind erweiterbar. Zusätzliche Ressourcentypen gibt es beim z.B. hier: http://gallery.technet.microsoft.com und https://github.com/smurawski/DSC-Contrib. Man kann auch selbst eigene Ressourcentypen schreiben.

Eigenschaften eines Ressourcentyps

Ressourcentypen haben Eigenschaften, die die Arbeit der Ressource steuern. Die Eigenschaften werden gemäß der Syntax Name="Wert" zugewiesen.

Alle Ressourcentypen haben folgende gemeinsamen Eigenschaften:
  • Ensure="Present" oder "Absent": Diese Eigenschaft sorgt dafür, dass eine Konfiguration durchgesetzt (wenn sie nicht vorhanden ist) oder rückgängig gemacht wird (wenn sie vorhanden ist).
  • DependsOn="[Ressourcentypename]RessourceName" ist ein Verweis auf einen Ressourcenblock in derselben DSC-Datei, die erfüllt sein müssen, bevor dieser Ressourcenblock ausgeführt wirken kann. Leider kann man hier nicht mehrere Ressourcenblöcke angeben (zumindest ist bei Microsoft nicht dokumentiert, wie es gehen soll, und zahlreiche Versuche mit verschiedenen Syntaxformen haben nicht zum Ziel geführt).

Aufbau einer DSC-Datei

Eine DSC-Datei beginnt mit dem Schlüsselwort configuration, gefolgt von dem im Rahmen der gültigen PowerShell-Bezeichner frei wählbaren Namen der Konfiguration. In geschweiften Klamern folgt ein DSC-Knoten (engl. Nodes) mit Verweis auf einen Rechner. Innerhalb der DSC-Knoten gibt es einen oder mehrere DSC-Ressourcenblöcke. Jeder Ressourcenblock bezieht sich auf einen Ressourcentyp und legt deren Eigenschaften fest. Der Ressourcenblock beginnt mit Ressourcennamen und dann einem im Rahmen der gültigen PowerShell-Bezeichner frei wählbaren Namen für den Block. Ein DSC-Knoteneintrag kann fehlen, d.h., die configuration { } kann direkt DSC-Ressourcenblöcke enthalten. Es darf auch mehrere DSC-Knoteneinträge in einer Datei geben. Es darf innerhalb einer Konfiguration und innerhalb eines DSC-Knoteneinträgs mehrere Einträge für den gleichen Ressourcentyp geben. Jeder Ressourcenblock muss einen eindeutigen Namen haben, sonst kommt es zum Fehler „duplicate resource identifier“.

Ein erstes DSC-Beispiel

Das folgende Listing zeigt ein minimales Beispiel für eine DSC-Datei mit dem Konfigurationsnamen „DSCErstesBeispiel“ mit einem DSC-Knoten und zwei DSC-Ressourcenblöcken mit Namen „RegEintrag1Erzeugen“ und „RegEintrag2Erzeugen“ für den Ressourcentyp Registry, die dafür sorgen, dass es zwei Windows-Registrierungsdatenbankeinträge „Inhaber“ und „Produkte“ im Schlüssel „HKEYLOCALMACHINE\SOFTWARE\www.IT-Visions.de“ gibt. Diese Datei kann man unter beliebigem Namen ablegen, gefolgt von der Dateinamenserweiterung .ps1. Es bietet sich an, die Datei wie die Konfiguration zu benennen, also DSCErstesBeispiel.ps1.

"Lade DSC…"
configuration DSCErstesBeispiel
{
node Server114
{
Registry RegEintrag1Erzeugen
{
Ensure ="Present"
Key ="HKEYLOCALMACHINE\SOFTWARE\www.IT-Visions.de"
ValueName="Inhaber"
ValueData="Dr. Holger Schwichtenberg"
}
Registry RegEintrag2Erzeugen
{
Ensure ="Present"
Key ="HKEYLOCALMACHINE\SOFTWARE\www.IT-Visions.de"
ValueName="Produkte"
ValueData="Schulung,Beratung,Support"
}
}
}
"DSC ist geladen!"

Anwendung einer DSC-Datei

Um die DSC-Datei anzuwenden, sind drei Schritte notwendig:

1. Die DSC-Datei muss ausgeführt werden wie eine normale PowerShell-Skriptdatei (in der ISE oder an der Kommandozeile). Normalerweise erhält man dabei keine Ausgabe. In dem Fall des obigen ersten Beispiels erhält man eine Ausgabe, weil vor und nach dem configuration-Block noch Ausgabebefehle stehen.
2. Nun kompiliert man die Konfiguration aus, indem man den Namen der Konfiguration an der Konsole wie den Namen einer PowerShell-Funktion ausführt. Das Ergebnis ist eine WMI-MOF-Datei. Die PowerShell antwortet mit dem Namen der erzeugten MOF-Datei. Dies ist im obigen Fall, wo es keinen dedizierten DSC-Knoten gibt, der Name „localhost.mof“. Die Datei landet in einem Unterverzeichnis, das so heißt wie die Konfiguration. Man sollte dabei aufpassen, wo man mit dem aktuellen Verzeichnis steht, denn die Datei wird relativ zum aktuellen Standort abgelegt.
3. Im letzten Schritt wird nun die kompilierte MOF-Datei ausgeführt und damit die Konfiguration angewendet. Dies erfolgt mit dem Commandlet Start-DscConfiguration erneut unter Angabe des Konfigurationsnamens
Start-DscConfiguration DSCErstesBeispiel
-Wait –Verbose.
Normalerweise wird die Konfiguration in einem Hintergrundjob ausgeführt, sodass der Benutzer nichts davon sieht, sondern nur den Job-Status abfragen kann. Mit –Wait wird bestimmt, dass die Konfiguration interaktiv gestartet wird. –Verbose sorgt wie immer für eine detaillierte Ausgabe.

DSC-Module

DSC-Ressourcen können in DSC-Module gebündelt werden. DSC-Module bekommt man in der PowerShell Gallery https://www.powershellgallery.com/packages.

Viele DSC-Module werden von der DSC Community herausgegeben: https://dsccommunity.org