iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
DevOps

Terraform 從零開始 - 實戰Lab打造GCP雲端自動化架構系列 第 10

Day 10— Terraform基礎 — 配置器 (Provisioners) 的概念與使用

  • 分享至 

  • xImage
  •  

文章目標:解釋什麼是配置器,並展示如何使用配置器來在創建後執行額外的設定。

Day 10 — Terraform基礎 — 配置器 (Provisioners) 的概念與使用

文章同步分享到

1. Terraform 配置器 (Provisioners) 的概念與使用

Provisioners 配置器介紹

Terraform的Provisioners是用於在基礎架構物件建立後執行特定操作的工具。這些操作可以在本地或遠程機器上執行,用於初始化、設定或準備基礎架構,以確保它們適用於服務。Provisioners可用於執行腳本、安裝軟件、設定應用程序等操作,以確保基礎架構處於正確的狀態。

說得這樣複雜,其實Provisioners 配置器它本質就是一個麥當勞套餐客製化,我要可樂少冰、薯條不加鹽巴、要多買麥克雞塊跟一包糖醋醬料,或是薯條要用糖跟番茄醬尬起來。

Terraform Provisioners 配置器 — 薯條不加鹽巴 (圖片來源:麥當勞)

  1. 概念:Terraform Provisioners 是一個機制,用於在創建或修改基礎架構時執行額外命令或設定。它可以在創建基礎架構時執行,也可以在基礎架構建立完成後執行。

  2. 實作用途:Terraform Provisioners 可以用於安裝軟體、執行指令、設置檔案等作業,以確保創建的基礎架構能夠滿足特定的需求。

  • 例如,開啟虛擬機器後,自動更新套件 apt get update -y。
  • Terraform Provisioners 可以使用本地或遠端的 shell、PowerShell、Python、Ansible 等工具來執行額外的命令。
  1. 執行方式:Terraform Provisioners 的執行過程是在 Terraform 代碼的本地端執行的,並且會被記錄在 Terraform 狀態檔案中。Terraform 支援多種 Provisioner,例如 local-exec、remote-exec、file、chef、salt-masterless 等。

  2. 常用 Provisioner:常用 Provisioner 包括 local-exec、remote-exec 和 file。其中 local-exec 可以在本地端執行命令,remote-exec 可以在遠端主機上執行命令,file 可以在基礎架構上創建檔案或目錄。

Terraform Provisioners (配置器)範例程式碼

2. 實際Terraform操作

任務目標

  1. 使用GCP的cloud shell環境,來執行terraform (沒有使用過請參閱Terraform 工作流程)

  2. 產生一個GCE 虛擬機器 (Google Compute Engine)

  3. 實作local-exec的功能

  4. 比較 local-exec、remote-exec 和 file 的差異

啟動cloud shell並輸入代碼

創建專案以後,右上角先啟動cloud shell,並選擇使用vscode 編輯器開啟新頁面。

啟動cloud shell

新建或開啟main.tf的檔案

進入vscode 編輯器後,新建或開啟main.tf的檔案,並複製下列程式碼到視窗中,我們要利用這些程式碼練習,可以先輸入練習後,再來回來看代表的意義。

範例程式碼:產生一個GCE 虛擬機器 (Google Compute Engine)

可以到下方的github連結中,下載對應的參考程式碼

  1. Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code

  2. Day 10- Terraform基礎 — 配置器 (Provisioners) 的概念與使用

首先創建兩個檔案,分別是 provider.tf, main.tf

provider.tf

#########################################
# CONFIGURATION
#########################################
terraform {
  # 指定 terraform 的最小版本
  required_version = ">=1.0"

  required_providers {
    # provider 中的最小版本
    google = {
      source  = "hashicorp/google"
      version = ">= 4.40.0"
    }
  }
}
#########################################
# PROVIDERS
#########################################
provider "google" {
  # your project name
  project = "terraform101-384507"
}

這個檔案主要用於配置 Terraform 的提供者(provider),以確保 Terraform 可以正確地與 Google Cloud Platform(GCP)進行交互。

  • terraform :這個區塊設定了 Terraform 的版本要求,確保使用的版本符合最低要求大於4.40.0版本。同時,它也定義了所需的提供者和版本。

  • provider "google" :這個區塊指定了要使用的 GCP 提供,指定了 GCP 專案 ID(由 var.GCP_PROJECT 變數提供)。

main.tf

resource "google_compute_instance" "example" {
  name         = "example-instance"
  machine_type = "e2-micro"
  zone         = "asia-east1-b"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-10"
    }
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral IP
    }
  }

  # 成功案例,執行電腦本機路徑
  provisioner "local-exec" {
    command = "echo ${google_compute_instance.example.network_interface[0].network_ip} > ./ip_address_local_exec.txt"
  }

  # # 失敗案例,傳送到虛擬電腦本機
  # provisioner "file" {
  #   content     = google_compute_instance.example.network_interface[0].network_ip
  #   destination = "/tmp/ip_address_file.txt"
  # }

  # # 失敗案例,無法連線到遠端
  # provisioner "remote-exec" {
  #   inline = [
  #     "echo ${google_compute_instance.example.network_interface[0].network_ip} > /tmp/ip_address_remote_exec.txt"
  #   ]
  # }
}

