Die Power von PowerShell für Windows Azure

Von Christian Vorhemus Autor Feed 5. June 2013 11:19

Dank des Windows Azure SDKs ist es nicht nur möglich, virtuelle Maschinen mittels PowerShell zu erstellen, sondern auch eigene Images hochzuladen, einzubinden und die Maschine zu starten. In diesem Tutorial soll gezeigt werden, wie durch PowerShell die Vorteile des Cloud Computing effektiv genutzt werden können, um zu jeder Zeit die notwendigen Ressourcen anzulegen und wieder zu löschen.

Voraussetzung: Ein Azure-Account (entweder die kostenlose Testversion oder der klassische Account) sowie einen Rechner mit Windows 7 oder höher bzw. Windows Server 2008 oder höher.

Schritt 1: Installation und Konfiguration

In Windows 7 und 8 sowie in den Server-Versionen 2012 und 2008 ist PowerShell bereits vorinstalliert. Wir laden hier die Windows Azure PowerShell herunter, in der die notwendigen cmdlets für Azure erhalten sind. Dazu navigieren wir auf diese Seite, scrollen ein Stück nach unten, klicken auf "Windows Azure PowerShell" und im aufpoppenden Fenster auf “Ausführen” (bzw. “Run”). Es öffnet sich nun der Installationsprozess, der mehr oder weniger selbsterklärend ist.

1

Ist das SDK installiert, öffnen wir die Windows Azure PowerShell (Suchfunktion) und nicht die klassische PowerShell. Nun laden wir zunächst unsere Accountdaten herunter, indem wir folgendes cmdlet eingeben:

> Get-AzurePublishSettingsFile

Es öffnet sich ein Browserfenster und wir können uns mit unseren Azure-Accountdaten einloggen. Danach werden uns die publishsettings zum Download angeboten, die wir lokal speichern.

3 

Abschließend navigieren wir zu jenem Ordner, in dem wir unsere publihssettings abgelegt haben und geben folgendes cmdlet ein (je nach filename natürlich abgewandelt):

> Import-AzurePublishSettingsFile <filename>.publishsettings

Achtung: Sollte der Azure-Account deaktiviert oder sonst nicht erreichbar sein, wird hier eine “Object reference not set”-Exception ausgelöst.


Schritt 2: Storage anlegen, VHD hochladen und VM erstellen 

Windows Azure unterstützt das gängige VHD-Format für virtuelle Festplatten. Wir können also ein System, das wir lokal in einer VM-Umgebung installiert haben, mit nur einigen wenigen Zeilen Code hochladen. Zuvor drei kurze Begriffserklärungen:

Storage: Ein Storage-Account ist de facto nichts anders als ein Ordner, in dem Dateien (meistens BLOB – Binary Large Objects wie zB Videos oder eben VHDs) gespeichert werden können.
Image: Images sind vorgefertigte Abbilder von Betriebssystemen aus denen Disks erstellt werden können.
Disk: Eine Disk ist schlussendlich ein Teil einer virtuellen Maschine, der als "Festplatte” des Systems fungiert. Aus Images können beliebig viele Disks erstellt werden.

Wir benötigen als erstes ein Speicherkonto um unsere VHD auf Azure lagern zu können. Dazu geben wir folgenden Befehl in der Azure PowerShell ein:

> New-AzureStorageAccount -StorageAccountName "ubuntustorage111" -Label "UbuntuStorage" 
-Location "West Europe"

Der Parameter “-StorageAccountName” muss weltweit einzigartig sein, kann aber ebenso wie Label und Location frei gewählt werden.
Im nächsten Schritt laden wir die VHD in den soeben erstellten Storage-Account. Verschiedene Programme wie zB VirtualBox erlauben die einfache Erstellung von VHDs, wichtig in diesem Zusammenhang ist stets, dass wir unsere virtuelle Maschine bereits lokal so konfigurieren müssen, dass wir später darauf zB via SSH zugreifen können. In diesem Tutorial werde ich später via SSH auf unsere Maschine zugreifen, daher ist auf der hochzuladenden Maschine bereits ein SSH-Server installiert.

Sind wir sicher, dass wir alles passend konfiguriert haben und bereit für die Cloud sind, laden wir die VHD mit folgendem Befehl in unseren Storage-Account:

> Add-AzureVhd -Destination "https://ubuntustorage111.blob.core.windows.net/vhds/UbuntuServer.vhd" 
-LocalFilePath "C:\Users\me\Desktop\UbuntuServer.vhd"
 

