Neuer MVA-Kurs: PowerShell: Azure-Automatisierung für Einsteiger

Mit Freude kann ich heute verkünden, dass mein neuer Kurs zum Thema “PowerShell: Azure-Automatisierung für Einsteiger” in der Microsoft Virtual Academy (MVA) live gegangen ist. Ein paar hatten ja schon vorher die Videos auf Channel 9 entdeckt. Da die MVA auf die Videos in Channel 9 zurückgreift, ließ sich die vorzeitige Enthüllung auch nicht vermeiden. ;-)

Die Vorbereitung dieses Kurses hat mir wesentlich bei der Vorbereitung für die MCP-Prüfung Implementing Microsoft Azure Infrastructure Solutions (Exam 70-533) geholfen, da ein umfangreicher Teil der MCP-Prüfung sich mit VMs, Cloud-Diensten (Cloud Services), Speicher (Storage) und PowerShell befasst.

Inhalte des Kurses

Das Verwaltungsportal ist für die meisten Verwaltungsaufgaben in Microsoft Azure ausreichend. Sobald sich jedoch Verwaltungsaufgaben wiederholen, bietet es sich an, diese zu automatisieren. Für die fortgeschrittene Administration in Microsoft Azure wird man daher schnell zu anderen Verwaltungswerkzeugen greifen: Windows PowerShell. Dieser Kurs zeigt in vielen Demos und der nötigen Theorie dazu, wie Sie automatisiert Cloud-Dienste, Speicherkonten und virtuelle Maschinen (VMs) erstellen können. Alle Skripte stehen Ihnen zum Download zur Verfügung.

Der Kurs ist in fünf Module mit folgenden Inhalten gegliedert.

Modul 1: Erste Schritte

Der erste Teil dieses Kurses beschäftigt sich mit der Installation von PowerShell für Azure und der Verwaltungszertifikate, die für die Authentisierung gegenüber Azure notwendig sind. Zum Abschluss des ersten Teils schauen wir uns einen Editor für die Erstellung von PowerShell-Skripten an: die PowerShell Integrated Scripting Environment (PowerShell ISE).

Modul 2: VMs automatisiert erstellen

Der zweite Teil baut zuerst Grundlagen über Cloud-Dienste, Speicherkonten und virtuelle Maschinen (VMs) auf. Zum Vergleich wird die Erstellung einmal komplett im Verwaltungsportal demonstriert. Anschließend werden alle notwendigen PowerShell-Befehle beschrieben und in einer kompletten Demo per PowerShell angewendet.

Modul 3: VMs verwalten und überwachen

Der dritte ist voll mit Demos und wir schauen uns ganz praktisch an, wie man alle offenen Ports (Endpoints) in einem Azure-Abonnement erhält, Vorlagen (Images) für die VM-Erstellung findet und VMs kostenbewusst herunterfährt.

Modul 4: VHDs sichern, kopieren und löschen

Das Kopieren und Sichern von Daten in Azure mithilfe von PowerShell bildet den Schwerpunkt im vierten Teil dieses Kurses. Zusätzlich widmen wir uns zwei häufigen Fragestellungen: wie findet man gesperrte VHDs und wie löscht man einen Cloud-Dienst samt VMS, Datenträger und VHDs mit einem einzigen PowerShell-Befehl.

Modul 5: Tipps & Tricks

Im fünften und letzten Teil schließen wir den Kurs mit Tipps & Tricks ab. Sie erfahren, wo Sie weitere PowerShell-Befehle und Dokumentation finden können. Zudem lernen Sie einen Tipp kennen, wie Sie Dienste in Azure zur internen Dokumentation selbst beschriften und beschreiben können. Und zum Schluss natürlich, wo Sie weitere nützliche Werkzeuge und Tools finden.

Beispielskripte

