commit 6f8c532612fe21b83780f602ab05131d43277f39 Author: maxxi Date: Sat Mar 28 22:56:22 2026 +0100 simple server administration with server infos stored in json diff --git a/ServerTools.psm1 b/ServerTools.psm1 new file mode 100644 index 0000000..61eb260 --- /dev/null +++ b/ServerTools.psm1 @@ -0,0 +1,82 @@ +function Get-ServerConfig { + param( + [string]$Path = ".\servers.json" + ) + + if (-not (Test-Path $Path)) { + throw "Config-Datei nicht gefunden: $Path" + } + + return Get-Content $Path -Raw | ConvertFrom-Json +} + +function Get-ServerGroup { + param( + [Parameter(Mandatory)] + [string]$Name + ) + + $config = Get-ServerConfig + + if (-not $config.groups.$Name) { + throw "Gruppe '$Name' existiert nicht" + } + + return $config.groups.$Name +} + +function Invoke-ServerCommand { + param( + [Parameter(Mandatory)] + [string]$Group, + + [Parameter(Mandatory)] + [scriptblock]$ScriptBlock + ) + + $servers = Get-ServerGroup -Name $Group + + foreach ($server in $servers) { + $name = $server.name + + Write-Host "[$name] Starte..." -ForegroundColor Cyan + + try { + Invoke-Command -ComputerName $name -ScriptBlock $ScriptBlock -ErrorAction Stop + } + catch { + Write-Warning "[$name] Fehler: $_" + } + } +} + +function Invoke-ServerCommandParallel { + param( + [string]$Group, + [scriptblock]$ScriptBlock + ) + + $servers = Get-ServerGroup -Name $Group + + $servers | ForEach-Object -Parallel { + $name = $_.name + + try { + Invoke-Command -ComputerName $name -ScriptBlock $using:ScriptBlock + } + catch { + Write-Host "[$name] Fehler: $_" + } + } +} + +Register-ArgumentCompleter -CommandName Get-ServerGroup, Invoke-ServerCommand -ParameterName Group -ScriptBlock { + param($commandName, $parameterName, $wordToComplete) + + $config = Get-ServerConfig + $config.groups.PSObject.Properties.Name | + Where-Object { $_ -like "$wordToComplete*" } | + ForEach-Object { + [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) + } +} \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..8957686 --- /dev/null +++ b/readme.md @@ -0,0 +1,170 @@ +# ServerTools – PowerShell Server Group Automation + +## 📖 Übersicht + +Dieses PowerShell-Skript ermöglicht die einfache Verwaltung und Automatisierung von Servern anhand definierter Gruppen in einer JSON-Konfigurationsdatei. + +Ziel ist es, administrative Aufgaben effizient auf mehrere Server gleichzeitig auszuführen, ohne Servernamen manuell pflegen zu müssen. + +--- + +## ⚙️ Funktionsweise + +Die Server werden in einer JSON-Datei in Gruppen organisiert. +Das Skript stellt Funktionen bereit, um: + +* Servergruppen auszulesen +* Befehle auf ganze Gruppen anzuwenden +* Remote-Kommandos zentral auszuführen + +--- + +## 📂 Projektstruktur + +``` +ServerTools/ + ├── ServerTools.psm1 + └── servers.json +``` + +--- + +## 🧾 Konfigurationsdatei + +### Beispiel: `servers.json` + +```json +{ + "groups": { + "TU": [ + { "name": "server1" }, + { "name": "server2" } + ], + "AU": [ + { "name": "server3" } + ] + } +} +``` + +--- + +## 🔧 Funktionen + +### `Get-ServerConfig` + +Lädt die JSON-Konfigurationsdatei. + +```powershell +Get-ServerConfig +``` + +**Parameter:** + +* `-Path` (optional): Pfad zur JSON-Datei (Standard: `.\servers.json`) + +--- + +### `Get-ServerGroup` + +Gibt alle Server einer bestimmten Gruppe zurück. + +```powershell +Get-ServerGroup -Name TU +``` + +**Parameter:** + +* `-Name` (Pflicht): Name der Gruppe + +--- + +### `Invoke-ServerCommand` + +Führt ein PowerShell-Skript auf allen Servern einer Gruppe aus. + +```powershell +Invoke-ServerCommand -Group TU -ScriptBlock { hostname } +``` + +**Parameter:** + +* `-Group` (Pflicht): Gruppenname +* `-ScriptBlock` (Pflicht): Auszuführender Code + +--- + +### `Invoke-ServerCommandParallel` (optional) + +Führt Befehle parallel auf mehreren Servern aus (PowerShell 7+ erforderlich). + +```powershell +Invoke-ServerCommandParallel -Group TU -ScriptBlock { hostname } +``` + +--- + +## 🚀 Beispiele + +### Hostnamen abrufen + +```powershell +Invoke-ServerCommand -Group TU -ScriptBlock { hostname } +``` + +--- + +### Dienststatus prüfen + +```powershell +Invoke-ServerCommand -Group TU -ScriptBlock { + Get-Service -Name Spooler +} +``` + +--- + +### Festplatten prüfen + +```powershell +Invoke-ServerCommand -Group TU -ScriptBlock { + Get-PSDrive C +} +``` + +--- + +## ⚠️ Voraussetzungen + +* PowerShell 5.1 oder höher +* Für Remote-Befehle: + + * WinRM aktiviert (`Enable-PSRemoting`) + * Netzwerkzugriff auf Zielsysteme + * Entsprechende Berechtigungen + +--- + +## 💡 Best Practices + +* Verwende sprechende Gruppennamen (z. B. `Prod-Web`, `Test-DB`) +* Halte die JSON-Datei versioniert (z. B. Git) +* Nutze Module (`.psm1`) für Wiederverwendbarkeit +* Teste Skripte zunächst auf einzelnen Servern + +--- + +## 🔮 Erweiterungsmöglichkeiten + +* Integration von Credentials +* Logging und Fehlerauswertung +* Tag-basiertes System (flexiblere Filterung) +* API-Anbindung oder CMDB-Integration + +--- + +## 🧠 Fazit + +Dieses Skript bietet eine einfache, aber leistungsstarke Grundlage zur Automatisierung von Serveraufgaben in PowerShell und kann flexibel erweitert werden. + +--- diff --git a/servers.json b/servers.json new file mode 100644 index 0000000..bca5c94 --- /dev/null +++ b/servers.json @@ -0,0 +1,15 @@ +{ + "groups": { + "TST": [ + { "name": "serverTST1" }, + { "name": "serverTST2" } + ], + "ABN": [ + { "name": "serverABN1" } + ], + "PRD": [ + { "name": "serverPRD1" }, + { "name": "serverPRD2" } + ] + } +} \ No newline at end of file