
PowerShell Desired State Configuration (DSC) vereinfacht die Bereitstellung und Konfiguration von Betriebssystemen, Serverrollen und Anwendungen erheblich, wenn Sie Hunderte von Servern haben.
Bei der Verwendung von DSC vor Ort, das heißt nicht in MS Azure, treten jedoch einige Nuancen auf. Diese sind besonders spürbar, wenn die Organisation groß ist (ab 300 Arbeitsplätzen und Servern) und sie noch nicht die Welt der Container eröffnet hat:
- Es fehlen umfassende Berichte über den Systemstatus. Wenn die benötigte Konfiguration auf bestimmten Servern nicht angewendet wurde, erfahren wir das ohne diese Berichte nicht. Die Informationen von dem integrierten Berichtserver zu erhalten, ist ziemlich schwierig, und für eine große Anzahl von Hosts zudem sehr langwierig.
- Es fehlt an Skalierbarkeit und Ausfallsicherheit. Es ist nicht möglich, einen Cluster von DSC-überwachenden Webservern mit einer einzigen ausfallsicheren Datenbank und einem gemeinsamen Speicher für mof-Konfigurationsdateien, Module und Registrierungsschlüssel aufzubauen.
Heute werde ich darüber sprechen, wie das erste Problem gelöst werden kann und Daten für den Berichtsbau erhalten werden können. Es wäre alles einfacher, wenn SQL als Datenbank verwendet werden könnte. MS bietet eine integrierte Unterstützung nur in Windows Server 2019 oder in der Windows Server-Version 1803. Daten über den OleDB-Provider abzurufen, ist auch , da der DSC-Server einen benannten Parameter verwendet, der von OleDbCommand nicht vollständig unterstützt wird.
Ich habe folgenden Weg gefunden: Für diejenigen, die Windows Server 2012 und 2016 verwenden, ist es möglich, die Verwendung einer SQL-Datenbank als Backend für den überwachenden DSC-Server. Zu diesem Zweck erstellen wir einen „Proxy“ in Form einer .mdb-Datei mit verbundenen Tabellen, der die von den Kundenberichten erhaltenen Daten an die SQL-Datenbank weiterleitet.
Hinweis: Für Windows Server 2016 muss , da Microsoft.Jet.OLEDB.4.0 nicht mehr unterstützt wird.
Ich werde nicht detailliert auf den Bereitstellungsprozess des überwachenden DSC-Servers eingehen, dieser ist sehr gut beschrieben . Ich möchte nur ein paar Punkte erwähnen. Wenn wir den überwachenden DSC auf demselben Webserver wie WSUS oder Kaspersky Security Center bereitstellen, müssen die folgenden Parameter im Konfigurationsskript geändert werden:
UseSecurityBestPractices = $falseAndernfalls wird TLS 1.0 deaktiviert, und Sie können sich nicht mit der SQL-Datenbank verbinden. Kaspersky Security Center wird auch nicht funktionieren (das Problem sollte in Kaspersky Security Center v11 behoben werden).
Enable32BitAppOnWin64 = $trueWenn diese Änderung nicht vorgenommen wird, kann der AppPool des DSC-Servers auf IIS mit WSUS nicht gestartet werden.
- Deaktivieren Sie bei der Installation des DSC-Servers zusammen mit WSUS das statische und dynamische Caching für die DSC-Website.
Lassen Sie uns den DSC-Server zur Nutzung der SQL-Datenbank konfigurieren.
Erstellen einer SQL-Datenbank
- Wir werden eine leere SQL-Datenbank mit dem Namen DSC erstellen.


- Erstellen Sie ein Konto zum Verbinden mit dieser Datenbank. Überprüfen Sie im Voraus, ob auf dem SQL-Server die Authentifizierung sowohl für Windows- als auch SQL-Konten aktiviert ist.


- Gehen Sie zum Abschnitt Benutzerzuordnung. Wählen Sie die Datenbank aus, in diesem Fall – DSC. Gewähren Sie die Berechtigung als Datenbankbesitzer.

- Fertig.

