Ab der Powershell Version 4 wird DSC unterstützt. Ich nutze Windows 10 und habe es standardmäßig on Board. Vorbereitung: Download der individuell benötigten Module aus der Powershell Gallery https://www.powershellgallery.com/items Herunterladen und installieren der Module: Save-Module -Name PSDscResources -Path C:\DSC\Module Install-Module -Name PSDscResources Save-Module -Name xpsdesiredstateconfiguration -Path C:\DSC\Module Install-Module -Name xpsdesiredstateconfiguration
Mit dem Befehl Find-DscResource fragen wir online die verfügbaren Module ab. Mit dem Befehl Install-Module Name OctopusDSC Scope AllUsers Force; laden wir das Module herunter und installieren es anschließend.
Nach dem Import finden wir die Module unter C:\Program Files\WindowsPowerShell\Modules Folgende Warnung erscheint, wenn das eingesetzte Modul nicht importiert wird. DSC Module sind keine CMD-Lets und können nur in Script-Blocks eingesetzt werden. Fangen wir damit an zu überprüfen ob eine Datei vorhanden ist.
Nach dem Import des Moduls taucht die Fehlermeldung nicht mehr auf. Das erstelle (kompilierte).mof (Managed Object Format) File hat folgenden Inhalt und wird später dem DSC Agent LCM (Local Configuration Manager) zur Verarbeitung übergeben.
Start-DscConfiguration -wait -verbose -force -Path C:\DSC\NDSEDV Der LCM Agent hat das erstellte.mof File verarbeitet und folgendes Ergebnis ausgegeben: Das Zielobjekt wurde gefunden Sollte eine Fehlermeldung erscheinen ist in der Regel der Windows Remote Management Dienst einzuschalten (WINRM), verzögerter Start. Powershell: configuration ndsedv { param () Import-DscResource ModuleName PSDesiredStateConfiguration ; File WindowsUpdateLog { DestinationPath = 'C:\Windows\WindowsUpdate.log'; Ensure = 'Present'; mkdir -Path C:\DSC\NDSEDV; NDSEDV -OutputPath C:\DSC\NDSEDV; Start-DscConfiguration -wait -verbose -force -Path C:\DSC\NDSEDV
Suche ich nun nach der Datei C:\Windows\WindowsUpdate1.log erhalte ich eine Fehlermeldung. Logisch denn diese existiert nicht. Außerdem fehlt der Wert Contents zur Erstellung einer neuen Datei. Verändere ich den Code und sage aus, das diese Datei existieren muss wird diese neue erstellt und zwar mit dem Inhalt DerWindowsPapst.
Der LCM ist ein integraler Bestandteil der Powershell und kann individuell angepasst werden. Die aktuellen Settings lesen wir mit diesem Befehl aus: Get-DscLocalConfigurationManager
Eine neue LCM Konfiguration könnte so aussehen: [DSCLocalConfigurationManager()] configuration LCMConfig { Node localhost { Settings { RefreshMode = 'Push' # Alternative: 'Pull' ConfigurationMode = 'ApplyAndMonitor' # Alternative: 'ApplyOnly', 'ApplyAndAutoCorrect' ConfigurationModeFrequencyMins = '30' RefreshFrequencyMins = '45' LCMconfig Jetzt muss die neue Konfiguration kompiliert werden. Script-Block ausführen und danach den Befehl LCMConfig starten.
Die meta.mof Datei wurde erstellt.
Damit die neue Konfiguration übernommen wird muss diese auch gesetzt werden. Der Befehl dazu lautet: Set-DscLocalConfigurationManager -Path C:\DSC\NDSEDV\LCMConfig -Force -Verbose Fragen wir die Konfiguration erneut ab müssten die Settings übernommen worden sein.
Nächstes Beispiel: Einen Ordner auf Vorhandensein überprüfen, wenn nicht anlegen lassen. An diesem Beispiel sehen wir die Vorgehensweise etwas detaillierter, welche Blöcke in welcher Reihenfolge ausgeführt werden müssen. Configuration Ordner { Import-DscResource ModuleName PSDesiredStateConfiguration ; Node Worker { File OrdnerDemo { Type = 'Directory' DestinationPath = 'F:\Archiv' Ensure = "Present" Ordner -OutputPath C:\DSC\Ordner; Start-DscConfiguration -wait -verbose -force -Path C:\DSC\Ordner
Eine erneute Überprüfung ob der Ordner vorhanden ist:
Nächstes Beispiel: Eine Datei von Source nach Destination kopieren. Configuration Dateikopieren { Import-DscResource ModuleName PSDesiredStateConfiguration ; Node Worker { File Datei { DestinationPath = 'E:\Archiv\Testdatei_kopiert.txt' SourcePath = "F:\Archiv\Testdatei.txt" Ensure = "Present" Force = $true MatchSource = $true Dateikopieren -OutputPath C:\DSC\Dateikopieren; Start-DscConfiguration -wait -verbose -force -Path C:\DSC\Dateikopieren
Nächstes Beispiel: Dateien kopieren und Dienst wieder starten. Ein Dienst kann nur einmal in einem Skriptblock aufgeführt werden. Entweder zum Starten oder stoppen.
Configuration MeinService { Import-DscResource ModuleName PSDesiredStateConfiguration ; Node "localhost" { File Dateienkopieren { SourcePath = "F:\Archiv" DestinationPath = "E:\Archiv" Recurse = $True Force = $true MatchSource = $true Ensure = "Present" Service StartService { Name = "Spooler" State = "Running" DependsOn = "[File]Dateienkopieren" MeinService -OutputPath C:\DSC\MeinService; Start-DscConfiguration -wait -verbose -force -Path C:\DSC\MeinService Weitere Beispiele folgen in Kürze Get-DscResource Select-Object -Property Name, Properties Get-Command -Module PSDesiredStateConfiguration Select-Object -Property CommandType, Name