Azure Resource Manager (ARM) Templates Overview
ARM templates are Infrastructure as Code (IaC) that define and deploy Azure resources consistently and automatically.
Template Advantages
-
Deploy all resources as a single operation.
-
Faster and repeatable deployments.
-
No manual, error-prone tasks.
Benefits
-
Consistency: Same structure and format across tools.
-
Complex Deployments: Handles resource dependencies automatically.
-
Error Reduction: Ensures uniform deployment.
-
Code-Based: Templates can be versioned and documented like software.
-
Reuse: Parameters allow multiple configurations from the same template.
-
Linkable: Templates can be modular and combined.
-
Simplified Orchestration: One deployment handles all resources.
Template Structure (JSON)
{
"$schema": "http://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"functions": [],
"resources": [],
"outputs": {}
}
| Element | Required | Description |
|---|---|---|
$schema |
Yes | JSON schema for template version. |
contentVersion |
Yes | Template version for tracking changes. |
parameters |
No | Values provided at deployment time. |
variables |
No | Reusable values in the template. |
functions |
No | User-defined functions. |
resources |
Yes | Azure resources to deploy. |
outputs |
No | Values returned after deployment. |
Template Parameters
Define user input for deployments.
"parameters": {
"adminUsername": {
"type": "string",
"metadata": { "description": "Username for the Virtual Machine." }
},
"adminPassword": {
"type": "securestring",
"metadata": { "description": "Password for the Virtual Machine." }
}
}
-
Limit: 256 parameters per template.
-
Use objects to reduce parameter count.
Template Variables
Reusable values to simplify templates.
"variables": {
"nicName": "myVMNic",
"addressPrefix": "10.0.0.0/16",
"subnetName": "Subnet",
"subnetPrefix": "10.0.0.0/24",
"publicIPAddressName": "myPublicIP",
"virtualNetworkName": "MyVNET"
}
Template Functions
Reusable expressions to reduce repetition.
"functions": [
{
"namespace": "contoso",
"members": {
"uniqueName": {
"parameters": [{ "name": "namePrefix", "type": "string" }],
"output": {
"type": "string",
"value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
}
}
}
}
]
-
Restrictions: Cannot access variables, call other functions, or use defaults.
Template Resources
Define Azure resources for deployment.
{
"type": "Microsoft.Network/publicIPAddresses",
"name": "[variables('publicIPAddressName')]",
"location": "[parameters('location')]",
"apiVersion": "2018-08-01",
"properties": {
"publicIPAllocationMethod": "Dynamic",
"dnsSettings": {
"domainNameLabel": "[parameters('dnsLabelPrefix')]"
}
}
}
-
apiVersionensures resource compatibility. -
Use parameters and variables for flexibility.
Template Outputs
Return information after deployment.
"outputs": {
"hostname": {
"type": "string",
"value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
}
}
Best Practices
-
Comment your templates with
//or/* ... */. -
Use parameters and variables for maintainability.
-
Use QuickStart templates as examples:
Azure Quickstart Templates
Running ARM Templates with PowerShell
1. Connect to your subscription
Connect-AzAccount
Get-AzContext
Set-AzContext -Subscription <SubscriptionID>
2. Create a Resource Group
New-AzResourceGroup -Name <ResourceGroupName> -Location <AzureRegion>
3. Deploy Template
$templateUri = "<TemplateURL>"
New-AzResourceGroupDeployment -Name <DeploymentName> -ResourceGroupName <ResourceGroupName> -TemplateUri $templateUri
-
Enter parameters when prompted (username, password, DNS label).
-
Automate input with a
.ps1script.
4. Verify Deployment
Get-AzVM
$vm = Get-AzVM -Name <VMName> -ResourceGroupName <ResourceGroupName>
$vm.HardwareProfile.vmSize = "Standard_A3"
Update-AzVM -ResourceGroupName <ResourceGroupName> -VM $vm