In den Modulen zeige ich etliche Beispielskripte, die ich alle auf GitHub Gist zur Verfügung gestellt habe. Zur Sicherheit habe ich alle Skripte noch einmal ans Ende dieses Blog-Posts kopiert. Dabei allerdings bitte beachten, dass die neuste Version sich immer bei GitHub Gist befinden wird. Die Skripte unten sind Stand 28.01.2015 aktuell.

  1. MVA01-AzureVM.ps1
  2. MVA02-Endpoints.ps1
  3. MVA03-Images.ps1
  4. MVA04-BlobCopy.ps1
  5. MVA05-BlobSnapshot.ps1
  6. MVA06-LockedVHDs.ps1

MVA01-AzureVM.ps1

 # Sample by Peter Kirchner (peter.kirchner@microsoft.com)

# Settings
$subscriptionName = "MSFT MVA Live" # Get-AzureSubscription
$location = "West Europe" # Get-AzureLocation
$serviceName = "pktestservice"
$storageAccountName = "pkteststorage"
$storageContainerName = "vhds"
$adminUsername = "adm_test"
$adminPassword = "Azureisttoll!"
$imageNameWS2012R2 = "a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201410.01-en.us-127GB.vhd" # Get-AzureVMImage
$vmName = "host1"

# In case you have more than one Azure subscription, select one.
Set-AzureSubscription -SubscriptionName $subscriptionName

# 1st: create cloud service
New-AzureService -Location $location -ServiceName $serviceName

# 2nd: create storage account.
New-AzureStorageAccount -Location $location -StorageAccountName $storageAccountName

# 3rd: create container for VHDs.
$storageAccountKey = Get-AzureStorageKey -StorageAccountName $storageAccountName
$storageContext = New-AzureStorageContext -StorageAccountKey $storageAccountKey.Primary -StorageAccountName $storageAccountName
$result = New-AzureStorageContainer -Name $storageContainerName -Permission Off -Context $storageContext

# 4th: New-AzureVM needs the CurrentStorageAccountName to be set.
Set-AzureSubscription -SubscriptionName $subscriptionName -CurrentStorageAccountName $storageAccountName

