我們已經(jīng)了解IaC是在一個或多個文件中管理基礎結構的過程化焕,而不是在用戶界面中手動配置資源的過程,介紹了Azure特定的IaC工具Azure Resource Manager嚼沿,這一篇我們將介紹Terraform。
Terraform
作為最主流的IaC工具之一,Terraform可以管理眾多云服務提供商(如Azure骤菠,Google Cloud,AWS)的資源疤孕,以及定制的內部解決方案商乎。官網(wǎng)上列舉了幾個典型使用Terraform的應用場景,如
- 部署應用程序到Heroku平臺
- 構建和管理N-Tier多層架構
- “自服務”架構
- 動態(tài)調度請求資源
- 多云部署等
我們可以通過配置文件定義需要的組件祭阀,Terraform會生成執(zhí)行計劃鹉戚,列出達到預期狀態(tài)所需執(zhí)行的操作,然后執(zhí)行該計劃以構建所需的基礎結構专控。如果需要對配置進行更改抹凳,Terraform能夠確定更改的內容并創(chuàng)建可以應用的增量執(zhí)行計劃。
工具比較
Terraform的主要優(yōu)勢之一是多云部署和其語言統(tǒng)一性伦腐,使用HCL配置語言將Azure赢底,AWS,GCE柏蘑,OpenStack和本地部署一起使用幸冻。不同于ARM使用Json,聲明性代碼可以編寫復雜但易于閱讀的代碼咳焚。
還有其他一些優(yōu)勢洽损,如在Terraform中,可以隨時使用Terraform Destroy功能啟動和禁用資源黔攒,Terraform Plan驗證當前狀態(tài)趁啸,以確保它適合進行中的部署操作强缘。
此外部署后,Terraform將創(chuàng)建一個狀態(tài)文件terraform.tfstate不傅,用于將基礎結構的狀態(tài)與基礎結構本身分開存儲旅掂。狀態(tài)文件將許多部署數(shù)據(jù)以純文本形式寫入,包括變量访娶,資源信息商虐,帳戶等。如果這些元素是機密的崖疤,則可能會出現(xiàn)問題秘车。
準備工作
從Download Terraform下載Terraform并解壓。
win+r
打開run窗口輸入sysdm.cpl
劫哼,在高級-環(huán)境變量中加入Terraform路徑叮趴。輸入
terraform -version
驗證Terraform是否安裝成功。
C:\Users\admin>terraform -version
Terraform v0.14.5
- 準備可用的Azure賬號和Azure CLI
使用Terraform部署Azure資源
Terraform依靠Providers與遠程系統(tǒng)進行交互权烧,其中包含Terraform可以管理的一組資源類型或數(shù)據(jù)源眯亦。這里我們使用Azure Provider進行Azure資源的部署。
- 新建Terraform配置文件
main.tf
般码,使用Azure Provider新建位于eastasia
的myTFResourceGroup
資源組妻率。其中resource <_type_>.<_name_>
表示新建一個ID為azurerm_resource_group.rg
的資源,這個名稱用于引用配置中創(chuàng)建的Terraform資源板祝,與Azure中資源組的名稱不同宫静。
# Configure the Azure provider
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = ">= 2.26"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "rg" {
name = "myTFResourceGroup"
location = "eastasia"
}
- 將配置文件所在文件夾在命令行中打開,首先進行身份驗證券时。
az login
- 初始化你的配置
terraform init
初始化成功后如下- 在創(chuàng)建架構之前孤里,terraform會檢查配置文件的執(zhí)行計劃
terraform plan
這個執(zhí)行計劃會指出為了達到指定的理想狀態(tài),terraform會做哪些操作- 接著進行部署橘洞,如果你已經(jīng)使用plan檢查過執(zhí)行計劃扭粱,可以加上
-auto-approve
terraform apply -auto-approve
-
部署完成后,到Azure門戶中查看震檩,發(fā)現(xiàn)資源組已部署完成。
查看文件夾蜓堕,可以發(fā)現(xiàn)
terraform.tfstate
文件抛虏,包含了Terraform創(chuàng)建的資源的ID和屬性,以便管理或銷毀這些資源套才。狀態(tài)文件包含配置中的所有數(shù)據(jù)迂猴,還可能包含明文形式的敏感值,因此請勿共享或簽入源代碼背伴。
在GitHub中使用Terraform進行自動化部署
- 新建文件夾terraform沸毁,放入main.tf配置文件
provider "azurerm" {
version = "2.37"
features {}
}
resource "azurerm_resource_group" "rg" {
name = "myTFResourceGroup"
location = "eastasia"
}
- 新建Workflow峰髓,環(huán)境變量中需要更新service principal的訪問密鑰,并指定Terraform運行的文件夾息尺,即配置文件所處位置携兵。Pull Request會觸發(fā)到Plan,當push到master時運行Apply搂誉。
name: 'Terraform'
on:
push:
branches:
- master
pull_request:
jobs:
terraform:
name: 'Terraform'
runs-on: ubuntu-latest
env:
ARM_CLIENT_ID: ${{secrets.CLIENTID}}
ARM_CLIENT_SECRET: ${{secrets.CLIENTSECRET}}
ARM_SUBSCRIPTION_ID: ${{secrets.SUBSCRIPTIONID}}
ARM_TENANT_ID: ${{secrets.TENANTID}}
defaults:
run:
shell: bash
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set Terraform
uses: hashicorp/setup-terraform@v1
- name: Terraform fmt
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'fmt'
tf_actions_working_dir: 'terraform'
tf_actions_comment: true
- name: Terraform Init
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'init'
tf_actions_working_dir: 'terraform'
tf_actions_comment: true
- name: Terraform Plan
if: github.event_name == 'pull_request'
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'plan'
tf_actions_working_dir: 'terraform'
tf_actions_comment: true
- name: Terraform Apply
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'apply'
tf_actions_working_dir: 'terraform'
tf_actions_comment: true
-
查看運行過程徐紧。
-
若為push到master branch,則跳過plan階段炭懊。
-
查看資源組是否創(chuàng)建成功并级。
相關閱讀
Introduction - Terraform by HashiCorp
Get Started - Azure | Terraform - HashiCorp Learn
Terraform - GitHub Actions