GCE 虛擬機器 (Google Compute Engine)與配置器

這個檔案的用途是定義和創建一個 Google Cloud Platform(GCP)虛擬機器實例。指定了一個 google_compute_instance 資源,名稱為 "example":

  • name:指定了實例的名稱為 "example-instance"。

  • machine_type:設定了虛擬機型號為 "e2-micro",這是一種小型虛擬機型。

  • zone:指定了實例所在的區域為 "asia-east1-b"。

  • boot_disk:定義了引導磁碟的設定,並使用 "debian-cloud/debian-10" 映像。

  • network_interface:配置了網路接口,連接到預設網路。

  • access_config:這個部分可以用來配置外部 IP。

代碼示例中的 Provisioners 部分用於執行特定的本機操作,它們在創建 Google Compute Engine 虛擬機器實例後執行。在這邊的範例中,我們會主要使用 local-exec(本機執行),以下是它們的功能和說明:

  • local-exec(本機執行):此部分示例代碼使用 local-exec Provisioner,它在虛擬機器建立後在本機機器上執行命令。它將虛擬機器的 IP 地址寫入本機機器上的一個文本文件 ip_address_local_exec.txt。

  • file(文件):註解掉的部分是一個示例,使用 file Provisioner,試圖將虛擬機器的 IP 地址傳送到虛擬機器本身。但通常情況下,這種做法是不可行的,因為 Provisioners 需要執行在虛擬機器建立後,而不是建立過程中。

  • remote-exec(遠端執行):註解掉的部分是一個示例,使用 remote-exec Provisioner,試圖在虛擬機器上遠端執行命令。但這需要適當的遠端連接設定,以確保 Provisioner 能夠連接到虛擬機器。

這個 Terraform 配置碼的目的是創建一個 Google Cloud Compute Engine 實例,並用 Provisioners 在基礎架構建立後執行各種本機操作,以實現特定的配置或後續處理。在此示例中,local-exec Provisioner 用於成功地將虛擬機器的 IP 地址記錄到本機文件,我們會拿到 10.140.0.11,可以跟雲端機器的私有網路地址 private ip address對照是相同的。

部署執行

最後執行 terraform apply -auto-approve來部署對應的資源到雲端架構上,就可以得到下列的結果。

terraform apply -auto-approve

local-exec Provisioner 寫出虛擬機器的 IP 地址記錄

GCE 虛擬機器實例 (Google Compute Engine)

Terraform tip:可以利用下列的 Terraform tip,來增進部署效率。

  1. 打開終端機中的 .bashrc or .zshrc 檔案

  2. 在文件最下方加入下列指令

  3. 執行 source ~/.zshrc 或是 source ~/.bashrc 讓下面的 alias 快捷鍵生效

alias tf="terraform"
alias tfv="terraform validate"
alias tfdp="terraform apply -auto-approve plan.out"
alias tfd="terraform apply -auto-approve"
alias tfr="terraform destroy -auto-approve"
alias tfp="terraform plan -out plan.out"

總結 Summary

  1. Provisioners 配置器:Provisioners 是 Terraform 中的工具,用於在基礎架構建立後執行特定操作,例如安裝軟體或設定應用程序。可以在本地或遠程機器上執行這些操作,以確保基礎架構符合需求。

  2. Provisioners 概念:Terraform Provisioners 可以在基礎架構創建時或之後執行。常用的 Provisioner 類型包括 local-exec(本地執行)、remote-exec(遠端執行)和 file(創建檔案或目錄)。

  3. 實際操作:在 GCP 的 Cloud Shell 中,我們創建了一個 Google Compute Engine(GCE)虛擬機器實例。使用 local-exec Provisioner 在虛擬機器建立後,在本機機器上執行命令,以記錄虛擬機器的 IP 地址。通過執行 terraform apply -auto-approve,成功部署了資源也記錄了虛擬機器的 IP 地址。

相關連結

  1. Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Codehttps://github.com/qwedsazxc78/Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code

  2. Terraform-project-best-practicehttps://github.com/qwedsazxc78/terraform-project-best-practice

  3. 歡迎訂閱我的udemy課程:Terraform 從零開始 - 10+實戰Lab打造GCP雲端自動化架構課程 - https://devops-with-alex.com/go/terraform


上一篇
Day 9— Terraform基礎 — 資源 (Resources) 的概念與使用
下一篇
Day 11— Terraform基礎 — 變數 (Variables) 與輸出 (Outputs)
系列文
Terraform 從零開始 - 實戰Lab打造GCP雲端自動化架構31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言