Easily checking Azure Resource Manager deployment status from bash with the Azure CLI

If you’re working with Azure Resource Manager templates on OSX/Linux then there’s a strong probability that you’re using the Azure CLI to deploy them. The CLI works on Windows as well, but if you prefer a PowerShell version of this post then see https://blogs.msdn.com/b/stuartleeks/archive/2015/11/25/easily-checking-azure-resource-manager-deployment-status-from-powershell.aspx.

I’ve had a couple of mini-scripts that I’ve found myself using repeatedly, so I thought I’d tidy them up a bit and share them in case they’re useful for anyone else.

Getting Set Up

Make sure you’ve got the Azure CLI installed and configured. The scripts for this post will require that the CLI is in ARM mode (ARM=Azure Resource Manager). To set this enter

azure config mode arm

To check that things are set up, try running

azure group list

If you just want to grab the scripts then get them here: https://gist.github.com/stuartleeks/4fe6b0248a8a48a94da1. There are two scripts: GetDeploymentOperationSummary.sh and GetDeploymentOperationFailures.sh.

Examples

Standard CLI commands

To get started, we’ll take a quick look at the standard Azure CLI commands for querying deployment operations. To list the operations for a deployment we can use “azure group deployment operation list”. To do this we need to pass the resource group and deployment name. We can list the deployments using “azure group deployment list”.

For example, to list the deployment for the “asetest” group we can run:

azure group deployment list asetest

This will give us output similar to:

info: Executing command group deployment list
+ Listing deployments
data: DeploymentName : Microsoft.WebSiteaca1d698-920a
data: ResourceGroupName : asetest
data: ProvisioningState : Succeeded
data: Timestamp : 2015-11-11T15:51:55.4133075Z
data: Mode : Incremental
data:
data: DeploymentName : Microsoft.StorageAccount-20151011153834
data: ResourceGroupName : asetest
data: ProvisioningState : Succeeded
data: Timestamp : 2015-11-11T14:39:12.2571368Z
data: Mode : Incremental
data:
data: DeploymentName : Microsoft.AppServiceEnvironmente34fe687-9f36
data: ResourceGroupName : asetest
data: ProvisioningState : Succeeded
data: Timestamp : 2015-11-11T13:42:40.3244758Z
data: Mode : Incremental
info: group deployment list command OK

 

From there we can get the name of the last deployment (Microsoft.WebSiteaca1d698-920a) and get the operations for that deployment using

azure group deployment operation list asetest Microsoft.WebSiteaca1d698-920a

This gives us output similar to

info: Executing command group deployment operation list
+ Getting deployoment operations
data: Id: /subscriptions/e96f24a6-ceee-43a3-8ad4-5e5dca55656b/resourceGroups/asetest/deployments/Microsoft.WebSiteaca1d698-920a/operations/242E8A24157FDA69
data: OperationId: 242E8A24157FDA69
data: Provisioning State: Succeeded
data: Timestamp: 2015-11-11T15:51:54.4304303Z
data: Status Code: Created
data: Status Message:
data: Target Resource Id: /subscriptions/e96f24a6-ceee-43a3-8ad4-5e5dca55656b/resourceGroups/asetest/providers/microsoft.insights/alertrules/ForbiddenRequests corsstoragetest
data: Target Resource Name: ForbiddenRequests corsstoragetest
data: Target Resource Type: microsoft.insights/alertrules
data: ---------------------
data:
data: Id: /subscriptions/e96f24a6-ceee-43a3-8ad4-5e5dca55656b/resourceGroups/asetest/deployments/Microsoft.WebSiteaca1d698-920a/operations/38A6E8D64D86BE4B
data: OperationId: 38A6E8D64D86BE4B
data: Provisioning State: Succeeded
data: Timestamp: 2015-11-11T15:51:54.3901981Z
data: Status Code: Created
data: Status Message:
data: Target Resource Id: /subscriptions/e96f24a6-ceee-43a3-8ad4-5e5dca55656b/resourceGroups/asetest/providers/microsoft.insights/alertrules/ServerErrors corsstoragetest
data: Target Resource Name: ServerErrors corsstoragetest
data: Target Resource Type: microsoft.insights/alertrules
data: ---------------------

