Azure Quickstart Templates besser nutzen

Wer sich mit dem Azure Resource Manager beschäftigt, der landet früher (hoffentlich) oder später bei den Azure Quickstart Templates auf GitHub. Da findet man für ganz viele Ressourcen Beispiele, die man dann an eigene Bedürfnisse anpassen kann. Heute wollen wir uns mal damit beschäftigen, wie man diese Vorlagen noch besser nutzen kann, insbesondere auch (aber nicht nur) mit Blick auf Microsoft Azure Deutschland.

Download

Klar ist die neueste Version immer nur online verfügbar, aber Git bietet ja von Hause aus schon Möglichkeiten, das offline verfügbar zu machen. Also entweder man lädt sich einfach das komplette Repository runter, oder man fork't und sync't lokal. Ist aber nicht Thema hier, daher bitte bei Git nachlesen, wie das mit fork geht. Download ist einfach, da steht rechts oben ein "Clone or Download" und dort kann man mit "Downlaod ZIP" alles einfach runterladen. Aufpassen, ist eine Menge!

Übersicht

Ein Problem ist immer wieder, ein Template zu finden, in dem eine bestimmte Ressource verwendet wird. Dafür habe ich mir mal einen PowerShell-Script (was sonst?) geschrieben, der folgendes macht:

  • geht alle JSON-Dateien im Dateibaum durch (nach dem Download, siehe oben). Dabei war es mir egal, ob die JSON Datei auch wirklich verwendet wird (azuredeploy.json) oder nicht (metadata.json), ich durchsuche einfach alle.
  • wenn die JSON-Datei einen Ressourceneintrag hat, dann wird der Typ ausgelesen
  • Template-Name und Ressourcentyp wird in eine Exceltabelle geschrieben (mit Link auf das Raw-Format der Github-Version, kann man aber auch umbauen auf den lokalen Pfad (Zeilen sind auskommentiert)
  • am Ende des Scripts kann man mit dem Excel weiterarbeiten (filtern, sortieren, speichern, was auch immer)

Nun kann man in der Excel-Tabelle einfach nach einem bestimmten Ressourcetyp suchen und bekommt alle Templates, die ihn verwenden, per Mausklick präsentiert. Praktisch, oder?

Hier der Skript (ja, ich weiß, quick&dirty, wir gehen ihn aber im Anschluß durch):

[code]
$AQSpath="C:\woauchimmer\azure-quickstart-templates-master"

$xlo = New-Object -comobject Excel.Application
$xlo.Visible = $true
$xlw = $xlo.Workbooks.Add()
$xlw.Worksheets.Item(1).Name = "RP"
$xl1 = $xlo.Worksheets.Item(1)

$xl1.Cells.Item(1,1).value2 = "TemplateName"
$xl1.Cells.Item(1,2).value2 = "ResourceProvider"

write-host " --checking "+$strpath -ForegroundColor "yellow"

$folders=get-childitem -path $AQSpath -directory
$xl1counter=0
$folders| foreach-object {
$folder=$_.fullname
$templatename=$_.Name
$jsons=get-childitem -path $folder -filter "*.json" -recurse
if ($jsons.count -gt 0){
$jsons | foreach-object {
$json=$_
write-host " ----checking "+$json.fullname -foregroundColor "yellow"
$template=get-content -Path $json.fullname | ConvertFrom-Json
$resources=$template.resources
if ($resources.count -gt 0){
$resources | foreach-object {
$xl1counter++
# $text='=HYPERLINK("file://'+$json.fullname+'","'+$templatename+'")'
$text='=HYPERLINK("https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/'+$templatename+'/'+$json.Name+'","'+$templatename+'")'
$xl1.Cells.Item($xl1counter,1).formula = $text
$xl1.Cells.Item($xl1counter,2).value2 = $_.type
}
}
}
}
}

Die ersten Zeilen definieren den Pfad zum lokalen Repository, danach wird ein Excel geöffnet und Spaltenüberschriften gesetzt.

Ab Zeile 16 geht der Script dann alle Verzeichnisse durch und sucht (rekursiv) nach JSON-Dateien. Sehr praktisch ist eine der tollen PowerShell-Funktionen, die hier in Zeile 24 verwendet wird, ConvertFrom-Json. Dieses Cmdlet erlaubt anschließend den einfachsten Zugriff auf alle JSON-Knoten (nennt man das so?). Folgerichtig stecken in $resources alle Ressourcen drin, die das Template enthält, und $resources[x].type liefert den Typ der xten Ressource (oder eben innerhalb einer foreach-Schleife). Ich glaub, da schreib ich gleich noch einen Artikel dazu...

Hat ein bisschen gedauert, herauszufinden, warum Excel die Formel nicht wollte (hier Komma als Trennzeichen verwenden im Hyperlink). Entweder Zeile 29 oder Zeile 30 verwenden, je nachdem ob auf die lokale Datei (29 aktiv) oder auf GitHub (30 aktiv) verlinkt werden soll. Die Variante mit beiden Links sei dem Leser als Übungsaufgabe überlassen...

Anpassen an Microsoft Azure Deutschland

Damit die Templates auch in Azure Deutschland laufen, sind meistens nur noch wenige Anpassungen zu machen. Hier die wichtigsten.

Region

Die wenigsten Templates sollten eine fest eingetragene Region (location) verwenden. Meistens wird hier die gleiche Region wie die zugehörige Ressourcengruppe verwendet und man findet hoffentlich sowas wie:

[code gutter="false"]
"location": "[resourceGroup().location]",

Resource Provider

Ist der Resource Provider in Azure Deutschland verfügbar? Die meisten sind verfügbar, wer es vorher prüfen möchte, der kann alle RPs bzw. Types im Template ganz einfach testen. Anmelden in PowerShell und die Resourcetypen für einen Namespace auflisten:

[code gutter="false"]
Login-AzureRmAccount -Environment AzureGermanCloud
(Get-AzureRmResourceProvider -ProviderNamespace Microsoft.Compute)|Select-Object Resourcetypes

Die ganz Mutigen können das ja auch in eine Excel-Tabelle schieben und dann mit SVERWEIS arbeiten... uuhhhh....

Image

Insbesondere ältere VM Images sind nicht alle in Azure Deutschland verfügbar (und eventuell auch nicht in beiden Regionen!). Auch hier bringt PowerShell Klarheit:

[code gutter="false"]
#Liste der Image Publisher
Get-AzureRmVMImagePublisher -Location germanycentral | Select-Object PublisherName

#Liste der Offers für einen bestimmten Publisher
Get-AzureRmVMImageOffer -Location germanycentral -PublisherName SUSE | Select-Object Offer

#Liste der Skus für Publisher und Offer
Get-AzureRmVMImageSku -Location germanycentral -PublisherName SUSE -Offer SLES | Select-Object Skus

VM Größen

Die früher verwendeten (und noch häufig in den Templates hinterlegten) VM Größen wurden zum Teil durch eine neuere Version (v2) ersetzt. Während in Azure beide Größen zur Verfügung stehen, sind auch hier für Azure Deutschland die Älteren weggefallen, d.h. die Templates müssen angepasst werden. Blöderweise hat jeder so seine eigene Vorstellung, wo "vmSize" im Template definiert werden soll. Entweder als Parameter, Variable, oder direkt in der Microsoft.Compute-Ressource (.properties.hardwareProfile.VmSize: "Standard_D2"). Meist reicht das Anfügen von "_v2" ans Ende, also "Standard_D2_v2". Die Liste der VM Größen liefert uns - Überraschung! - wieder PowerShell, und auch hier ist die Angabe der Region wichtig:

[code gutter="false"]
Get-AzureRmVMSize -Location germanycentral

Hardcoded Strings

In einigen wenigen Templates sind noch feste Strings drin mit falschen Endpunkten ("windows.net" meistens). Das hab ich aber schon mal in einem anderen Blog beschrieben.

Noch Fragen? Fragen!

Hier geht's zum kostenlosen Testabo für Azure Deutschland!