一,引言
之前一篇文章有講解到利用 利用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:https://github.com/yunqian44/Terraform_Cnbate_Traffic_Manager
作者:Allen
版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。