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 „D
SCErstesBeispiel“ 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 „HKEY
LOCALMACHINE\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 D
SCErstesBeispiel.ps1.
"Lade DSC…"
configuration D
SCErstesBeispiel
{
node Server114
{
Registry RegEintrag1Erzeugen
{
Ensure ="Present"
Key ="HKEY
LOCALMACHINE\SOFTWARE\www.IT-Visions.de"
ValueName="Inhaber"
ValueData="
Dr. Holger Schwichtenberg"
}
Registry RegEintrag2Erzeugen
{
Ensure ="Present"
Key ="HKEY
LOCALMACHINE\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 D
SCErstesBeispiel
-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