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 版本定義
順序
文件撰寫順序
先定義好 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
設定傳入的參數,常用的參數name
、project_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