# 5th: create new VM configuration.
$vmConfig = New-AzureVMConfig -ImageName $imageNameWS2012R2 -InstanceSize Small -Name $vmName  `
                -MediaLocation "https://$storageAccountName.blob.core.windows.net/$storageContainerName/$vmName.vhd"

# 6th: add provisioning data to VM configuration.
$vmConfig = Add-AzureProvisioningConfig -Windows -AdminUsername $AdminUsername -Password $AdminPassword -VM $vmConfig

# 7th: create new VM and let it start.
New-AzureVM -ServiceName $serviceName -Location $location -VMs $vmConfig

MVA02-Endpoints.ps1

 # sample 1
Get-AzureVM | Get-AzureEndpoint

# sample 2
Get-AzureVM | Get-AzureEndpoint | Select-Object -Property Vip, Name, Port, LocalPort | Format-Table -AutoSize

# sample 3
Get-AzureVM | ForEach-Object {
    # Save the current VM for use in the nested ForEach.
    $vm = $_
    # Get all endpoints of the current VM.
    $endpoints = Get-AzureEndpoint -VM $vm
    # Iterate all endpoints of the current VM.
    $output = $endpoints | ForEach-Object {
        # Create our own set of properties we want for output.
        $hashtable = @{ServiceName=$vm.ServiceName; InstanceName=$vm.InstanceName; DNSName=$vm.DNSName; Protocol=$_.Name; Vip=$_.Vip; ExternalPort=$_.Port; InternalPort=$_.LocalPort}
        # Create a new PowerShell object for output.
        New-Object PSObject -Property $hashtable
    }
    $output
 }  | Format-Table -Property ServiceName, InstanceName, Vip, Protocol, ExternalPort, InternalPort, DNSName -AutoSize

MVA03-Images.ps1

 # sample 1
$images = Get-AzureVMImage
$images.Count
$images[0]

# sample 2
$images | Group-Object -Property OS

# sample 3
$images | Group-Object -Property PublisherName | Sort-Object -Property Name | Format-Table -Property Count, Name -AutoSize

# sample 4
$images | Group-Object -Property ImageFamily | Sort-Object -Property Name | Format-Table -Property Count, Name -AutoSize
$images | Where-Object -Property ImageFamily -eq "Windows Server 2012 R2 Datacenter" | Format-List -Property ImageName, Label, PublishedDate

# sample 5
$imageName = Get-AzureVMImage | Where-Object -Property ImageFamily -eq "Windows Server 2012 R2 Datacenter" | Sort-Object -Property PublishedDate -Descending | Select-Object -ExpandProperty ImageName -First 1
$imageName

MVA04-BlobCopy.ps1

 # Prepare two storage accounts with three containers source, destination, and backup.

## Copy from current stroage account.
# sample 1
Get-AzureStorageBlob -Container source
Start-AzureStorageBlobCopy -SrcContainer source -SrcBlob test1 -DestContainer destination

# sample 2
Get-AzureStorageBlob -Container source -Blob "*.vhd" | Start-AzureStorageBlobCopy -DestContainer destination

## Different storage accounts
# Get keys for storage accounts pksource and pkdestination.
$keys1 = Get-AzureStorageKey -StorageAccountName pksource
$keys2 = Get-AzureStorageKey -StorageAccountName pkdestination

# Create two storage contexts for resp. pksource and pkdestination.
$contextSource = New-AzureStorageContext -StorageAccountName $keys1.StorageAccountName -StorageAccountKey $keys1.Primary
$contextDestination = New-AzureStorageContext -StorageAccountName $keys2.StorageAccountName -StorageAccountKey $keys2.Primary

# Copy single blob from storage account pksource, container source to sorage account pkdestination, container backup.
Start-AzureStorageBlobCopy -Context $contextSource -SrcContainer source -SrcBlob test1 -DestContext $contextDestination -DestContainer backup

# Copy VHDs from current storage account (pksource), container source to storage account pkdestination, container backup.
Get-AzureStorageBlob -Container source -Blob "*.vhd" | Start-AzureStorageBlobCopy -DestContext $contextDestination -DestContainer backup

# Copy VHDs from storage account pkdestination, container backup to storage account pksource, container archive.
Get-AzureStorageBlob -Context $contextDestination -Container backup -Blob "*.vhd" | Start-AzureStorageBlobCopy -DestContext $contextSource -DestContainer destination

MVA05-BlobSnapshot.ps1

 # step 1: get file
$blobFile = Get-AzureStorageBlob -Container source | Where-Object -Property Name -eq "version.txt"

# step 2: create snapshot
$cloudBlob = $blobFile.ICloudBlob
$cloudBlob.CreateSnapshot()

# step 3: get snapshots
$snapshot = Get-AzureStorageBlob -Container source | Where-Object -Property SnapshotTime

# step 4: download snapshot
$snapshot[0] | Get-AzureStorageBlobContent

MVA06-LockedVHDs.ps1

 Set-AzureSubscription -SubscriptionName "MSFT MVA Live" -CurrentStorageAccountName pktest1

# sample 1
$blobs = Get-AzureStorageBlob -Container vhds
$blobs | Format-Table -AutoSize

$disks = Get-AzureDisk | Select-Object -ExpandProperty MediaLink | Select-Object -ExpandProperty AbsoluteUri
$disks

$blobs | Select-Object -ExpandProperty ICloudBlob | Select-Object -ExpandProperty Uri | Select-Object -ExpandProperty AbsoluteUri

# Get all blobs for the given container that are used by disks.
$lockedBlobs = $blobs | Where-Object {$disks -contains $_.ICloudBlob.Uri.AbsoluteUri}
$lockedBlobs

# sample 2

# Simply remove all disks and ignore errors.
Get-AzureDisk | Remove-AzureDisk

# Remove all disks which are not attached to any VM anymore.
Get-AzureDisk | Where-Object AttachedTo -eq $null | Remove-AzureDisk