Erstellen eines Schemas für die DSC-Datenbank
Ein Schema für die DSC-Datenbank kann auf zwei Arten erstellt werden:
- selbständig, über ein Skript in TSQL
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Devices]( [TargetName] [nvarchar](255) NOT NULL, [ConfigurationID] [nvarchar](255) NOT NULL, [ServerCheckSum] [nvarchar](255) NOT NULL, [TargetCheckSum] [nvarchar](255) NOT NULL, [NodeCompliant] [bit] NOT NULL, [LastComplianceTime] [datetime] NULL, [LastHeartbeatTime] [datetime] NULL, [Dirty] [bit] NOT NULL, [StatusCode] [int] NULL ) ON [PRIMARY] GO CREATE TABLE [dbo].[RegistrationData]( [AgentId] [nvarchar](255) NOT NULL, [LCMVersion] [nvarchar](255) NULL, [NodeName] [nvarchar](255) NULL, [IPAddress] [nvarchar](255) NULL, [ConfigurationNames] [nvarchar](max) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO CREATE TABLE [dbo].[StatusReport]( [JobId] [nvarchar](50) NOT NULL, [Id] [nvarchar](50) NOT NULL, [OperationType] [nvarchar](255) NULL, [RefreshMode] [nvarchar](255) NULL, [Status] [nvarchar](255) NULL, [LCMVersion] [nvarchar](50) NULL, [ReportFormatVersion] [nvarchar](255) NULL, [ConfigurationVersion] [nvarchar](255) NULL, [NodeName] [nvarchar](255) NULL, [IPAddress] [nvarchar](255) NULL, [StartTime] [datetime] NULL, [EndTime] [datetime] NULL, [Errors] [nvarchar](max) NULL, [StatusData] [nvarchar](max) NULL, [RebootRequested] [nvarchar](255) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO - Importieren Sie Daten aus einer leeren devices.mdb im PS-Modul PSDesiredStateConfiguration über den SQL-Datenimportassistenten.
Das devices.mdb, mit dem wir arbeiten werden, befindet sich in C:\Windows\SysWOW64\WindowsPowerShell\v1.0\Modules\PSDesiredStateConfiguration\PullServer.
- Um Daten zu importieren, starten Sie den SQL Server Import- und Export-Assistenten.

- Wählen Sie aus, woher wir die Daten beziehen – in unserem Fall ist es eine Microsoft Access-Datenbank. Klicken Sie auf Weiter.

- Wählen Sie die Datei aus, von der wir das Schema importieren.

- Geben Sie an, wo importiert werden soll – in unserem Fall die SQL-Datenbank.

- Wählen Sie den SQL-Server (Servername) und die Datenbank aus, in die wir die Daten importieren möchten (Datenbank).

- Wählen Sie die Option Daten aus einer oder mehreren Tabellen oder Ansichten kopieren (Copy data from one or more tables or views).

- Wählen Sie die Tabellen aus, aus denen wir das Datenbank-Schema importieren werden.

- Setzen Sie ein Häkchen bei Sofort ausführen und klicken Sie auf Fertig.

- Fertig.

- In der DSC-Datenbank sollten nun Tabellen vorhanden sein.

Konfiguration der .mdb „Proxy“-Datei
Erstellen einer ODBC-Verbindung zu einem SQL-Server. Es wird angenommen, dass MS Access nicht auf dem Server mit DSC installiert ist, daher wird die Einrichtung von databases.mdb auf einem zwischengeschalteten Host mit installiertem MS Access durchgeführt.
Lassen Sie uns eine systemweite ODBC-Verbindung zu einem SQL-Server erstellen (die Bit-Version der Verbindung muss mit der Bit-Version von MS Access – 64 oder 32 – übereinstimmen). Dies kann erfolgen durch:
— PowerShell-Cmdlet:
Add-OdbcDsn –Name DSC –DriverName 'SQL Server' –Platform '' –DsnType System –SetPropertyValue @('Description=DSC Pull Server',"Server=''",'Trusted_Connection=yes','Database=DSC') –PassThru— oder manuell über den Verbindungsassistenten:
- Öffnen Sie die Verwaltungswerkzeuge. Wählen Sie die ODBC-Datenquellen in Abhängigkeit von der Version des installierten MS Access. Gehen Sie zum Tab System-DSN und erstellen Sie eine systemweite Verbindung (Hinzufügen).

- Geben Sie an, dass wir uns mit dem SQL-Server verbinden. Klicken Sie auf Fertigstellen.

- Geben Sie den Namen und den Server für die Verbindung an. Später muss die Verbindung mit denselben Parametern auf dem DSC-Server erstellt werden.

- Geben Sie an, dass für die Verbindung zum SQL-Server der zuvor von uns erstellte Benutzer mit dem Namen DSC verwendet wird.

- Geben Sie die Datenbank in den Verbindungseinstellungen von DSC an.

- Klicken Sie auf Fertigstellen.

- Überprüfen Sie vor Abschluss der Einrichtung, ob die Verbindung funktioniert (Datenquelle testen).

- Fertig.

Erstellen einer Datenbank devices.mdb in MS Access. Starten Sie MS Access und erstellen Sie eine leere Datenbank mit dem Namen devices.mdb.

- Gehen Sie zum Tab Externe Daten, klicken Sie auf ODBC-Datenbank. Wählen Sie im sich öffnenden Fenster 'Verknüpfte Tabelle erstellen' zur Verbindung mit der Datenquelle.

- Wählen Sie im neuen Fenster den Tab Maschinen-Datenquelle und klicken Sie auf OK. Geben Sie im neuen Fenster die Anmeldeinformationen für die Verbindung zum SQL-Server ein.

- Wählen Sie die Tabellen aus, die verknüpft werden sollen. Aktivieren Sie das Kontrollkästchen Passwort speichern und klicken Sie auf OK. Das Passwort muss für alle drei Tabellen jedes Mal gespeichert werden.

- In den Indizes müssen die folgenden Optionen gewählt werden:
— TargetName für die Tabelle dbo_Devices;
— NodeName oder IPAddress für dbo_RegistrationData;
— NodeName oder IPAddress für dbo_StatusReport.
- Benennen Sie die Tabellen in MS Access um, d.h. entfernen Sie das Präfix dbo_, damit DSC sie verwenden kann.

- Fertig.

- Speichern Sie die Datei und schließen Sie MS Access. Kopieren Sie nun die erstellte devices.mdb auf den DSC-Server (standardmäßig in C:Program FilesWindowsPowershellDSCService) und ersetzen Sie damit die vorhandene (sofern vorhanden).
Einrichtung des DSC-Servers zur Verwendung von SQL
- Wir kehren zum DSC-Server zurück. Um mit unserer Proxy-Datei eine Verbindung zum SQL-Server herzustellen, erstellen wir eine neue ODBC-Verbindung auf dem DSC-Server. Der Name, die Bit-Version und die Verbindungseinstellungen sollten die gleichen sein wie bei der Erstellung der MDB-Datei. Sie können die bereits konfigurierte leere devices.mdb von hier kopieren.
- Um devices.mdb zu verwenden, müssen Änderungen an der web.config des abfragenden DSC-Servers vorgenommen werden (standardmäßig – C:inetpubPSDSCPullServerweb.config):
— für Windows Server 2012
— für Windows Server 2016
Damit ist die Konfiguration des DSC-Servers abgeschlossen.
Überprüfung der Funktionsfähigkeit des DSC-Servers
- Wir prüfen, ob der DSC-Server über den Webbrowser erreichbar ist.

- Jetzt überprüfen wir, ob der abfragende DSC-Server richtig funktioniert. Dazu gibt es im xPSDesiredStateConfiguration-Modul das Skript pullserversetuptests.ps1. Vor der Ausführung dieses Skripts muss das Powershell-Modul namens Pester installiert werden. Wir installieren es mit Install-Module -Name Pester.
- Öffnen Sie C:Program FilesWindowsPowerShellModulesxPSDesiredStateConfigurationDSCPullServerSetupPullServerDeploymentVerificationTest (im Beispiel ist die Version 8.0.0.0.0).

- Öffnen Sie PullServerSetupTests.ps1 und überprüfen Sie den Pfad zur web.config des DSC-Servers. Der Pfad zur web.config, den das Skript überprüfen wird, ist rot markiert. Ändern Sie diesen Pfad bei Bedarf.

- Führen Sie pullserversetuptests.ps1 aus
Invoke-Pester .PullServerSetupTests.ps1
Alles funktioniert.
- Im SQL Management Studio sehen wir, dass die verwalteten Hosts Berichte an den DSC-Berichtsserver senden und die Daten in die DSC-Datenbank auf dem SQL-Server gelangen.

Das ist alles. In den kommenden Artikeln plane ich, zu zeigen, wie man auf den erhaltenen Daten Berichte erstellt und auf Fragen zur Ausfallsicherheit und Skalierbarkeit einzugehen.
Quelle: habr.com





































