Improve this page

Build Status

Ready for Production

Use this script in YML pipelines to deploy ARM templates and optional to use a parameter file.

For example:

- task: AzureCLI@2
    displayName: "KeyVault: Add ADA Web permissions"
    inputs:
    azureSubscription: "$"
    scriptType: "pscore"
    scriptLocation: "scriptPath"
    scriptPath: "pipelines/scripts/deploy-armtemplate.ps1"
    arguments: '-TemplateFile $(Build.SourcesDirectory)/keyvaultpermissions/azuredeploy.json -ParameterFile $(Build.SourcesDirectory)/keyvaultpermissions/azuredeploy.parameters.json -DeploymentName "$-kv-permissions" -ResourceGroupName $ -ParametersOverwrite @("keyVaultName=$","resourceType=Web","resourceName=$","resourceResourceGroup=$")'
    addSpnToEnvironment: true

Template Locations

 package in CloudBoostLibrary feed in Azure Artifacts

Used by

Used by Landing zone(s)

Landing zone name
Artificial Data Amplifier

The script

param 
( 
    [Parameter(Mandatory = $true, HelpMessage = "Unique deployment name")]
    [string] $DeploymentName,
    [Parameter(Mandatory = $true, HelpMessage = "Enter the name of the Resource Group.")]
    [string] $ResourceGroupName,
    [Parameter(Mandatory = $true, HelpMessage = "Template file location.")]
    [string] $TemplateFile,
    [Parameter(Mandatory = $true, HelpMessage = "String with template parameters")]
    [string] $ParameterFile,
    [Parameter(Mandatory = $false, HelpMessage = "Overwrite parameters values from the parameter file.")]
    [string[]] $ParametersOverwrite,
    [Parameter(Mandatory = $false, HelpMessage = "Last know good deployment to rollback to")]
    [string] $rollbackDeploymentName
) 

Write-Host Inputs:
Write-Host  DeploymentName: $DeploymentName
Write-Host  TemplateFile: $TemplateFile
Write-Host  ParameterFile: $ParameterFile
Write-Host  ParametersOverwrite: $ParametersOverwrite
Write-Host  RollbackDeploymentName: $rollbackDeploymentName

Function ValidateTemplate {
    Param(
        [Parameter(Mandatory = $true)][string]$ResourceGroupName,
        [Parameter(Mandatory = $true)][string]$TemplateFile,
        [Parameter(Mandatory = $true)][string]$ParameterFile,
        [Parameter(Mandatory = $false)][string]$ParametersOverwriteJson
    )

    $FileExists = Test-Path $TemplateFile
    if($FileExists -ne $True){
        Write-Error "Template file does not exist: $TemplateFile"
        Write-Host  "##vso[task.LogIssue type=error;]Template file does not exist"
        Exit 1
    }

    $FileExists = Test-Path $ParameterFile
    if($FileExists -ne $True){
        Write-Error "Parametes file does not exist: $ParameterFile"
        Write-Host  "##vso[task.LogIssue type=error;]Template file does not exist"
        Exit 1
    }

    if([string]::IsNullOrWhiteSpace($ParametersOverwriteJson))
    {
        $validationResult = az deployment group validate --resource-group $ResourceGroupName --template-file $TemplateFile --parameters $ParameterFile
    }
    else{
        $validationResult = az deployment group validate --resource-group $ResourceGroupName --template-file $TemplateFile --parameters $ParameterFile --parameters $ParametersOverwriteJson
    }
   
    Write-Host "Validation result: $validationResult"

    if( $null -ne $validationResult) {
        Write-Host "Template validation succeeded"
    }
    else {
        Write-Error "Template validation failed"
        Write-Host  "##vso[task.LogIssue type=error;]Template validation failed"
        Exit 1
    }
}

Function CreateDeployment {
    Param(
        [Parameter(Mandatory = $true)][string]$ResourceGroupName,
        [Parameter(Mandatory = $true)][string]$DeploymentName,
        [Parameter(Mandatory = $false)][string]$RollbackDeploymentName,
        [Parameter(Mandatory = $true)][string]$TemplateFile,
        [Parameter(Mandatory = $true)][string]$ParameterFile,
        [Parameter(Mandatory = $false)][string]$ParametersOverwriteJson
    )

    Write-Host "Override parameters: $ParametersOverwriteJson"
    if ([string]::IsNullOrWhiteSpace($RollbackDeploymentName)) {
        Write-Host "Create deployment $DeploymentName without rollback in resourcegroup $ResourceGroupName"

        if([string]::IsNullOrWhiteSpace($ParametersOverwriteJson))
        {
            az deployment group create --name $DeploymentName --resource-group $ResourceGroupName --template-file $TemplateFile --parameters $ParameterFile
        }
        else {
            az deployment group create --name $DeploymentName --resource-group $ResourceGroupName --template-file $TemplateFile --parameters $ParameterFile --parameters $ParametersOverwriteJson
        }
    }
    else {
        Write-Host "Create deployment $DeploymentName with rollback oppertunity to deployment $rollbackDeploymentName in resourcegroup $ResourceGroupName"
        if([string]::IsNullOrWhiteSpace($ParametersOverwriteJson))
        {
            az deployment group create --name $DeploymentName --resource-group $ResourceGroupName --rollback-on-error $RollbackDeploymentName --template-file $TemplateFile --parameters $ParameterFile
        }
        else {
            az deployment group create --name $DeploymentName --resource-group $ResourceGroupName --rollback-on-error $RollbackDeploymentName --template-file $TemplateFile --parameters $ParameterFile --parameters $ParametersOverwriteJson 
        }
    }    
}

Function GetOverwriteParametersAsJson{
    Param(
        [Parameter(Mandatory = $false)][string[]]$ParametersOverwrite
    )

    $obj = New-Object pscustomobject
    foreach ($parameter in $ParametersOverwrite) {
        $kvp = $parameter.Split("=")
        $key = $kvp[0] 
        $value = $kvp[1]
        $prop = New-Object PSObject
        $prop | Add-Member NoteProperty "value" $value
        $obj | Add-Member NoteProperty $key $prop
      }
     $json = $obj | ConvertTo-Json -compress
     $json = $json.Replace("""","'")

     return $json
}

$json = GetOverwriteParametersAsJson -ParametersOverwrite $ParametersOverwrite

ValidateTemplate -ResourceGroupName $ResourceGroupName -TemplateFile $TemplateFile -ParameterFile $ParameterFile -ParametersOverwrite $json
CreateDeployment -ResourceGroupName $ResourceGroupName `
                 -DeploymentName $DeploymentName `
                 -RollbackDeploymentName $rollbackDeploymentName `
                 -TemplateFile $TemplateFile `
                 -ParameterFile $ParameterFile `
                 -ParametersOverwrite $json