返回
Featured image of post Terraform - 基礎教學

Terraform - 基礎教學

Terraform 快速了解與運用

Terraform 是一個 IaC 工具,更有效率地控制雲端環境的變更與組態設定 對基礎設施建置的順序性還是存在的,要對使用的雲端建議擅長再使用 Terraform

以GCP順序範例舉例: 開啟API -> 建置 VPC -> 建 GCE -> 綁 cloud loadbalancing -> A 紀錄指向 external IP 在攥寫 terraform 的時候也要具備這個思路

install

$ brew install terraform
$ terraform --version
Terraform v1.5.6
on darwin_arm64

terraform 資料夾規範建議

├── version.tf                      # 定義 terraform & provider 版本
├── terraform.tfvars                # 定義 input variable
└── modules                         # 自製 terraform modlues
    └── resource                    # terraform modlues 建議風格
        ├── main.tf                 # terraform 入口
        ├── output.tf               # terraform output variable
        ├── variables.tf            # terraform input variable
        └── versions.tf             # terraform 版本定義

順序

原圖來至官網,Terraform 的執行順序
原圖來至官網,Terraform 的執行順序

文件撰寫順序

先定義好 Provider 才能寫 Resources

指令執行順序

於 resource 資料夾底下執行

# 安裝依賴
$ terraform init
# 預覽更改
$ terraform plan
# 確認執行 會有再次確認,若想略過確認 -auto-approve 若想指定 tfvars 可使用 -var-file 指定所需的 file
$ terraform apply
# 確認刪除 (選填,練習就建議刪除以免產生過多收費)
$ terraform destroy

副檔名介紹

  • terraform.tf - 基本文件
  • terraform.tfvars - 變數文件
  • terraform.tfstate - 當前狀態
  • terraform.tfstate.backup - backup狀態

Provider

總覽 - https://registry.terraform.io/browse/providers 選擇 google 點擊右上方 USE PROVIDER 複製,每個 Provider 基本上都是這樣開始設定

terraform {
  required_providers {
    google = {
      source = "hashicorp/google"
      version = "4.81.0"
    }
  }
}

provider "google" {
  # Configuration options
}
provider "google" {
  project     = "my-project-id" # GCP 總覽頁面 Project ID
  region      = "us-central1"   # GCP region 名稱
}

Variables

input variable

設定傳入的參數,常用的參數nameproject_id這種

# variables.tf
variable "project" {
  type        = string
  description = "介紹variable所用,若未先帶入執行 terraform apply 時會請輸入此value"
}

output variable

設定 Resources apply 執行完畢後的值 ex:建立ip時外網ip由gcp自動產生,可用這種方式獲取外網ip

# output.tf
output "external_ip" {
  value = google_compute_global_address.bucket.address
}

Modules

建議使用官方出產品質保證的,亦可自己組裝基本上是把 resources 組成常用的幾個 module 會建議使用 Source Code 直接看 Github,會有 example 有範例

總覽 - https://registry.terraform.io/browse/modules?partner=true

Module 資料夾規範建議

- modules
    |- module
        |- main.tf      # 主入口
        |- output.tf    # apply 輸出
        |- variables.tf # var 定義
        |- version.tf   # module 版本

google_compute_global_address 作為範例

version

定義這個 module 需要版本為多少

terraform {
  required_version = ">= 0.13.0"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "< 5.0, >= 3.83"
    }
  }
}

variables

variable "name" {
  description = "名稱"
  type        = string
}

output

output "external_ip" {
  value = google_compute_global_address.bucket.address
}

main

resource "google_compute_global_address" "bucket" {
  name     = "${var.name}-bucket-ip"
  project  = var.project
  provider = google-beta
}

常見錯誤

Error: Incompatible provider version

│ Error: Incompatible provider version
│ Provider registry.terraform.io/hashicorp/template v2.2.0 does not have a
│ package available for your current platform, darwin_arm64.
│ Provider releases are separate from Terraform CLI releases, so not all
│ providers are available for all platforms. Other versions of this provider
│ may have different platforms supported.

錯誤會出現在 apple M系列電腦 (darwin_arm64),以 hashicorp/template 為範例。 解決方法:

# 工具官網: https://github.com/kreuzwerker/m1-terraform-provider-helper
$ brew install kreuzwerker/taps/m1-terraform-provider-helper
$ m1-terraform-provider-helper activate
$ m1-terraform-provider-helper install hashicorp/template -v v2.2.0
comments powered by Disqus