You're a great admin... on-prem. Now, become a great admin in the cloud and prove it by passing the Microsoft Certified: Azure Administrator Associate exam!
An Azure Resource Manager (ARM) template defines infrastructure using declarative syntax. Each resource in the template has a type, name, location, and specific properties. When you modify a template, you can add, remove, or change these definitions. For example, you might update a storage account's SKU or enable new features. You use parameters and variables to make these definitions flexible for different environments, ensuring your deployments remain consistent and scalable.
Resources often depend on each other, and ARM templates use the dependsOn property to manage this order. For instance, a virtual machine deployment must wait for its network interface and virtual network to be created first. When you modify a template, you must update these dependency lists to reflect any new or removed relationships. This sequencing is crucial for a successful deployment and for maintaining compliance with your organization's standards. It's best practice to only specify essential dependencies and to avoid circular dependencies, which can cause deployments to fail.
ARM templates are idempotent, meaning running the same deployment multiple times creates the same result, which is perfect for automation. When updating definitions and dependencies, you should design templates to work with CI/CD pipelines. This involves modularizing templates for reusability and using parameters for environment-specific settings. Before deploying changes, use tools like the ARM Template Test Toolkit and the what-if operation to preview the impact, ensuring your updates are reliable and scalable.
Your modified template must align with organizational policies and Azure best practices. Use Azure Policy to enforce governance rules over the resources you define. Also, when deploying across different Azure regions or clouds, you must verify that all the resource types and API versions you reference are available in those locations. Avoid hard-coding values; instead, use dynamic references to maintain flexibility and compliance across your deployments.
An ARM template is a JSON file with several key sections. The parameters section holds values you input at deployment time, like an environment name. The variables section stores reusable values built from parameters. The core resources section lists every Azure resource to be created or updated. Finally, the outputs section returns useful information, like a resource's IP address, after deployment. Understanding this structure allows you to locate and modify the correct elements effectively.
Beyond basic JSON, ARM templates can include deployment scripts written in PowerShell or Bash. These scripts run during deployment to perform tasks like software installation or configuration, which aren't possible with declarative resources alone. You can also create user-defined functions within the template to simplify complex logic, making the template cleaner and easier to maintain.
Before deploying a modified template, you must validate it. Use the ARM Template Test Toolkit (arm-ttk) to check for common syntax and practice errors. More importantly, always run the what-if operation, which shows a preview of exactly which resources will be created, modified, or deleted. This step prevents unexpected changes to your live environment.
You can deploy an ARM template through the Azure portal, Azure CLI, PowerShell, or a CI/CD pipeline. After deployment, you can review the deployment history in the Azure portal to see what parameters were used and what outputs were generated. This traceability is key for auditing and troubleshooting your infrastructure changes.
Follow best practices to keep templates manageable. Use a modular design by breaking large templates into smaller, linked components. Fully parameterize settings that change between environments, such as development and production. Always validate your template with the available tools before any deployment to ensure a complete and successful rollout.
Parameterization is the practice of using parameters to make a template dynamic. Parameters are external inputs provided at deployment time, like choosing a VM size. Variables are internal values used to simplify complex expressions or avoid repetition within the template. Using both effectively makes a template reusable across different projects and environments without rewriting the core code.
When defining parameters, use clear names and include descriptions. Provide default values for common, non-sensitive settings to simplify deployment for others. Key guidelines are to use parameters for environment-specific details (like SKU or location), to minimize the total number of parameters by offloading logic to variables, and to avoid using empty strings as defaults.
For sensitive data like passwords or connection strings, always use the securestring or secureObject data types. These prevent the secret values from being stored in plain text within deployment logs or history. You should never provide a default value for a sensitive parameter, as this creates a major security vulnerability.
Variables are resolved when the template is parsed, so you cannot use functions that reference runtime resources within them. They are perfect for constructing values used multiple times. For example, when building a URL for an artifact, use the uri template function instead of string concatenation to ensure the result is correctly formatted across different Azure environments.
Prepare and test your skills

Prepare and test your skills

The dependsOn property manages the order in which resources are deployed in ARM templates. For instance, a virtual machine deployment must wait for its network interface and virtual network to be created first. It is best practice to only specify essential dependencies and to avoid circular dependencies, which can cause deployments to fail.
ARM templates are idempotent, meaning running the same deployment multiple times creates the same result. This is important because it is perfect for automation, ensuring consistent results when deploying through CI/CD pipelines.
The securestring and secureObject data types should be used for sensitive data like passwords or connection strings. These prevent the secret values from being stored in plain text within deployment logs or history. You should never provide a default value for a sensitive parameter, as this creates a major security vulnerability.
The ARM Template Test Toolkit (arm-ttk) checks for common syntax and practice errors. Additionally, the what-if operation shows a preview of exactly which resources will be created, modified, or deleted, preventing unexpected changes to your live environment.