
The biggest challenge to automate the deployment of Azure resource creation more than once, we need to create Azure DevOps Pipeline. The Azure DevOps pipeline will use your terraform template and deploy to Azure to create resources.
Requirements:
- Azure Subscription
- Azure Tennant ID
- Azure AD Service Principle (Azure AD Application) to be used in Azure DevOps to connect.
- Azure AD Service Principle Secret
- Azure Repo or Github Repo to store files
- Azure Resource Group
- Azure Storage Account/container
First we need to create azure storage account and container to store the Terraform State file that will be used during deployments.
Please check below pipeline yaml file content that will be used to deploy your terraform .
trigger:
- master
pool:
vmImage: 'ubuntu-latest'
variables:
subscription: "your subscription"
resourceGroup: "storage resource group"
storageAccount: "storage accoutn name"
container: "container name"
tfstateFile: "terraform tfstate file name"
anyTfChanges: false
steps:
- task: TerraformInstaller@0
displayName: install Terraform v1.0.4
inputs:
terraformVersion: '1.0.4'
- task: TerraformTaskV2@2
displayName: init
inputs:
provider: 'azurerm'
command: 'init'
workingDirectory: '$(System.DefaultWorkingDirectory)'
backendServiceArm: '$(subscription)'
backendAzureRmResourceGroupName: '$(resourceGroup)'
backendAzureRmStorageAccountName: '$(storageAccount)'
backendAzureRmContainerName: '$(container)'
backendAzureRmKey: '$(tfstateFile)'
- task: TerraformTaskV1@0
displayName: terraform plan -out=tfplan
inputs:
provider: 'azurerm'
command: 'plan'
workingDirectory: '$(System.DefaultWorkingDirectory)'
commandOptions: '-out=tfplan'
# commandOptions: '-detailed-exitcode -out=tfplan'
environmentServiceNameAzureRM: '$(subscription)'
- task: PowerShell@2
displayName: detect any terraform change
inputs:
workingDirectory: '$(System.DefaultWorkingDirectory)'
targetType: 'inline'
script: |
# Write-Host "LASTEXITCODE : $LASTEXITCODE"
$plan = $(terraform show -json tfplan | ConvertFrom-Json)
$actions = $plan.resource_changes.change.actions
Write-Host "Terraform actions : $actions"
if (($actions -contains 'create') -or ($actions -contains 'delete') -or ($actions -contains 'update'))
{
Write-Host "Terraform will perform the following actions : $actions"
Write-Host "##vso[task.setvariable variable=anyTfChanges;]true"
}
else
{
Write-Host "There is no change detected in Terraform tfplan file"
}
- task: TerraformTaskV1@0
displayName: terraform apply tfplan
condition: eq(variables.anyTfChanges, true)
inputs:
provider: 'azurerm'
command: 'apply'
workingDirectory: '$(System.DefaultWorkingDirectory)'
commandOptions: 'tfplan'
environmentServiceNameAzureRM: '$(subscription)'


