返回文章列表

Terraform工作流程與狀態管理

本文探討 Terraform 的核心工作流程 Write-Plan-Apply,以及狀態管理機制。涵蓋了初始化、驗證組態、生成執行計劃、套用變更、銷毀資源等關鍵步驟,並提供程式碼範例與詳細解析,幫助讀者理解 Terraform 如何有效管理基礎設施。

DevOps 雲端運算

Terraform 的 Write-Plan-Apply 工作流程是其管理基礎設施的核心。在寫入階段,我們使用 HCL 語法編寫組態檔案,定義所需的資源。撰寫完畢後,使用 terraform fmt 格式化程式碼,確保程式碼風格一致性。接著,terraform init 初始化工作目錄,下載必要的外掛和模組。進入計畫階段,terraform plan 命令會預覽變更,並產生執行計劃,讓開發者確認變更內容。確認無誤後,terraform apply 命令會套用變更到實際環境。最後,terraform destroy 命令用於銷毀所有由 Terraform 管理的資源,通常用於清理開發或測試環境。Terraform 使用狀態檔案追蹤實際環境與組態的對應關係,預設儲存在本地,也可組態遠端儲存。理解這些步驟和狀態管理,能更有效地運用 Terraform 管理基礎設施。

Terraform 工作流程導覽

Terraform 提供了一套強大的基礎設施即程式碼(IaC)管理工具,透過 Write->Plan->Apply 的工作流程,能夠有效地佈署和管理基礎設施。

寫入(Write)階段

在寫入階段,開發人員需要建立或修改 Terraform 組態檔案。為了確保團隊合作的順暢,通常會使用版本控制系統(如 Git)來管理程式碼變更。不同的團隊成員可以在不同的分支上工作,並透過合併請求(Pull Request)來避免對主分支的直接修改,從而保持主分支的穩定性。

在提交程式碼之前,進行語法驗證和格式化是非常重要的步驟。這不僅能捕捉簡單的語法錯誤,還能確保程式碼風格的一致性,提高程式碼的可讀性。

# 使用 terraform fmt 命令格式化程式碼
terraform fmt

內容解密:

  • terraform fmt 命令用於自動格式化 Terraform 組態檔案,使其符合官方的程式碼風格規範。
  • 這有助於保持團隊間程式碼的一致性,並提高程式碼的可維護性。

計畫(Plan)階段

在計畫階段,Terraform 會根據組態檔案計算出需要對基礎設施進行的變更。這一步驟允許開發人員預覽變更內容,確保實際執行的結果與預期相符。

# 執行 terraform plan 命令預覽變更
terraform plan

內容解密:

  • terraform plan 命令會分析當前組態與現有基礎設施之間的差異,並輸出預計的變更內容。
  • 這個步驟對於驗證變更的正確性至關重要,可以避免不必要的錯誤。

此外,terraform plan 命令還支援將計畫結果儲存到檔案中,以便後續的 terraform apply 命令使用。

# 將計畫結果儲存到檔案
terraform plan -out=tfplan

內容解密:

  • -out 引數用於指定儲存計畫結果的檔案名稱。
  • 這樣可以在稍後的 terraform apply 階段直接套用該計畫檔案。

套用(Apply)階段

在套用階段,Terraform 會根據計畫階段的結果,對基礎設施進行實際的變更。

# 執行 terraform apply 命令套用變更
terraform apply tfplan

內容解密:

  • terraform apply 命令會根據指定的計畫檔案或最新的組態,對基礎設施進行變更。
  • 在執行變更之前,Terraform 會再次顯示預計的變更內容,並要求使用者確認。

完成套用後,建議將變更提交到版本控制系統,以確保變更的安全性和可追溯性。

初始化 Terraform 工作目錄(terraform init)

terraform init 是在使用 Terraform 管理基礎設施之前的第一步命令,用於初始化包含 Terraform 組態的目錄。

terraform init 的主要功能

  1. 準備狀態儲存:無論是使用本地還是遠端後端,init 都會準備好狀態儲存機制。
  2. 檢索模組init 會檢查組態中使用的模組,並從指定的來源位置下載這些模組。
  3. 檢索外掛程式:包括提供者和供應器所需的外掛,也會在 init 過程中被下載和安裝。
# 初始化 Terraform 工作目錄
terraform init

內容解密:

  • terraform init 是初始化 Terraform 工作環境的必要步驟。
  • 如果組態發生變化,例如新增了模組或提供者,需要重新執行 init 以更新工作環境。

常用的 terraform init 引數

  • -backend-config:與組態檔案中的後端資訊結合使用,以準備後端狀態儲存。
  • -input=false:防止在初始化過程中提示使用者輸入,適合自動化場景。
  • -plugin-dir:指定包含所需外掛的目錄,避免自動安裝外掛。
  • -upgrade:強制更新外掛和模組到允許的最新版本。

範例

假設我們有以下 Terraform 組態,使用了 AWS 提供者和 VPC 模組:

provider "aws" {
  region = "us-east-1"
}

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "2.24.0"
}

