Azure Terraform(七)利用Azure DevOps 實現自動化部署基礎資源(補充)

一,引言

  之前一篇文章有講解到利用 利用Azure DevOps 實現自動化部署基礎資源,當時 TF 程式碼沒有針對 Azure 各個資源的封裝,所有的資源程式碼全部寫在一個 main.tf 文件中。然後還有講到 Azure Resource Common Module 的 TF 程式碼的封裝。之前還在Azure Terraform 第四節講到利用 Azure Storage 遠程狀態文件存儲。那麼今天我們嘗試將封裝過 Common Module 的 TF 程式碼,結合 TF 狀態文件遠端存儲,實現自動化部署基礎資源

--------------------Azure Terraform 系列--------------------

1,Azure Terraform(一)入門簡介

2,Azure Terraform(二)語法詳解

3,Azure Terraform(三)部署 Web 應用程式

4,Azure Terraform(四)狀態文件存儲

5,Azure Terraform(五)利用Azure DevOps 實現自動化部署基礎資源

6,Azure Terraform(六)Common Module

7,Azure Terraform(七)利用Azure DevOps 實現自動化部署基礎資源(補充)

二,正文

1,Azure DevOps 創建項目

輸入項目名稱 「CnBateBlogWeb_Infrastructure_V2」,點擊 「Create」 創建項目。

2,配置Azure DevOps Release Pipeline 環境 

2.1,添加 Release Pipeline

選擇 「 Pipelines=》Releases」,點擊 「New pipeline」 創建新的 pipeline

模板選擇 「Empty job」,並且點擊圖中箭頭所指的 「x」 關閉頁面

Stage 頁面,輸入新的 Stage name:「Deploy Infra」,並且關閉此頁面

2.2,添加 Artifacts

接下來需要添加 「artifact」,點擊圖中的 「+ Add an artiface」

選擇 」GitHub「 ,

Service 添加新的 connection:"github_connection_xxxxx"

Source(repository)選擇:TF 程式碼庫

Default branch:「remote_stats」

Default version:」Latest from the default branch「

點擊 "Add" 添加 artifact。

2.3,添加 task

接下來添加 」Deploy Infra「 Stages 相關 task

2.3.1,創建遠程存儲相關 job

點擊圖中圈中的 」+「,添加 new task,並且在右邊的輸入框中輸入 」Azure CLI「,選中圖中的 」Azure CLI「

注意,之前在  一篇文章中講到遠端存儲時,需要提前創建 Azure Storage Accunt 和 Azure KeyVault。Azure Storage Account 的 Container 中用來存儲 TF 的狀態文件,Azure KeyVault 存儲 Azure Storage Account 的 access_key(訪問密鑰),之前是手動創建,主要是為了給大家演示。今天,我們通過 Azure CLI 創建快捷操作,並且 Azure CLI 這個 task  移至 Azure Releases Pipeline 中。

輸入相關參數:

Display name:」Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret「

Azure Resource Manager connection:選擇自己的訂閱 id

Script Type(腳本類型)選擇:」Shell「

Script Location(腳本位置)選擇:」Inline script「(內聯腳本)

Inline Script(腳本)在 Azure 中創建以下資源:
  1)Storage 存儲帳戶
  2)Blob存儲容器(將存儲狀態文件)
  3)密鑰庫,將用於安全地存儲Storage 的訪問密鑰

Inline Script(內聯腳本)如下所示:

# create azure resource group
az group create --location eastasia --name $(terraform_rg)
# create azure storage account az storage account create --name $(storage_account) --resource-group $(terraform_rg) --location eastasia --sku Standard_LRS
# create storage account container for tf state az storage container create --name $(storage_account_container) --account-name $(storage_account)
# query storage key and set variable ACCOUNT_KEY=$(az storage account keys list --resource-group $(terraform_rg) --account-name $(storage_account) --query "[?keyName == 'key1'][value]" --output tsv)
# create azure keyvault az keyvault create --name $(keyvault) --resource-group $(terraform_rg) --location eastasia --enable-soft-delete false
# set keyvault secret,secret value is ACCOUNT_KEY az keyvault secret set --name $(keyvault_sc) --vault-name $(keyvault) --value $ACCOUNT_KEY

