ARM Templates für Azure Deutschland verwenden

Mit dem Azure Resource Manager, kurz ARM, lassen sich auch komplexe Deployments in Textdateien (im JSON-Format) speichern. Diese sogenannten Templates lassen sich dann einfach wiederverwenden. Im Internet sind viele Templates zu finden, die einem ein ganzes Stück Arbeit abnehmen, da man nur noch leichte Anpassungen vornehmen muss. Zum Beispiel finden sich jede Menge Templates auf GitHub unter https://github.com/Azure/azure-quickstart-templates. In der globalen Azure Cloud sind diese Templates direkt lauffähig, aber was muss man beachten, wenn man die Templates für die Microsoft Cloud Deutschland verwenden möchte?

Um das zu verdeutlichen, versuchen wir uns mal an zwei Templates, nämlich dem ganz einfachen Deployment eines Windows Servers, und an einem Minecraft-Server unter Ubuntu. Beide sind als Templates unter dem GitHub-Link zu finden, einmal als 101-vm-simple-windows und einmal als minecraft-on-ubuntu.

Auf den GitHub-Seiten findet sich jeweils ein "Deploy to Azure" Button. Schaut man sich an, wohin der Link geht, wird schnell klar, dass das nichts wird, der Link ist für die globale Azure Cloud ausgelegt (und verweist auf das globale Portal unter azure.com). Daher müssen wir uns die Templates erst herunterladen, bei manchen müssen wir sowieso Anpassungen vornehmen. Also dann, fangen wir mit dem Windows-Server mal an.

101-vm-simple-windows

Auf den GitHub-Seiten sehen wir mehrere Dateien, interessant für uns sind hierbei azuredeploy.json und azuredeploy.parameters.json. Ich klicke immer auf die Dateien, dann auf den "Raw"-Button, und dann markiere ich alles und kopiere es in einen Texteditor. Geht bestimmt auch einfacher, jeder wie er will... Beide Dateien speichern wir mal irgendwo lokal.

Fangen wir mit dem einfacheren Teil an, die Parameter-Datei. Öffnet man sie mit einem Editor, dann sind da drei Einstellungen zu machen, Admin-Name, Passwort und DNS-Name:

[code highlight="6,9,12"]
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"adminUsername": {
"value": "admin123"
},
"adminPassword": {
"value": "GEN-PASSWORD"
},
"dnsLabelPrefix": {
"value": "GEN-UNIQUE"
}
}
}

Wir füllen die Zeilen mit "value" (oben farblich markiert) mit sinnvollen Werten und speichern die Datei wieder ab. Das war es jetzt auch schon. Ganz ehrlich. Das 101-Template auf GitHub wurde schon so modifiziert, dass es für den Einsatz in beliebigen Cloud-Umgebungen geeignet ist. Wir probieren das mal aus und starten eine PowerShell mit installierten Azure Cmdlets und loggen uns ein:

 
Login-AzureRMAccount -Environment AzureGermanCloud

Für all diejenige, bei denen das Environment AzureGermanCloud nicht existiert: Mal eine neuere Version der PowerShell Azure Cmdlets installieren...

Wir legen als erstes eine neue Ressourcengruppe an, zur Auswahl stehen als Regionen germanycentral oder germanynortheast:

 
New-AzureRmResourceGroup -ResourceGroupName ralf101new -Location germanynortheast

Der Name der Ressourcengruppe ist natürlich beliebig. Sobald die Gruppe angelegt ist, steht unserem Deployment nichts mehr im Wege. Wir wechseln in das Verzeichnis mit unseren JSON-Dateien von oben und starten das Deployment (das wir einfach auch mal "ralf101new" nennen):

 
New-AzureRmResourceGroupDeployment -Name ralf101new -ResourceGroupName ralf101new -TemplateFile .\azuredeploy.json -TemplateParameterFile .\azuredeploy.parameters.json

Und nach einigen Minuten meldet uns Azure das erfolgreiche Deployment. Das war einfach, oder? Etwas schwerer wird es dann schon bei unserem zweiten Versuch.

minecraft-on-ubuntu

Auch hier gehen wir erst mal wie oben vor uns laden die beiden Dateien herunter, am besten in ein neues Verzeichnis, und editieren wieder die Parameter-Datei (die Bedeutung der Parameter sollte klar sein...). Auf die dritte Datei kommen wir später zurück.

In diesem Fall brauchen wir das Deployment gar nicht erst zu starten, es wird schiefgehen. Warum? Nun, das Problem liegt (unter anderem) in Zeile 305:
[code gutter="false"]
"uri": "[concat('https://',variables('newStorageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"

Dies ist ein beliebtes Verfahren, um die URI für den weiter oben erzeugten Storage zu erzeugen. Aber leider taugt die Endung "blob.core.windows.net" nicht für Azure Deutschland. Da müsste ein "blob.core.cloudapi.de" stehen. Das ist die einzige Anpassung, die nötig ist. Zugegeben, damit wird das Template unbrauchbar für die Globale Azure Cloud, aber das soll Thema eines weitere Blog Artikels sein. Also Ändern und speichern. Und schon geht's wieder los - Gruppe erstellen und Deployment starten:

 
New-AzureRmResourceGroup -ResourceGroupName ralfmc01 -Location germanynortheast
New-AzureRmResourceGroupDeployment -Name ralfmc01 -ResourceGroupName ralfmc01 -TemplateFile .\azuredeploy.json -TemplateParameterFile .\azuredeploy.parameters.json

Übrigens ruft das Deployment noch einen Script auf, das ist diese dritte Datei, die da rumliegt. Dieser Script installiert dann noch den Minecraft-Server. Wer möchte, kann den Server anschließend als Multiplayer Server konfigurieren. Die IP-Adresse bzw. der Servername finde sich entweder über das Portal, oder - wenn wir schon mal hier in PowerShell sind - mittels:

 
Get-AzureRmPublicIpAddress -ResourceGroupName mcralf01

Zusammenfassung

Viele der Templates lassen sich auf die gezeigte Weise anpassen, indem nach fest kodierten Strings gesucht wird und diese ggf. auf die Werte für Azure Deutschland angepasst werden. Die wichtigsten Endpunkte finden sich in diesem Blogartikel.

Für alle, die ihre Templates universell einsetzbar machen möchten, ist der nächste Blogartikel schon in Vorbereitung...

Viel Spaß!