simple server administration with server infos stored in json
This commit is contained in:
82
ServerTools.psm1
Normal file
82
ServerTools.psm1
Normal file
@@ -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', $_)
|
||||||
|
}
|
||||||
|
}
|
||||||
170
readme.md
Normal file
170
readme.md
Normal file
@@ -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.
|
||||||
|
|
||||||
|
---
|
||||||
15
servers.json
Normal file
15
servers.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"groups": {
|
||||||
|
"TST": [
|
||||||
|
{ "name": "serverTST1" },
|
||||||
|
{ "name": "serverTST2" }
|
||||||
|
],
|
||||||
|
"ABN": [
|
||||||
|
{ "name": "serverABN1" }
|
||||||
|
],
|
||||||
|
"PRD": [
|
||||||
|
{ "name": "serverPRD1" },
|
||||||
|
{ "name": "serverPRD2" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user