CustomScriptExtension verfügbar

Mit der Verfügbarkeit der Extension für Custom Scripts in der Microsoft Cloud Deutschland ist es nun möglich, Deployments leichter individuell anzupassen auf eigene Bedürfnisse und Vorgaben. Mit den Custom Scripts können weitere Aufgaben nach der Installation der eigentlichen VM gestartet werden. Hierzu wird zum Azure Ressource Manager Template einfach eine weitere Ressource hinzugefügt, die all die Dateien auflistet, die nachträglich in die fertig ausgebrachte VM reinkopiert werden sollen, sowie ein Script, das anschließend noch ausgeführt wird. Die Dateien können dabei im Azure Storage liegen oder auch sonst irgendwo, zum Beispiel auf GitHub. Die folgenden Abschnitte zeigen dies am Beispiel einer einfachen Linux VM, in einem weiteren Blogpost werden wir dann die Windows-Variante kennen lernen.

Wir verwenden eines der Azure Quickstart Templates von GitHub), das praktischerweise schon fast für Microsoft Azure Deutschland geeignet ist. Wir laden das Template 101-vm-simple-linux erst einmal runter (Download) und öffnen es mit einem Editor unserer Wahl, zum Beispiel Visual Studio Code. Die einzige Anpassung, die wir vornehmen müssen, um das Template in Azure Deutschland verwenden zu können, ist die VM-Größe, also den Parameter vmSize (ca. Zeile 52). Hier muss "Standard_D1_v2" rein.

In diesem Zustand würde das Template jetzt eine Linux-VM in Azure installieren. Um diese Installation durch eigene Scripte noch anpassen zu können, wird einfach eine zusätzliche Ressource am Ende eingefügt. Der entsprechende Teil des Templates sieht also so aus:
[code gutter="false"]
...
"storageUri": "[concat(reference(concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName')), variables('apiVersion')).primaryEndpoints.blob)]"
}
}
}
},
{
"type": "Microsoft.Compute/virtualMachines/extensions",
"name": "[concat(variables('vmName'),'/newuserscript')]",
"apiVersion": "2016-03-30",
"location": "[resourceGroup().location]",
"dependsOn": [
"[concat('Microsoft.Compute/virtualMachines/', variables('vmName'))]"
],
"properties": {
"publisher": "Microsoft.Azure.Extensions",
"type": "CustomScript",
"typeHandlerVersion": "2.0",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"https://raw.githubusercontent.com/gitralf/mytemplates/master/101-vm-simple-linux/myscript.sh"
],
"commandToExecute": "bash myscript.sh"
}
}
}
],
"outputs": {
...

Wie man sieht, wird der Azure Resource Manager auf die Fertigstellung der VM warten, dafür sorgt das dependsOn. Alle Dateien, die anschließend auf die VM kopiert werden sollen, werden mit dem Parameter FileUris aufgelistet. Meist sind das nur wenige oder gar nur ein einzelner Script, der dann wiederum weitere Downloads startet. Im Beispiel wird ein Mini-Script (myscript.sh) aus einem GitHub-Repository kopiert, und zwar in ein Verzeichnis unterhalb von /var/lib/waagent/custom-script/). Das ist in diesem Fall auch der Script, der ausgeführt werden soll, was über den Parameter commandToExecute angegeben wird.

Das Beispiel ist ein ganz einfaches Script:
[code]
#!/bin/bash

mkdir /tmp
chmod 755 /tmp
ls -la / > /tmp/rootlist

Es wird ein /tmp Verzeichnis angelegt, Zugriffsrechte gesetzt und dann eine Liste aller Dateien und Ordner im Stammverzeichnis in die Datei rootlist geschrieben. Nicht besonders sinnvoll, zugegeben, aber es soll ja auch nur ein Beispiel sein. Der Fantasie sind hier kaum Grenzen gesetzt, so können mittels apt-get install sonstwas oder auch über eigene aufwändigere Scripte, wie sie vielleicht jetzt schon im Einsatz sind für Post-Installationen, auch komplexere Szenarien verwirklicht werden. Voraussetzung ist - natürlich - das kein Benutzereingriff erforderlich ist...

Um das Template jetzt auszubringen, benötigen wir zuerst eine Ressourcengruppe, wir nehmen mal als Region germanycentral:

 
New-AzureRmResourceGroup -Name cstest1 -Location germanycentral 

Das Deployment selbst dann wie gewohnt mittels:

 
New-AzureRmResourceGroupDeployment -ResourceGroupName cstest1 -Name cstest11 -TemplateFile azuredeploy.json

Wenn alles geklappt hat, dann erfolgt als Ausgabe praktischerweise der SSH-Connectionstring, und wenn man sich auf die VM verbindet, dann findet sich tatsächlich nach dem Login auf der VM die entsprechende Datei im angegebenen Verzeichnis.

Natürlich lassen sich auch Parameter übergeben an den Script. Geeigneterweise definiert man diese wie gewohnt als Parameter im Template, und nutzt dann die Template-Funktion concat, um die Zeile mit dem Scriptaufruf zu konstruieren:

[code firstline="23"]
"commandToExecute": "[concat('bash myscript.sh ', parameters('verzeichnis'))]"

Der eigentliche Aufruf des Scripts lautet damit dann:

[code gutter="false"]
bash myscript.sh /tmp

...und der kann im Script weiterverwendet werden, zum Beispiel ganz einfach wie folgt:

[code firstline="5"]
ls -la $1 >/tmp/list

Genug der Anregungen. Einfach ein wenig damit spielen und ausprobieren! Es lohnt sich! Weitere Beispiele finden sich in anderen Quickstart Templates auf GitHub als Anregung.