執行 terraform init 後,Terraform 將自動下載並安裝所需的 AWS 提供者和 VPC 模組。

# 初始化當前目錄下的 Terraform 組態
terraform init

內容解密:

  • 由於未定義後端,Terraform 將預設使用本地狀態檔案。
  • init 命令會自動下載並安裝所需的提供者和模組。

綜上所述,Terraform 的工作流程和初始化命令是管理和佈署基礎設施即程式碼的核心。透過理解並正確使用這些命令,可以提高基礎設施管理的效率和可靠性。

Terraform 工作流程導航:初始化與驗證

Terraform 是一個強大的基礎設施即程式碼(IaC)工具,它允許使用者以程式碼的形式定義和管理雲端及本地基礎設施。在使用 Terraform 之前,瞭解其工作流程至關重要。本文將重點介紹 Terraform 的初始化和驗證過程。

初始化 Terraform 組態

在使用 Terraform 組態之前,必須先進行初始化。初始化過程透過執行 terraform init 命令完成。該命令驗證狀態後端並下載所需的模組、外掛和提供者。

初始化過程範例

假設我們有一個名為 terraform_aws_vpc_init.tf 的 Terraform 組態檔案,內容如下:

# terraform_aws_vpc_init.tf
module "vpc" {
  source = "terraform-aws-modules/vpc/aws"
  version = "2.24.0"
  # 其他組態...
}

執行 terraform init 後,輸出如下:

Initializing modules...
Downloading terraform-aws-modules/vpc/aws 2.24.0 for vpc...
- vpc in .terraform/modules/vpc

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "aws" (hashicorp/aws) 2.46.0...

初始化後,工作目錄結構如下:

.
├── .terraform
│   ├── modules
│   │   ├── modules.json
│   │   └── vpc
│   └── plugins
│       └── windows_amd64
└── terraform_aws_vpc_init.tf

初始化過程解析

  1. 模組初始化:Terraform 下載所需的模組,例如 terraform-aws-modules/vpc/aws
  2. 後端初始化:驗證狀態後端,用於儲存 Terraform 狀態資料。
  3. 提供者外掛初始化:下載所需的提供者外掛,例如 hashicorp/aws

驗證 Terraform 組態

terraform validate 命令用於驗證 Terraform 組態檔案的語法。該命令檢查目錄中所有 Terraform 檔案的語法,並顯示警告和錯誤(如果有)。

驗證範例

假設我們有一個名為 terraform_validate.tf 的組態檔案,內容如下:

# terraform_validate.tf
provider "azurerm" {
  version = "~> 1.0"
}

resource "azurerm_resource_group" "main" {
  name     = "test"
  location = "eastus"
  colors   = ["blue"] # 無效引數
}

module "network" {
  source              = "Azure/network/azurerm"
  version             = "~> 1.1.1"
  location            = "eastus"
  allow_rdp_traffic   = "true"
  allow_ssh_traffic   = "maybe"
  resource_group_name = azurerm_resource_group.main.group_name # 無效屬性
}

執行 terraform validate 後,輸出如下:

Error: Unsupported argument
on terraform_validate.tf line 9, in resource "azurerm_resource_group" "main":
9:   colors = ["blue"]

An argument named "colors" is not expected here.

Error: Unsupported attribute
on terraform_validate.tf line 18, in module "network":
18:   resource_group_name = azurerm_resource_group.main.group_name

This object has no argument, nested block, or exported attribute named "group_name".

修正錯誤

修正 terraform_validate.tf 檔案中的錯誤:

# terraform_validate.tf (修正後)
provider "azurerm" {
  version = "~> 1.0"
}

resource "azurerm_resource_group" "main" {
  name     = "test"
  location = "eastus"
}

module "network" {
  source              = "Azure/network/azurerm"
  version             = "~> 1.1.1"
  location            = "eastus"
  allow_rdp_traffic   = "true"
  allow_ssh_traffic   = "maybe"
  resource_group_name = azurerm_resource_group.main.name # 修正屬性名稱
}

再次執行 terraform validate,輸出如下:

Success! The configuration is valid, but there were some validation warnings as shown above.

Terraform 工作流程導覽

驗證 Terraform 組態(terraform validate)

terraform validate 命令用於檢查組態檔案的語法正確性,包括提供者和模組。該命令可以顯式或隱式執行。在執行 terraform validate 之前,必須初始化組態。

重點整理

  • terraform validate 檢查組態檔案的語法,包括提供者和模組。
  • 組態必須在執行 terraform validate 之前初始化。

生成和審查執行計劃(terraform plan)

terraform plan 命令用於建立執行計劃。Terraform 會對當前組態進行語法驗證,重新整理狀態,並比較狀態與組態的內容。

執行計劃的用途

  • 作為在原始碼控制中合併程式碼之前的檢查。
  • 作為驗證當前組態的檢查。
  • 作為執行對實際環境更改的準備步驟。

常見引數

  • -input:決定是否提示輸入,在自動化中設為 false。
  • -out:指定執行計劃的儲存檔案。
  • -refresh:是否執行狀態重新整理,預設為 true。
  • -var:為組態中的變數設定值,可以多次使用。
  • -var-file:指定包含變數值的鍵/值對的檔案。

