Windows PowerShell in der Praxis: Webserver Management


Windows PowerShell sollte Ihnen eigentlich bekannt sein. Vielleicht haben Sie einen unserer Webcasts gesehen oder an einem unserer Trainings teilgenommen; oder vielleicht haben Sie auch „nur“ unser Einsteigerbuch heruntergeladen und die Übungen durchgearbeitet. In Gesprächen habe ich jedoch herausgefunden, dass vielen Leuten immer noch nicht bewusst ist, was so alles mit der Windows PowerShell machbar ist. Ein sehr schönes Beispiel möchte ich Ihnen hier vorstellen. Herr Reto Ambühler (http://www.ra.ethz.ch/) von der ETH Zürich nutzt die Windows PowerShell zur Verwaltung „seiner“ Webserverfarm. Schauen wir uns das ganze einmal an:

An der ETHZ gibt es relativ klare Vorgaben, wie eine Website auszusehen hat. Möchte nun jemand eine eigene, neue Website haben, so wird diese Website in der Webfarm mittels eines PowerShell Skripts anhand der jeweiligen Vorgaben vollautomatisch erstellt. Dies gilt für den jeweiligen Webservermaster als auch die „Slaves“ in der Webfarm, so dass die Website eine entsprechende Redundanz bietet. Neben der Erstellung der Websites gibt es auch ein Skript zur automatischen Entfernung der Website sowie der Dateien und Verzeichnisse sowie ein Skript zur Änderung der Grundparameter. Beim Löschen der Seite kann sogar noch entschieden werden, ob die Logfiles und Daten archiviert werden sollen.

Für die Automatisierung gibt es mehrere Gründe: zum einen besitzt die ETHZ nun eine umfangreiche Dokumentation für jede Website mit allen ihren Parametern. Zum anderen ist der Aufwand, eine neue Website für eine neue Arbeitsgruppe nach allen Vorgaben zu erstellen, deutlich gesunken. Das Standardskript muss lediglich mit den individuellen Parametern aufgerufen werden und der Rest erfolgt garantiert und ohne Flüchtigkeitsfehler, wie er bei manueller Arbeit im Eifer des „Gefechts“ schon mal passieren kann: Vom Überprüfen der entsprechenden Berechtigungsgruppen im Active Directory über IP Konfiguration und der eigentlichen IIS Konfiguration wie Bindings und Site Erstellung, dank Windows PowerShell ist alles im Griff.

Zusätzlich kann nun mittels eines Masterskripts die gesamte Webserverumgebung mit allen Websites und deren individuellen Parametern schnell und automatisch auf einem neuen Server wieder aufgebaut werden. Sollte also einmal die gesamte Webserverfarm ausfallen oder die Server neu aufgesetzt werden müssen, muss Herr Ambühler sich keine Sorgen mehr um die jeweilige richtige Konfiguration machen, da dies alles durch die Skripte funktioniert.

Was mir besonders an dieser Lösung gefallen hat, ist neben der Praxisrelevanz auch die Kombination von unterschiedlichen Technologien in den Lösungsskripten. So benutzt Herr Ambühler neue Funktionen der Windows PowerShell direkt neben seit Jahren bekannten Funktionen der guten Kommandozeile; und auch ADSI und WMI werden je nach Bedarf verwendet. Und genau das zeigt, was wir von Microsoft uns auch erhoffen: Fangen Sie einfach an mit der Windows PowerShell. Nutzen Sie sie wie sie es für richtig halten und vergessen Sie nicht, was Sie schon können. So erhalten Sie am Ende das Beste aus allen Welten und lösen Ihre Probleme für Sie am effizientesten. Denn am Ende zählt bei IT Pros immer die Lösung, nicht der Weg, solange der Weg nicht nur aus Umwegen besteht, oder?

Ein konkretes Beispiel ist der Weg, die jeweilige Security Group für die Websites im Active Directory zu überprüfen. Hier benutzt Herr Ambühler zwei unterschiedliche Methoden (als ob ich ihn aus Lernzwecken darum gebeten hätte):

# Definition des Gruppennames anhand der ETHZ Vorgaben. $web_lo wird aus dem jeweiligen Website Name an einer anderen Stelle des Skript abgeleitet:

$web_grp = $WWW_GRP_PREFIX + $web_lo

$name_found = $false

# Suche des Gruppenobjekts im Active Directory via ADSI:

$objADSI = [ADSI]”LDAP://cn=$web_grp,$OU_DC”

$ret_code = $objADSI

if ($ret_code.cn -eq $web_grp) {

# die Gruppe existiert bereits und kann verwendet werden

$name_found = $true

} …

#Und hier die Suche der Gruppe mittels .NET

$objDomain = New-Object System.DirectoryServices.DirectoryEntry

$objSearcher = New-Object System.DirectoryServices.DirectorySearcher

$objSearcher.SearchRoot = $objDomain

$dummy = $objSearcher.PropertiesToLoad.Add(“Name”)

$colResults = $objSearcher.FindAll()

foreach ($objResult in $colResults) {

$objAD = $objResult.Properties

if ($objAD.name -match $web_grp) { $name_found = $true }

}

Ob nun .NET oder ADSI, oder sogar die AD CMDLETS von Quest, ein richtig oder falsch gibt es nicht. Versuchen Sie selber den für Sie besten Weg zu finden!

Zum Anlegen der Websites braucht es natürlich auch ein Verzeichnis auf dem Webserver. Hier ein Beispiel, wie dies durchgeführt werden kann (aus Gründen der Sicherheit wurden einige Einstellungen für die Veröffentlichung geändert):

# Überprüfen, ob das Verzeichnis bereits auf dem Webserver existiert:

if (Test-Path -path $web_dir) {

if (-not $quiet) { echo “INFO : web root directory $web_dir already exists.” }

} else {

# Anlegen des neuen Verzeichnis mit New-Item

$result = New-Item -path $web_dir -type Directory

if (Test-Path -path $web_dir) {

$web_grp = $WWW_DOM_PREFIX + $WWW_GRP_PREFIX + $web_lo

# Lesen der NTFS Rechte via Windows PowerShell CMDLET

$web_acl = Get-Acl -path $web_dir

$web_rule = new-object System.Security.AccessControl.FileSystemAccessRule
($web_grp, , “FullControl”, “ContainerInherit, ObjectInherit”, “None”, “Allow”)

# Setzen der NTFS Rechte mit .NET Funktionalität

$web_acl.SetAccessRule($web_rule)

# Setzen der NTFS Rechte mit Windows PowerShell CMDLET

set-acl -path $web_dir -aclObject $web_acl

# Freigabe des Verzeichnis mit CMD Funktionalität direct aus PowerShell

$cmd = “net share ” + $SHARE_PREFIX + $web_lo + “=” + $web_dir + ” /GRANT:” + $web_grp + “,full”

if ($debug) { echo “DEBUG : executing $cmd” }

$result = cmd /c $cmd 2> $null

if (-not $quiet) { echo “INFO : web root directory $web_dir created and shared.” }

} else {

$err_code = $E_CreWebRooFld

$err_text = “create web root directory ” + $web_dir + ” failed”

}

}

Auch für diese Aufgabe wurden Befehle aus unterschiedlichen Bereichen genutzt, von Windows PowerShell CMDLETS über .NET bis hin zum guten Command Prompt ist alles vertreten und arbeitet hier perfekt zusammen: wenn es ideale Befehle (wie das Anlegen von Freigaben) schon gibt, warum dann in einer anderen Technologie das gleiche mit mehr Aufwand versuchen?

Sie sehen, Windows PowerShell einzusetzen heisst nicht, die 120+ CMDLETs zu lernen und das bisherige Wissen zu vergessen, sondern Altes und Neues optimal zu kombinieren. Was das heissen kann, hat Herr Ambühler mit seiner Lösung wunderbar aufzeigen können. Vielleicht inspiriert ja diese Lösung auch Sie, sich erneut mit der Windows PowerShell zu beschäftigen und eine eigene Lösung zu erstellen, die auch Ihr Problem elegant löst. Und wenn Sie Lust haben, teilen Sie mir dies doch einfach mit, gerne veröffentliche ich dann auch Ihre Lösung.

Mir bleibt nur noch Herrn Ambühler für seine tolle Arbeit und seine Bereitschaft, seine Lösung mit anderen IT Pros auf unserem Blog zu teilen ganz herzlich zu danken und wünschen Ihnen allen noch viel Spass mit der Windows PowerShell.

Comments (0)