How to deploy to Azure using an ARM template with PowerShell
I wrote this article here “How to use/create ARM templates for deployments” where I show how I generated the ARM template for multiple Azure features existing in a Resource Group. I then deploy all features using the ARM template using the Template deployment blade in the portal. This article explains how to run the same ARM template from PowerShell. It is actuall quit simple.
When you create the Automation script via the portal, the extraction also creates a PS1 file named deploy.ps1. This contains the script that performs the deployment using the JSON files, which were also created. Simply right-click on the deploy.ps1 file, as seen in Figure 1 and select “Run with PowerShell”.
Figure 1, deploy ARM template using PowerShell
One note about taking the “Run with PowerShell” approach is that the window closes if there is an exception and upon completion, so you don’t get a chance to see the details of either. You can also select the ‘Edit’ menu item and run it from the PowerShell IDE as seen in Figure 2.
Figure 2, deploy ARM template using PowerShell
If all goes well, then you will be prompted for the the necessary information and the execution will result in the proper deployment of the resources. An output of my ARM template, which was extracted from this resource group here, is as shown in Figure 3.
Figure 3, deploy ARM template using PowerShell
cmdlet deploy.ps1 at command pipeline position 1
Supply values for the following parameters:
subscriptionId:
resourceGroupName: READINESS-HC017-RG
deploymentName: READINESS017
Logging in...
Account :
SubscriptionName :
SubscriptionId :
TenantId :
Environment : AzureCloud
Selecting subscription
Name : [, ]
Account :
Environment : AzureCloud
Subscription :
Tenant :
TokenCache : Microsoft.Azure.Commands.Common.Authentication.AuthenticationStoreTokenCache
VersionProfile :
ExtendedProperties : {}
Registering resource providers
Registering resource provider microsoft.compute
ProviderNamespace : Microsoft.Compute
RegistrationState : Registered
ResourceTypes : {availabilitySets, virtualMachines, virtualMachines/extensions, virtualMachineScaleSets...}
Locations : {East US, East US 2, West US, Central US...}
ZoneMappings :
Registering resource provider microsoft.network
ProviderNamespace : Microsoft.Network
RegistrationState : Registered
ResourceTypes : {virtualNetworks, publicIPAddresses, networkInterfaces, loadBalancers...}
Locations : {West US, East US, North Europe, West Europe...}
ZoneMappings :
Registering resource provider microsoft.storage
ProviderNamespace : Microsoft.Storage
RegistrationState : Registered
ResourceTypes : {storageAccounts, operations, locations/asyncoperations, storageAccounts/listAccountSas...}
Locations : {East US, East US 2, West US, West Europe...}
ZoneMappings :
Registering resource provider microsoft.web
ProviderNamespace : Microsoft.Web
RegistrationState : Registered
ResourceTypes : {sites/extensions, sites/slots/extensions, sites/instances, sites/slots/instances...}
Locations : {Central US, North Europe, West Europe, Southeast Asia...}
ZoneMappings :
Resource group READINESS-HC017-RG does not exist. To create a new resource group, please enter a location.
resourceGroupLocation: West Europe
Creating resource group READINESS-HC017-RG in location West Europe
ResourceGroupName : READINESS-HC017-RG
Location : westeurope
ProvisioningState : Succeeded
Tags :
TagsTable :
ResourceId : /subscriptions//resourceGroups/READINESS-HC017-RG
Starting deployment...
DeploymentName : template
CorrelationId : ac008d7b-c64a-46ba-8fa3-8112260635d5
ResourceGroupName : READINESS-HC017-RG
ProvisioningState : Succeeded
Timestamp : 21.03.2018 09:16:56
Mode : Incremental
TemplateLink :
TemplateLinkString :
DeploymentDebugLogLevel :
Parameters :
{[sites_READINESS_HCM001_name, Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels.DeploymentVariable],
[virtualMachines_HCM001_name, Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels.DeploymentVariable],
[virtualMachines_WEB001_name, Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels.DeploymentVariable],
[serverfarms_READINESS_HCM_ASP_name, Microsoft.Azure.Commands.ResourceManager
.Cmdlets.SdkModels.DeploymentVariable]...}
ParametersString :
Name Type Value
=============== ========================= ==========
sites_READINESS_HCM001_name String READINESS-HCM001
virtualMachines_HCM001_name String HCM001
virtualMachines_WEB001_name String WEB001
serverfarms_READINESS_HCM_ASP_name String READINESS-HCM-ASP
networkInterfaces_hcm001446_name String hcm001446
networkInterfaces_web001454_name String web001454
publicIPAddresses_HCM001_ip_name String HCM001-ip
publicIPAddresses_WEB001_ip_name String WEB001-ip
config_web_name String web
networkSecurityGroups_HCM001_nsg_name String HCM001-nsg
networkSecurityGroups_WEB001_nsg_name String WEB001-nsg
virtualNetworks_READINESS_HCM001_RG_vnet_name String READINESS-HCM001-RG-vnet
storageAccounts_readinesshcm001rgdiag701_name String readinesshcm001rgdiag701
subnets_default_name String default
securityRules_default_allow_rdp_name String default-allow-rdp
securityRules_default_allow_rdp_name_1 String default-allow-rdp
hostNameBindings_readiness_hcm001.azurewebsites.net_name
String +.azurewebsites.net
virtualMachines_HCM001_id String
/subscriptions//resourceGroups/READ
INESS-HCM001-RG/providers/Microsoft.Compute/disks/
HCM001_OsDisk_1_1189fc07b347421b878b9632040d5414
virtualMachines_WEB001_id String
/subscriptions/2/resourceGroups/READ
INESS-HCM001-RG/providers/Microsoft.Compute/disks/
WEB001_OsDisk_1_f29722f8755744eb8d17074eb05df182
Outputs :
OutputsString :
NOTES:
- It states in the notes of the deploy.ps1 file that if the parameters.json file is found that it will be used to fill the required parameters values. By default, in my case all the values had a null value. If the parameters.json file is not found then values are collected from the template.json file which did have the values. I simply removed the parameters.json file from the directory which I ran the deploy.ps1 fil. Here is the exception:
New-AzureRmResourceGroupDeployment : 09:29:43 - Error: Code=InvalidDeploymentParameterValue;
Message=The value of deployment parameter
hostNameBindings_readiness_hcm001.azurewebsites.net_name is null.
Please specify the value or use the parameter reference. See
https://aka.ms/arm-deploy/#parameter-file for details.
At C:\Users\benperk\Downloads\FullTemplate\deploy.ps1:104 char:5
+ New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGr ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [New-AzureRmResourceGroupDeployment], Exception
+ FullyQualifiedErrorId :
Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDeploymentCmdlet
And here is the content from deploy.ps1 file which made the claritifaction:
.SYNOPSIS
Deploys a template to Azure
.DESCRIPTION
Deploys an Azure Resource Manager template
.PARAMETER subscriptionId
The subscription id where the template will be deployed.
.PARAMETER resourceGroupName
The resource group where the template will be deployed. Can be the name of an
existing or a new resource group.
.PARAMETER resourceGroupLocation
Optional, a resource group location. If specified, will try to create a new
resource group in this location.
If not specified, assumes resource group is existing.
.PARAMETER deploymentName
The deployment name.
.PARAMETER templateFilePath
Optional, path to the template file. Defaults to template.json.
.PARAMETER parametersFilePath
Optional, path to the parameters file. Defaults to parameters.json. If file is not
found, will prompt for parameter values based on template.
- Initially, i needed to execute Set-ExecutionPolicy to be able to run this, even as an Administrator
That was not so hard and worked as expected.
To get a overview of the project I worked on, read the following articles as well.
- Required parameter ‘adminPassword’ is missing (null).
- osDisk.managedDisk.id’ is not allowed
- Creating an Azure App Service Hybrid Connection
- How to deploy to Azure using an ARM template with PowerShell
- How to use/create ARM templates for deployments
- Deployment template validation failed: Circular dependency detected on resource
- How to Azure Function App with Hybrid Connection
- Troubleshooting App Service Hybrid Connection Manager
Comments
- Anonymous
August 06, 2018
very useful, thanks Benjamin!