Deploying a Terraform infrastructure template to Dev, QA, and Production environments using an Azure Pipeline
Deploying a Terraform infrastructure template to Dev, QA, and Production environments using an Azure Pipeline involves several steps. The process includes setting up your Azure DevOps environment, creating Terraform scripts, configuring the Azure Pipeline, and ensuring proper separation of environments. Below is a detailed explanation and example.
Prerequisites
1. Azure DevOps Account: Ensure you have an Azure DevOps account.
2. Azure Subscription: Ensure you have access to an Azure subscription.
3. Terraform: Install Terraform on your local machine for initial setup and testing.
Steps
1. Create Terraform Configuration Files
Create a Terraform configuration to define your infrastructure. This example will deploy an Azure Resource Group and a Virtual Network.
```hcl
provider "azurerm" {
features {}
}
variable "location" {
description = "The Azure Region to deploy resources in"
default = "East US"
}
resource "azurerm_resource_group" "rg" {
name = "example-resources"
location = var.location
}
resource "azurerm_virtual_network" "vnet" {
name = "example-vnet"
address_space = ["10.0.0.0/16"]
location = var.location
resource_group_name = azurerm_resource_group.rg.name
}
```
```hcl
variable "location" {
description = "The Azure Region to deploy resources in"
default = "East US"
}
```
```hcl
output "resource_group_name" {
value = azurerm_resource_group.rg.name
}
output "virtual_network_name" {
value = azurerm_virtual_network.vnet.name
}
```
2. Create Environment-Specific Variable Files
Create separate variable files for Dev, QA, and Production environments.
dev.tfvars:
```hcl
location = "East US"
```
qa.tfvars:
```hcl
location = "Central US"
```
prod.tfvars:
```hcl
location = "West US"
```
3. Set Up Azure DevOps Repository
1. Create a new repository in Azure DevOps.
2. Push your Terraform configuration files to the repository.
4. Create an Azure Pipeline
Create an Azure Pipeline to automate the deployment of Terraform templates.
1. Go to your Azure DevOps project.
2. Select Pipelines > New Pipeline.
3. Select your repository and choose to create a pipeline using the YAML editor.
azure-pipelines.yml:
```yaml
trigger:
- main
stages:
- stage: Dev
displayName: Deploy to Dev
jobs:
- job: Terraform
displayName: Terraform Apply
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
- task: AzureCLI@2
inputs:
azureSubscription: 'YourAzureSubscriptionServiceConnection'
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
az account show
- task: InstallTerraform@0
inputs:
terraformVersion: '0.14.7'
- script: terraform init
displayName: 'Terraform Init'
- script: terraform plan -var-file=dev.tfvars
displayName: 'Terraform Plan'
- script: terraform apply -auto-approve -var-file=dev.tfvars
displayName: 'Terraform Apply'
- stage: QA
displayName: Deploy to QA
dependsOn: Dev
jobs:
- job: Terraform
displayName: Terraform Apply
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
- task: AzureCLI@2
inputs:
azureSubscription: 'YourAzureSubscriptionServiceConnection'
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
az account show
- task: InstallTerraform@0
inputs:
terraformVersion: '0.14.7'
- script: terraform init
displayName: 'Terraform Init'
- script: terraform plan -var-file=qa.tfvars
displayName: 'Terraform Plan'
- script: terraform apply -auto-approve -var-file=qa.tfvars
displayName: 'Terraform Apply'
- stage: Prod
displayName: Deploy to Production
dependsOn: QA
jobs:
- job: Terraform
displayName: Terraform Apply
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
- task: AzureCLI@2
inputs:
azureSubscription: 'YourAzureSubscriptionServiceConnection'
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
az account show
- task: InstallTerraform@0
inputs:
terraformVersion: '0.14.7'
- script: terraform init
displayName: 'Terraform Init'
- script: terraform plan -var-file=prod.tfvars
displayName: 'Terraform Plan'
- script: terraform apply -auto-approve -var-file=prod.tfvars
displayName: 'Terraform Apply'
```
5. Configure Azure Service Connection
Ensure that you have an Azure service connection set up in Azure DevOps to authenticate and deploy resources in your Azure subscription.
1. Go to your Azure DevOps project settings.
2. Select Service connections under Pipelines.
3. Create a new service connection of type Azure Resource Manager and use it in the pipeline.
Detailed Explanation
1. Trigger: The pipeline is triggered on changes to the main branch.
2. Stages: There are three stages: Dev, QA, and Production.
- Each stage depends on the successful completion of the previous stage, ensuring sequential deployment.
3. Jobs and Tasks: Each stage contains a single job with multiple tasks:
- Checkout: Checks out the repository.
- AzureCLI@2: Authenticates with Azure using the service connection.
- InstallTerraform@0: Installs the specified version of Terraform.
- Terraform Init: Initializes Terraform.
- Terraform Plan: Plans the Terraform deployment using environment-specific variables.
- Terraform Apply: Applies the Terraform configuration.
Summary
This pipeline automates the deployment of Terraform infrastructure templates to Dev, QA, and Production environments using Azure Pipelines. By creating environment-specific variable files and a structured pipeline, you can ensure consistent and automated deployments across your different environments.