When you need to create a consist method where you want to give to the end-user, that is consuming resources on your cloud, the power of creating resource like virtual machines, but you want to control lot of the environment aspects, you should consider using ARM templates.

An Azure Resource Manager template contain JSON formatted definition of one or more Azure resources, along with parameters and variables that facilitate customizing their configuration. When creating, and working with resource templates, you should consider:

  • Which resources you are going to deploy.
  • Where your resources will be located.
  • Which version of the resource provider API you will be use.
  • Whether there are dependencies between resources.
  • When you will specify values of resource properties. While you can include these values in the template, in general, it is preferable to specify them during deployment via corresponding parameters.

**Understanding the structure of a resource template **

A resource template consists of the following sections:

{
   "$schema": "[http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#](http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json)",
   "contentVersion": "",
   "parameters": {  },
   "variables": {  },
   "resources": [  ],
   "outputs": {  }
}

The following table describes the sections in the code sample above.

Element name Required Description
$schema Yes This is a URL representing the location of the JSON schema file, which describes the template language.
contentVersion Yes This can be any value that helps you keep track of changes to template content.
parameters No Parameters can be provided during deployment either interactively or via a parameter file to customize properties of deployed resources.
variables No Variables are typically used to convert values of parameters to the format that is required to set resource property values.
resources Yes These are resource that you want to create or modify as the result of the deployment.
outputs No These values are returned by the deployment.

The next topic discusses these sections in more detail.

The following code is an example of a complete template that deploys a web app and uses code from a .zip file to provision the app:

{
   "$schema": "[http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#](http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json)",
   "contentVersion": "1.0.0.0",
   "parameters": {
     "siteName": {
       "type": "string"
     },
     "hostingPlanName": {
       "type": "string"
     },
     "hostingPlanSku": {
       "type": "string",
       "allowedValues": [
         "Free",
         "Shared",
         "Basic",
         "Standard",
         "Premium"
       ],
       "defaultValue": "Free"
     }
   },
   "resources": [
     {
       "apiVersion": "2014-06-01",
       "type": "Microsoft.Web/serverfarms",
       "name": "[parameters('hostingPlanName')]",
       "location": "[resourceGroup().location]",
       "properties": {
         "name": "[parameters('hostingPlanName')]",
         "sku": "[parameters('hostingPlanSku')]",
         "workerSize": "0",
         "numberOfWorkers": 1
       }
     },
     {
       "apiVersion": "2014-06-01",
       "type": "Microsoft.Web/sites",
       "name": "[parameters('siteName')]",
       "location": "[resourceGroup().location]",
       "tags": {
         "environment": "test",
         "team": "ARM"
       },
       "dependsOn": [
         "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
       ],
       "properties": {
         "name": "[parameters('siteName')]",
         "serverFarm": "[parameters('hostingPlanName')]"
       },
       "resources": [
         {
           "apiVersion": "2014-06-01",
           "type": "Extensions",
           "name": "MSDeploy",
           "dependsOn": [
             "[resourceId('Microsoft.Web/sites', parameters('siteName'))]"
           ],
           "properties": {
             "packageUri": "[https://auxmktplceprod.blob.core.windows.net/packages/StarterSite-modified.zip](https://auxmktplceprod.blob.core.windows.net/packages/StarterSite-modified.zip)",
             "dbType": "None",
             "connectionString": "",
             "setParameters": {
               "Application Path": "[parameters('siteName')]"
             }
           }
         }
       ]
     }
   ],
"outputs": {
"siteUri": {
"type": "string",
"value": "[concat('[http://',reference(resourceId('Microsoft.Web/sites](http://',reference(resourceId('Microsoft.Web/sites)', parameters('siteName'))).hostNames[0])]"
}
}
}

Cheers,

Marcos Nogueira azurecentric.com Twitter: @mdnoga