Azure-Dienste per PowerShell anlegen

Der Dotnet-Doktor  –  0 Kommentare

Ein PowerShell-Skript legt schnell mehrere Webserver und Datenbanken in Microsofts Azure-Cloud an.

Wer mehrere Ressourcen in Microsofts Cloud-Dienst "Azure" anlegen will, hat einiges an Klickarbeit im Azure-Webportal zu erledigen. Einer Alternative ist das Skripten. Neben dem klassischen Kommandozeilenwerk az.exe gibt es PowerShell-Commandlets (für Windows PowerShell und die plattformneutrale PowerShell Core), Azure Management Libraries for .NET und Java sowie eine REST-API. In diesem Beitrag werden die PowerShell-Commandlets vier Webserver (Azure Web App Services) und zwei Datenbanken (SQL Azure) anlegen.

Notwendige Vorarbeit ist die Installation des PowerShell-Moduls AzureRM aus der PowerShell Gallery:

Install-Module PowerShellGet -Force -Scope currentuser 
Install-Module -Name AzureRM -force -Scope currentuser

Mit diesem Befehl wird zunächst die aktuelle Version des PowerShell-Paketmanagements und dann das Modul im Modulverzeichnis des angemeldeten Benutzers installiert. Der Standard-Scope "AllUsers" ist nur möglich, wenn die PowerShell unter administrativen Rechten gestartet ist.

Zur Kontrolle der Modulinstallation kann man sich nun das PowerShell-Modul und die verfügbaren Azure-Commandlets in einer Tabelle ausgeben lassen:

Get-Module AzureRM -ListAvailable | Select-Object -Property Name,Version,Path | ft
Get-Command -module AzureRM*

Die Liste ist sehr lang: Die derzeit aktuelle Version 6.10 des Moduls enthält 2207 Commandlets. Der Stern nach AzureRM ist notwendig, da die Commandlets in Untermodulen organisiert sind, die mit AzureRM beginnen, zum Beispiel AzureRM.Sql. AzureRM ist ein Meta-Modul über aktuell 53 Module.

"Anzahl geladener Azure-Module: " + (Get-Module AzureRM* -ListAvailable | Select-Object -Property Name,Version,Path).Count

Danach ist eine Anmeldung beim Azure-Portal notwendig. Mit Eingabe von

Login-AzureRmAccount 

erscheint ein browserbasierter Anmeldedialog. Diese Interaktion ist nur einmal pro Prozess notwendig. Solange die PowerShell-Instanz offen bleibt, gilt die Anmeldung.

Nun folgt das eigentliche Skript, dass die vier Webserver und die zwei Datenbanken anlegt. Das Skript geht davon aus, dass eine entsprechende Ressource Group "DEMO_MiracleList" und ein Service Plan "DEMOMiracleListFREE" im Azure-Webportal schon angelegt wurden. Das Skript braucht einige Sekunden. Während des Ablaufs kann man bereits im Webportal die neuen Dienste betrachten und nutzen.

# Wichtige Festlegungen
$prefix= "HD-"
$RessourceGroup = "DEMO_MiracleList"
$Serviceplan = "DEMOMiracleListFREE"
$Location="West Europe"

#region Ressourcen prüfen
$rg= Get-AzureRmResourceGroup$RessourceGroup
if (-not $sp) { Write-Error "ResourceGroup nicht gefunden!" : return }
$sp= Get-AzureRmAppServicePlan-Name $Serviceplan
if (-not $sp) { Write-Error "Service Plan nicht gefunden!" : return }
#endregion

#region Websites
$webappnames="$($prefix)MLBackend-Produktion","$($prefix)MLBackend-Staging","$($prefix)MLClient-Produktion","$($prefix)MLClient-Staging"

Get-AzureRmResourceGroup $RessourceGroup

$sp= Get-AzureRmAppServicePlan-Name $Serviceplan
if (-not $sp) { Write-Error "Service Plan nicht gefunden!" : return }
foreach($webappname in$webappnames)
{
Write-Host "Creating $webappname"-ForegroundColor Yellow
# Create a web app.
New-AzureRmWebApp -Name $webappname-Location $Location -AppServicePlan $Serviceplan -ResourceGroupName$RessourceGroup
$wa= Get-AzureRmWebApp-Name $webappname
if ($wa -eq$null) { Write-Error"WebApp wurde nicht angelegt!"; return; }
else { write-host "OK"-ForegroundColor Green }
}
# Kontrolle:
Get-AzureRmWebApp -ResourceGroupName $RessourceGroup |where RepositorySiteName-like "*$prefix*"| ft
#endregion

#region SQL Server
$dbnames="$($prefix)MLDB-Staging","$($prefix)MLDB-Produktion"
$servername = "$($prefix)MLSQLServer"
$adminlogin = "MLSQLAdmin"
$password = New-Guid
Write-Host "SQL Server password is: $password"-ForegroundColor Green
$startip = "0.0.0.0"
$endip= "255.255.255.255"

New-AzureRmSqlServer -ResourceGroupName $RessourceGroup `
-ServerName$servername `
-Location$location `
-SqlAdministratorCredentials $(New-Object -TypeNameSystem.Management.Automation.PSCredential-ArgumentList $adminlogin, $(ConvertTo-SecureString-String $password-AsPlainText -Force))

New-AzureRmSqlServerFirewallRule -ResourceGroupName $RessourceGroup `
-ServerName$servername `
-FirewallRuleName"AllowAll" -StartIpAddress "0.0.0.0"-EndIpAddress $endip

foreach($databasename in$dbnames)
{
New-AzureRmSqlDatabase -ResourceGroupName $RessourceGroup-ServerName $servername -DatabaseName$databasename -RequestedServiceObjectiveName"S0"
}

# Kontrolle
Get-AzureRmSqlDatabase -ResourceGroupName $resourcegroupname-ServerName $servername | ft
#endregion

Für PowerShell Core 6.x (alias PowerShell 6) bietet Microsoft ein anderes Azure-Modul mit Namen "Az". Es läuft auch auf macOS und Linux, hat aber erst den Versionsstand 0.2 und bietet weniger Befehle, da es auf .NET Standard basiert und nicht auf dem vollen Umfang der .NET-Framework-Klassenbibliothek zurückgreifen kann.

Install-Module -Name Az 
Get-Module AZ.* -ListAvailable

Die Befehle haben hier dann "Az" statt "AzureRM" im Namen, zum Beispiel

Login-AzAccount