Pages - Menu

2023年7月28日 星期五

[Terraform]Terraform的基本概念

睡睡念

經歷上一篇的失敗,
還是先從基本觀念開始吧。


正文

tf基本組成

宣告
  1. terraform
    宣告terraform以及環境的版本
terraform {
  required_version = "~>0.13.5"
  required_providers {
    ucloud = {
      source  = "ucloud/ucloud"
      version = "~>1.22.0"
    }
  }
}
  1. provider
    呼叫該環境api時需要的參數
    k8s
provider "kubernetes" {
  config_path = "~/.kube/config"
}

ucloud

provider "ucloud" {
  public_key  = "JInqRnkSY8eAmxKFRxW9kVANYThg1pcvjD2Aw5f5p"
  private_key = "IlJn6GlmanYI1iDVEtrPyt5R9noAGz41B8q5TML7abqD8e4YjVdylwaKWdY61J5TcA"
  project_id  = "org-tgqbvi"
  region      = "cn-bj2"
}

定義
  1. data
    取得terraform以外的資訊,不同的proivder提供不同的data sources。
    provider 列表
data "ucloud_security_groups" "default" {
  type = "recommend_web"
}
  1. resource
    要建立的資源
    resource "ucloud_eip" "web-eip" {
      internet_type = "bgp"
      charge_mode   = "bandwidth"
      charge_type   = "dynamic"
      name          = "web-eip"
    }
  1. output
    輸出
        output "eip" {
          value = ucloud_eip.web-eip.public_ip
        } 

狀態檔案(tfstate)

當terrform要執行變更時,會產生tfstate的檔案,
上面記載了目前雲上的資源狀態,此檔案不建議編輯,
當有任何資源變更時,會同步判斷目前雲上的資源狀態是否一致。
可使用以下指令,匯入目前雲端上的資源狀態

 terraform import kubernetes_deployment.websocketclient default/websocketclient

kubernetes_deployment.websocketclient 為tf的資源名稱
default/websocketclient 是雲上的資源

此tfstate的檔案是明碼,且多人使用會造成簽入時發生衝突,
所以要透過backend來解決這個問題

檔案裡面會看到一些狀態,代表的意思如下

  • + 代表新增的資源 (Resource added)
  • - 代表刪除的資源 (Resource deleted)
  • ~ 代表修改的資源 (Resource modified)
  • = 代表資源參數的值沒有改變,只是調整了排序 (Resource parameter unchanged, only ordering changed)
  • -/+ 同時出現,表示毀壞性變更,先刪除後建立


![[148-fig.2.jpg]]


遠端狀態儲存機制(Backend)

Terraform Remote Backend分為兩種:

  • 標準:支援遠端狀態儲存與狀態鎖

    狀態鎖是指,當針對一個tfstate進行變更操作時,可以針對該狀態檔案新增一把全域鎖,確保同一時間只能有一個變更被執行。

  • 增強:在標準的基礎上支援遠端操作(在遠端伺服器上執行plan、apply等操作)

    只存在於Terraform Cloud

目前支援的backend list


![[148-fig.1.jpg]]

要共用 backend的話,
先建立一個 backend.hcl
裡面輸入

   bucket  = "98c2c8-terraform-backend"
   prefix  = "terraform/state"

在main.tf的required_providers後面填上 backend “gcs” { },
格式如下

terraform {
  required_providers {
    google = {
      source = "hashicorp/google"
      version = "4.63.1"
    }
  }
  backend "gcs" {

  }
}

然後在初始化的時候,輸入

terraform init -backend-config=backend.hcl

ref. Backend組態的動態賦值


建立workspace

相比起多資料夾隔離的方式來說,基於Workspace的隔離更加簡單,只需要保存一份程式碼,在程式碼中不需要為Workspace編寫額外程式碼,用命令列就可以在不同工作區之間來回切換。

下列指令分別為,建立、列表、選擇及顯示目前的workspace

terraform workspace new qa
terraform workspace list
terraform workspace select qa
terraform worspace show

ref. 狀態管理

檢查terraform 的計劃

terraform plan -out=out.tfplan

-out的指定計畫的輸出檔,確保您所檢閱的方案就是所套用的方案。
之後使用apply執行

terraform apply out.tfplan

建立完成後,使用show看目前狀態

terraform show

count

舉例來說, 兩個VM是一隻狗一隻貓,那就是dog.tf cat.tf
如果是兩隻狗 就可以寫一個 dog.tf
裡面用
resources ec2
Count = 2
這樣


console

執行 console ,看程式執行結果

terraform console 

cidrsubnet 後面的第二個參數表示二進位要位移多少,第三個參數表示,要設定位移的數字為多少。

例如 10 = 1010
位移4bit,所以是 1010 0000 = 160
6 = 0110
位移4bit ,所以是 0110 0000 = 96

tf console
> cidrsubnet("10.1.0.0/24",4,0)
"10.1.0.0/28"
> cidrsubnet("10.1.0.0/24",4,10)
"10.1.0.160/28"
> cidrsubnet("10.1.0.0/24",4,6)
"10.1.0.96/28"
> cidrsubnet("10.1.0.0/24",4,12)
"10.1.0.192/28"

ref. How cidrsubnet works in Terraform

沒有留言:

張貼留言