重點整理

  • terraform plan 比較當前組態與狀態資料,並生成執行計劃以使狀態與組態一致。
  • 執行計劃可以儲存到檔案中,並由 terraform apply 使用。

執行對基礎設施的更改(terraform apply)

terraform apply 命令執行對實際環境的更改,以使其與組態或 terraform plan 生成的執行計劃中表達的期望狀態一致。

執行流程

  1. 預設情況下,apply 會在當前工作目錄中查詢 Terraform 組態,並根據期望狀態和實際環境建立執行計劃。
  2. 執行計劃呈現給使用者批准。
  3. 使用者批准後,變更被應用到實際環境,狀態資料被更新。

常見引數

  • -auto-approve:跳過批准步驟,直接進行變更。
  • -input:決定是否提示輸入,在自動化中設為 false。
  • -refresh:是否執行狀態重新整理,預設為 true。
  • -var:為組態中的變數設定值,可以多次使用。
  • -var-file:指定包含變數值的鍵/值對的檔案。

重點整理

  • terraform apply 執行變更以使實際環境與期望狀態一致。
  • 可以直接執行 terraform apply 或使用先前儲存的執行計劃檔案。

程式碼範例與解析

以下是一個簡單的 Terraform 組態範例,用於建立一個 AWS EC2 例項:

provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

內容解密:

  1. 提供者組態:指定使用 AWS 提供者,並設定區域為 “us-west-2”。
  2. 資源定義:定義一個名為 “example” 的 AWS EC2 例項,使用指定的 AMI 和例項型別 “t2.micro”。

Plantuml 圖表展示 Terraform 工作流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Terraform工作流程與狀態管理

package "Terraform 工作流程" {
    actor "DevOps" as dev

    package "本地開發" {
        component [.tf 設定檔] as tf
        component [terraform.tfvars] as vars
        component [.tfstate] as state
    }

    package "Terraform Core" {
        component [Init] as init
        component [Plan] as plan
        component [Apply] as apply
        component [Destroy] as destroy
    }

    package "Providers" {
        cloud "AWS" as aws
        cloud "GCP" as gcp
        cloud "Azure" as azure
    }

    database "Remote State" as remote
}

dev --> tf : 編寫配置
tf --> init : 初始化
init --> plan : 規劃變更
plan --> apply : 執行變更
apply --> aws : 建立資源
apply --> gcp : 建立資源
apply --> azure : 建立資源
apply --> state : 更新狀態
state --> remote : 同步狀態

@enduml

此圖示展示了 Terraform 的基本工作流程,從初始化到應用變更的步驟。

Terraform 工作流程與狀態管理

深入理解 Terraform Destroy 指令

在 Terraform 的工作流程中,terraform destroy 是一個非常重要的指令,用於銷毀由 Terraform 管理的基礎設施。這個指令在許多情況下非常有用,例如在專案結束時清理開發環境,或是在 CI/CD 管道中測試完成後拆除測試環境。

使用 Terraform Destroy 的注意事項

  • terraform destroy 會刪除所有由 Terraform 管理的資源,且這個動作無法復原。
  • 在執行銷毀操作之前,Terraform 會呈現一個執行計劃,列出所有將被銷毀的資源,並提示使用者確認。
  • terraform apply 指令類別似,terraform destroy 也接受許多相同的引數和旗標,但不能提供一個計劃檔案作為引數。

常用的 Terraform Destroy 引數

  • -auto-approve:自動批准銷毀操作,不提示使用者確認(原本的 -force 引數已被棄用)。
  • -target:指定特定的資源進行銷毀,同時也會銷毀該資源的依賴項,可以多次使用該旗標。

預覽銷毀操作

在執行 terraform destroy 之前,可以使用 terraform plan -destroy 指令來預覽將要執行的銷毀操作。

Terraform 狀態管理

Terraform 使用狀態(state)來對映實際環境和組態之間的差異。狀態資料儲存在一個 JSON 格式的資料結構中。

預設的本地後端

在沒有其他組態的情況下,Terraform 會將狀態儲存在本地檔案系統中,通常是 terraform.tfstate 檔案。

狀態檔案的位置

可以使用 -state=statefile 命令列旗標來更改狀態檔案的位置。

使用工作區時的狀態管理

當使用 Terraform 工作區時,每個工作區都會維護一個獨立的狀態,允許多個環境共用相同的 Terraform 組態。

重點回顧

  • Terraform 使用狀態來跟蹤實際環境和組態之間的對映。
  • 狀態資料預設儲存在本地檔案系統中,但可以透過後端組態進行更改。
  • 使用工作區時,每個工作區都有獨立的狀態。

程式碼範例:檢視 Terraform 狀態

terraform show

內容解密:

此指令用於顯示目前的 Terraform 狀態。透過執行 terraform show,你可以檢視目前 Terraform 管理的資源狀態,瞭解實際環境與組態之間的差異。