Dabei ändern wir den Parameter “-Destination” – je nachdem welchen StorageAccountName wir gewählt haben – ebenso ab wie den “LocalFilePath” der angibt, wo auf unserer lokalen Festplatte die hochzuladende VHD liegt. Wichtig zu erwähnen ist in diesem Zusammenhang, dass die Upload-Geschwindigkeit des verwendeten Internet-Zugangs über 2 Mbps liegen sollte, andernfalls dauert der Upload extrem lange, was besonders bei instabilen Internetverbindungen leicht zu Abbrüchen führen kann.

5

Ist der Upload erfolgreich, erstellen wir aus der VHD eine bootbare Disk mit folgendem Befehl:

> Add-AzureDisk -DiskName 'UbuntuServerDisk1' –MediaLocation
'https://ubuntustorage111.blob.core.windows.net/vhds/UbuntuServer.vhd' -OS "Linux"

Wenn wir ein Windows-System hochgeladen haben, ändern wir hier den Parameter “-OS” von “Linux” auf “Windows”.
Es wäre auch möglich, aus der hochgeladenen VHD zuerst ein Image zu erstellen (Befehl: Add-AzureVMImage) und aus diesem Image die Disk. Da aber ohnehin ein Befehl existiert um direkt aus der VHD die Disk zu erstellen brauchen wir diesen Umweg nicht gehen.

Nun folgt ein wichtiger Schritt: Wir müssen Azure noch bekannt geben, welche Subscription wir für das Deployment der virtuellen Maschine verwenden wollen, andernfalls beschwert sich Azure bei Eingabe des New-AzureVm-cmdlet mit der Meldung “Must specify MediaLocation or set a current storage account using Set-AzureSubscription”. Zusätzlich dazu müssen wir den aktuell verwendeten Storage-Account mittels des Parameters “-CurrentStorageAccount” angeben. Um die notwendigen Daten zu erhalten geben wir zunächst

> Get-AzureSubscription

ein. Wir erhalten folgende Ausgabe:

6

In diesem Bild ist der <SUBSCRIPTION-NAME> als oranges Rechteck hinterlegt, die <SUBSCRIPTION-ID> als grünes Rechteck und der <THUMBPRINT> als roter Kreis. Diese Werte fügen wir in das folgende config-script ein, das es auch hier zum Download gibt:

# Die folgenden Parameter anpassen:
 
$subscriptionName = '<SUBSCRIPTION-NAME>'
$subscriptionId = '<SUBSCRIPTION-ID>'
$thumbprint = '<THUMBPRINT>'
$storageAccount = '<STORAGE-ACCOUNT>'
 
# Ab hier nichts mehr aendern
$mgmtCert = Get-Item cert:\\CurrentUser\My\$thumbprint
 
Set-AzureSubscription -SubscriptionName $subscriptionName -SubscriptionId $subscriptionId 
-Certificate $mgmtCert
 
Set-AzureSubscription -DefaultSubscription $subscriptionName
 
Set-AzureSubscription -SubscriptionName $subscriptionName –CurrentStorageAccount $storageAccount


Nachdem wir das ps1-script angepasst und ausgeführt haben, wählen wir noch die aktuelle Konfiguration aus:

> Select-AzureSubscription -SubscriptionName "<SUBSCRIPTION-NAME>"

Schlussendlich können wir die bereits konfigurierte Disk in eine VM einbinden, die wir mit folgendem Befehl erstellen:

> New-AzureVMConfig -DiskName 'UbuntuServerDisk1' -InstanceSize Small -Name 'UbuntuServer' |
Add-AzureEndpoint -Name "ssh" -Protocol tcp -LocalPort 22 -PublicPort 22 |
Add-AzureEndpoint -Name "http" -Protocol tcp -LocalPort 80 -PublicPort 80 |
New-AzureVM -ServiceName 'UbuntuServer62722' -Location 'West Europe'

Zu beachten ist, dass der Parameter “-ServiceName” wieder weltweit einzigartig ist und noch nicht vergeben sein darf, andernfalls erhalten wir die Meldung:

New-AzureVM : "An exception occurred when calling the ServiceManagement API. HTTP Status Code: 409. Service Management Error Code: ConflictError. Message: The specified DNS name is already taken.

Außerdem wichtig ist bei dieser pipe, dass Endpoints mittels “Add-AzureEndpoint” gesetzt werden, damit die Maschine von außen über Port 22 und Port 80 erreichbar ist. Tun wir das nicht, befindet sich die Maschine in einer BlackBox und kann von außen nicht angesprochen werden. In anderen Worten: Löschen und erneut konfigurieren.

Wenn die Maschine nicht von selbst startet, können wir dies auch manuell tun. Dazu ersetzen wir in nachfolgendem Script nur den “-ServiceName” und den “-Name” Parameter:

> Start-AzureVM -ServiceName "UbuntuServer62722" -Name "UbuntuServer"