大家有注意到沒 」Inline Script「 中既有 Pipeline 設置的變數,又有自定義的系統變數

如果是獲取 pipeline 中設置變數:$(varivale_name)

如果是獲取自定義系統變數:$variable_name

2.3.2,添加 pipeline variables

接下來設置 pipeline 變數,選擇 」Variables「,點擊 」+Add「,添加相應的參數設置

Name Value
keyvault cnbate-terraform-kv6
keyvault_sc terraform-stste-storage-key
storage_account cnbateterraformstorage
storage_account_container terraform-state
terraform_rg Web_Test_TF_RG

 

2.3.3,添加 Azure KeyVault 獲取 Access Secret Job

輸入 」Azure Key Vault「,點擊 」Add「  添加 Azure Key Vault Job

輸入相關參數:

Display name:「Azure Key Vault:Get Storage Access Secret」

Azure subscription 選擇當前自己的訂閱

Key vault 選擇:「cnbate-terraform-kv6」

Secrets filter(機密過濾器):「terraform-stste-storage-key」,如果選擇默認 「*」,則下載選定密鑰庫的所有機密

2.3.4,添加 Terraform install Job

搜索 「Terraform」,選擇 「Terraform tool install」

修改相應參數:

Display name:"Install Terraform 0.14.3"

Version(版本):」0.14.3「

2.3.5,添加 Terraform 初始化 Job

搜索 「Terraform」,點擊 「Add」

修改相應參數:

Display name:「Terraform:Init」

Configuration directory:選擇到 」~/src/model「 這個目錄下,也就是 terraform 程式碼的工作目錄

Command 選擇:「init」

Addition command arguments:」-backend-config="access_key=$(terraform-stste-storage-key)"「 (tf 程式碼中沒有access_key 的配置資訊,所以我們需要在 terraform init 過程中傳遞此參數)

AzureRM backend configuration:

Azure subscription:選擇當前自己的訂閱

Resource group:」Web_Test_TF_RG「

Storage account:」cnbateterraformstorage「

Container:」terraform-state「

Key:」cnbate.terraform.stats「  

2.3.6,添加 Terraform 生成部署計劃 Job

搜索 」Terraform「,點擊 」Add「

修改相關參數:

Display name:」Terraform:plan「

Command 選擇:」plan「

Configuration directory: 選擇 terraform 程式碼的工作目錄

Azure subscription 選擇當前自己的Azure訂閱

2.3.7,添加 Terraform 執行部署計劃 Job

搜索 」Terraform「,點擊 」Add「

修改相應參數:

Display name:」Terraform:auto-apply「

Command:」validate and apply「

Configuration directory:選擇 terraform 程式碼的工作目錄

Additional command arguments:「-auto-approve」

Azure subscription:選擇當前自己訂閱

2.3.8,保存 Azure Pipeline 設置,並且設置 Pipeline 的觸發條件

修改當前 pipeline 名稱,並且點擊 「Save」 進行保存

設置 pipeline 的觸發條件

開啟持續部署觸發,每次在所選存儲庫中發生Git推送時觸發pipeline,接下來添加分支篩選條件

Type:Include,Branch:「remote_stats」,也就是說每當 「remote_stats」 發生git 推送的時候,觸發此 pipeline

設置完畢後,點擊 「Save」 進行保存

3,測試Azure DevOps 自動化部署基礎設施資源

 先登錄 Azure Portal 確保 「Web_Test_TF_RG」 資源組中不存在任何資源

手動觸發 Azure Release Pipeline

點擊 「Create release」 進行手動觸發

稍等片刻,等待pipeline 執行完畢

查看 「Web_Test_TF_RG」 中的所有資源

Bingo,大功告成!!!!

*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。😃😃😃😃😃😃

三,結尾

  今天的實戰操作比較多,全都是需要在Azure DevOps 上進行操作的,大家要多加練習,熟能生巧。本文所分享的內容也存在著很多我自己的一些理解,有理解不到位的,還希望多多包涵,並且指出不足之處。

參考資料:Terraform 官方,azurerm 文檔,Azure CLI 文檔

Terraform_Cnbate_Traffic_Manager github://github.com/yunqian44/Terraform_Cnbate_Traffic_Manager

作者:Allen 

版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。