CustomScriptExtension Teil 2 (Windows)


Im letzten Post haben wir die CustomScriptExtension für Linux-VMs kennengelernt, die Extension kann aber natürlich auch für Windows-basierte VMs eingesetzt werden, wenngleich mit leichten Unterschieden im Template. Daher hier noch der Blogpost, wie CustomScript Extensions für Windows VMs verwendet werden können.

Auch hier bedienen wir uns als Basis wieder aus der Sammlung der Quickstart Templates auf GitHub, diesmal mit dem Template 101-vm-simple-windows. Einmal herunterladen und im Editor öffnen, bitte.

Im Unterschied zu den Linux CustomScript Extensions wird für Windows ein anderer Namespace verwendet, der entsprechende Teil unserer Ressource sieht zum Beispiel so aus:

          {
            "type": "extensions",
            "name": "CustomScriptExtension",
            "apiVersion": "2015-06-15",
            "location": "[resourceGroup().location]",
            "dependsOn": [
                "[variables('vmName')]"
            ],
            "properties": {
                "publisher": "Microsoft.Compute",
                "type": "CustomScriptExtension",
                "typeHandlerVersion": "1.8",
                "autoUpgradeMinorVersion": true,
                "settings": {
                    "fileUris": [
                        "https://raw.githubusercontent.com/gitralf/mytemplates/master/customscript-windows/customize.ps1"
                    ],
                    "commandToExecute": "powershell -ExecutionPolicy Unrestricted -file customize.ps1"
                }
            }
        }

Publisher ist nicht Microsoft.Azure.Extensions, sondern Microsoft.Compute. Und der Type ist auch nicht CustomScript, sondern CustomScriptExtension. TypeHandlerVersion schließlich ist nicht 2.0, sondern 1.8.

Eine weitere Abweichung ergibt sich bezüglich der Stelle, an der wir diese Ressourcendefinition einfügen müssen. Während bei der Linux-Variante die Ressource parallel zu den sonstigen Ressourcendefinitionen stand (also in einer Ebene mit virtualMachines, networkInterfaces etc), erfolgt hier die Definition als Teil der virtualMachines-Ressource. Wir gehen in unseren Lieblingseditor mit dem Template, welches wir vorhin heruntergeladen haben, und suchen die Stelle, an der die "properties" der "virtualMachine" definiert sind. Wir finden sie zwischen den Zeilen 130 und 179, zum Vergleich der Anfang:

      "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))]",
        "[resourceId('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {

und das Ende:

        "diagnosticsProfile": {
          "bootDiagnostics": {
            "enabled": "true",
            "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))).primaryEndpoints.blob]"
          }
        }
      }
    }
  ],

Zwischen die Zeile 179 und 180 fügen wir - als weitere Ressource für die virtualMachine - unseren Code ein:

        "diagnosticsProfile": {
          "bootDiagnostics": {
            "enabled": "true",
            "storageUri": "[reference(resourceId('Microsoft.Storage/storageAccounts/', variables('storageAccountName'))).primaryEndpoints.blob]"
          }
        }
      },
      "resources": [
        {
          "type": "extensions",
          "name": "CustomScriptExtension",
          "apiVersion": "2015-06-15",
          "location": "[resourceGroup().location]",
          "dependsOn": [
            "[variables('vmName')]"
          ],
          "properties": {
            "publisher": "Microsoft.Compute",
            "type": "CustomScriptExtension",
            "typeHandlerVersion": "1.8",
            "autoUpgradeMinorVersion": true,
            "settings": {
              "fileUris": [
                "https://raw.githubusercontent.com/gitralf/mytemplates/master/customscript-windows/customize.ps1"
              ],
              "commandToExecute": "powershell -ExecutionPolicy Unrestricted -file customize.ps1"
            }
          }
        }
      ]
    }
  ],
 "outputs": {
    "hostname": {

Wir sehen, dass hier die Datei "customize.ps1" aus einem GitHub-Repository in die Windows-VM kopiert und mittels PowerShell ausgeführt wird. In unserem Beispiel wieder etwas ganz einfaches, wir schreiben einen Eventlog-Eintrag:

Write-Eventlog -Logname 'Windows PowerShell' -Source "PowerShell" -EventId 3333 -Message "Demo!"

Auch hier bieten sich die unterschiedlichsten Möglichkeiten, von Starten/Stoppen von Diensten, Installation von Paketen, Anlegen von Verzeichnissen, bis hin zu was-auch-immer. Die Übergabe von Parametern geht natürlich ebenfalls.

Das Deployment ist wieder identisch, also zuerst eine Ressourcengruppe anlegen und dann das Deployment unter Angabe des Templates:

New-AzureRmResourceGroup -Name cstest2 -Location germanycentral
New-AzureRmResourceGroupDeployment -ResourceGroupName cstest2 -Name cstest21 -TemplateFile azuredeploy.json

Das ganze (fertige) Beispiel gibt es auch direkt zum Download bei GitHub: https://github.com/gitralf/mytemplates/tree/master/customscript-windows.

Comments (0)

Skip to main content