Damit sollte unsere VM fertig konfiguriert sein – sie wird nun auch mit Status “Running” in unserem Management-Portal in Azure angezeigt:

4

Um uns nun zu unserer Maschine zu verbinden, geben wir in einem SSH-Programm unserer Wahl den ServiceName gefolgt von “cloudapp.net” ein. Wir sehen unsere DNS auch im Dashboard, wenn wir auf die VM klicken, unten rechts im “quick glance”-Block:

7


8

Hinweis:
Sollte man übrigens unabsichtlich durch Experimentieren die Konfiguration der Azure PowerShell “zerschießen”, hilft es eventuell, den Ordnerinhalt in “C:\Users\<username>\AppData\Roaming\Windows Azure Powershell” zu löschen. In diesem Ordner werden Default-Konfigurationen von Azure PowerShell gespeichert.


Schritt 3: Download der VHD und Aufräumen

Eventuell möchten wir unsere VM aus dem Netz nehmen, downloaden und unsere VM- und Storage-Accounts löschen. Hier gehen wir mehr oder weniger den umgekehrten Weg aus Schritt 2. Zuerst stoppen wir die VM:

> Stop-AzureVM -ServiceName "UbuntuServer62722" -Name "UbuntuServer"

Danach können wir die VHD downloaden:

> Save-AzureVhd -Source 'https://ubuntustorage111.blob.core.windows.net/vhds/UbuntuServer.vhd' 
-LocalFilePath "C:\Users\t-chvor\Desktop\DownloadedVM.vhd"

Dann entfernen wir die VM:

> Remove-AzureVM -ServiceName "UbuntuServer62722" -Name "UbuntuServer"

Nun können wir die Disk und die zugehörige VHD entfernen. Es kann aber einige Minuten dauern bis die VM tatsächlich gelöscht ist, das bedeutet zwischen dem vorherigen und dem nächsten cmdlet sollte eine kurze Wartezeit liegen, andernfalls erhalten wir die Exception: “A disk with name UbuntuServerDisk1 is currently in use by virtual machine

> Remove-AzureDisk -DiskName "UbuntuServerDisk1" –DeleteVHD 

Jetzt entfernen wir noch das Cloud-Service:

> Remove-AzureService -ServiceName "UbuntuServer62722"

Abschließend entfernen wir den Storage-Account:

> Remove-AzureStorageAccount -StorageAccountName "ubuntustorage111"

Damit sind alle Daten gelöscht, es fallen hierfür keine Kosten mehr an.


Dadurch, dass der Up- und Download-Prozess vollständig scriptbar ist, können VHDs zu jeder Zeit hochgeladen, daraus VM erstellt und wieder gelöscht werden – je nachdem wann die Maschine benötigt wird. Das bedeutet in der Realität: Lässt sich ungefähr voraussagen, wann ich für meine Services mehr Rechenleistung brauche, kann ich temporär zeitgesteuert über ein PowerShell-Script einen eigenen Server via Azure zuschalten. Durch diesen “on demand”-Ansatz ergibt sich der große Vorteil, dass nicht extra Hardware gekauft werden muss, wenn diese nicht permanent benötigt wird.

Es ist hier Microsoft außerdem hoch anzurechnen, dass sie auch die Distribution von Linux-basierten Systemen vollständig unterstützen, außerdem ist die Gefahr eines “Vendor lock-in” durch den jederzeit möglichen Download der virtuellen Festplatten in gängigen Formaten praktisch gänzlich ausgeschlossen.

Das komplette PS-Script für den automatisierten Upload gibt es hier zum Download (ohne error-handling), es müssen lediglich die entsprechenden Variablen angepasst werden.

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

Datenschutzhinweis: Sie stimmen durch "Kommentar speichern" der Speicherung Ihrer Angaben durch Microsoft Österreich für die Beantwortung der Anfrage zu. Sie erhalten dadurch keine unerwünschten Werbezusendungen. Ihre Emailadresse wird auf Ihren Wunsch dazu verwendet Sie über neue Kommentare zu informieren.

Microsoft respektiert den Datenschutz. Datenschutz & Cookies

Entwickler Wettbewerbe:

Wettbewerbe

Entwickler Events:

Developer Events

App für Windows 8, Windows Phone oder/und Azure? Diese Events zeigen Dir, wie es geht:

Mehr Information

Aktuelle Downloads

Visual Studio Downloads
 
Windows Azure Free Trial
Instagram
CodeFest.at on Facebook

Datenschutz & Cookies · Nutzungsbedingungen · Impressum · Markenzeichen
© 2013 Microsoft. Alle Rechte vorbehalten · BlogEngine.NET 2.7.0.0 · Diese Website wird für Microsoft von atwork gehostet.
powered by atwork