... [further output omitted for brevity]   

Alternatively, we can add the “—json” switch to get the output in JSON format:

[
{
"id": "/subscriptions/e96f24a6-ceee-43a3-8ad4-5e5dca55656b/resourceGroups/asetest/deployments/Microsoft.WebSiteaca1d698-920a/operations/242E8A24157FDA69",
"operationId": "242E8A24157FDA69",
"properties": {
"provisioningState": "Succeeded",
"timestamp": "2015-11-11T15:51:54.4304303Z",
"statusCode": "Created",
"targetResource": {
"id": "/subscriptions/e96f24a6-ceee-43a3-8ad4-5e5dca55656b/resourceGroups/asetest/providers/microsoft.insights/alertrules/ForbiddenRequests corsstoragetest",
"resourceName": "ForbiddenRequests corsstoragetest",
"resourceType": "microsoft.insights/alertrules"
}
}
},
{
"id": "/subscriptions/e96f24a6-ceee-43a3-8ad4-5e5dca55656b/resourceGroups/asetest/deployments/Microsoft.WebSiteaca1d698-920a/operations/38A6E8D64D86BE4B",
"operationId": "38A6E8D64D86BE4B",
"properties": {
"provisioningState": "Succeeded",
"timestamp": "2015-11-11T15:51:54.3901981Z",
"statusCode": "Created",
"targetResource": {
"id": "/subscriptions/e96f24a6-ceee-43a3-8ad4-5e5dca55656b/resourceGroups/asetest/providers/microsoft.insights/alertrules/ServerErrors corsstoragetest",
"resourceName": "ServerErrors corsstoragetest",
"resourceType": "microsoft.insights/alertrules"
}
}
},
// ... [further output omitted for brevity]
]

Getting the summary data

To make it easy to get a high-level summary of the most recent deployment to a resource group, the GetDeploymentSummary.sh script does some processing of the CLI JSON output. For example, to get the summary of the most recent deployment to the “asetest” resource group:

./GetDeploymentOperationSummary.sh asetest

This outputs

[
{
"provisioningState": "Succeeded",
"timestamp": "2015-11-25T12:28:28.8112854Z",
"resourceType": "Microsoft.Web/serverfarms",
"resourceName": "AppService-foo",
"error": null
},
{
"provisioningState": "Succeeded",
"timestamp": "2015-11-25T12:28:46.2256849Z",
"resourceType": "Microsoft.Web/sites",
"resourceName": "WebApp-API-foo",
"error": null
},
{
"provisioningState": "Succeeded",
"timestamp": "2015-11-25T12:28:48.9928976Z",
"resourceType": "Microsoft.Web/sites/config",
"resourceName": "WebApp-API-foo/web",
"error": null
},
{
"provisioningState": "Failed",
"timestamp": "2015-11-25T12:29:19.4734883Z",
"resourceType": "Microsoft.Web/sites/Extensions",
"resourceName": "WebApp-API-foo/MSDeploy",
"error": {
"code": "ResourceDeploymentFailure",
"message": "The resource operation completed with terminal provisioning state 'Failed'."
}
}
]

If you want to get the output for previous deployments then you can pass an additional parameter to the script. The command below will output the operations for the deployment two before the most recent deployment

./GetDeploymentOperationFailures.sh asetest 2

Getting failure information

If you just want to see the summary for failed operations then the  GetDeploymentOperationFailures.sh script should give you a good starting point. For example, to see the most recent failures for the asetest group:

./GetDeploymentOperationFailures.sh asetest

This script also supports passing a number indicating the number of deployments to skip.