Tutorial: Deploy virtual machine extensions with Azure Resource Manager templates

Learn how to use Azure virtual machine extensions to perform post-deployment configuration and automation tasks on Azure VMs. Many different VM extensions are available for use with Azure VMs. In this tutorial, you deploy a Custom Script extension from an Azure Resource Manager template to run a PowerShell script on a Windows VM. The script installs Web Server on the VM.

This tutorial covers the following tasks:

  • Prepare a PowerShell script
  • Open a quickstart template
  • Edit the template
  • Deploy the template
  • Verify the deployment

If you don't have an Azure subscription, create a free account before you begin.


To complete this article, you need:

Prepare a PowerShell script

A PowerShell script with the following content is shared from GitHub:

Install-WindowsFeature -name Web-Server -IncludeManagementTools

If you choose to publish the file to your own location, you must update the fileUri element in the template later in the tutorial.

Open a quickstart template

Azure Quickstart Templates is a repository for Resource Manager templates. Instead of creating a template from scratch, you can find a sample template and customize it. The template used in this tutorial is called Deploy a simple Windows VM.

  1. In Visual Studio Code, select File > Open File.

  2. In the File name box, paste the following URL: https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-vm-simple-windows/azuredeploy.json

  3. To open the file, select Open. The template defines five resources:

  4. Save a copy of the file to your local computer with the name azuredeploy.json by selecting File > Save As.

Edit the template

Add a virtual machine extension resource to the existing template with the following content:

    "type": "Microsoft.Compute/virtualMachines/extensions",
    "apiVersion": "2018-06-01",
    "name": "[concat(variables('vmName'),'/', 'InstallWebServer')]",
    "location": "[parameters('location')]",
    "dependsOn": [
    "properties": {
        "publisher": "Microsoft.Compute",
        "type": "CustomScriptExtension",
        "typeHandlerVersion": "1.7",
        "settings": {
            "fileUris": [
            "commandToExecute": "powershell.exe -ExecutionPolicy Unrestricted -File installWebServer.ps1"

For more information about this resource definition, see the extension reference. The following are some important elements:

  • name: Because the extension resource is a child resource of the virtual machine object, the name must have the virtual machine name prefix. See Set name and type for child resources.
  • dependsOn: Create the extension resource after you've created the virtual machine.
  • fileUris: The locations where the script files are stored. If you choose not to use the provided location, you need to update the values.
  • commandToExecute: This command invokes the script.

Deploy the template

For the deployment procedure, see the "Deploy the template" section of Tutorial: Create Azure Resource Manager templates with dependent resources. We recommended that you use a generated password for the virtual machine administrator account. See this article's Prerequisites section.

Verify the deployment

  1. In the Azure portal, select the VM.
  2. In the VM overview, copy the IP address by selecting Click to copy, and then paste it in a browser tab. The default Internet Information Services (IIS) welcome page opens:

The Internet Information Services welcome page

Clean up resources

When you no longer need the Azure resources you deployed, clean them up by deleting the resource group.

  1. In the Azure portal, in the left pane, select Resource group.
  2. In the Filter by name box, enter the resource group name.
  3. Select the resource group name. Six resources are displayed in the resource group.
  4. In the top menu, select Delete resource group.

Next steps

In this tutorial, you deployed a virtual machine and a virtual machine extension. The extension installed the IIS web server on the virtual machine. To learn how to use the Azure SQL Database extension to import a BACPAC file, see: