文章目標:解釋什麼是配置器,並展示如何使用配置器來在創建後執行額外的設定。
Terraform的Provisioners
是用於在基礎架構物件建立後執行特定操作的工具。這些操作可以在本地或遠程機器上執行,用於初始化、設定或準備基礎架構,以確保它們適用於服務。Provisioners
可用於執行腳本、安裝軟件、設定應用程序等操作,以確保基礎架構處於正確的狀態。
說得這樣複雜,其實Provisioners 配置器它本質就是一個麥當勞套餐客製化,我要可樂少冰、薯條不加鹽巴、要多買麥克雞塊跟一包糖醋醬料,或是薯條要用糖跟番茄醬尬起來。
概念:Terraform Provisioners 是一個機制,用於在創建或修改基礎架構時執行額外命令或設定。它可以在創建基礎架構時執行,也可以在基礎架構建立完成後執行。
實作用途:Terraform Provisioners 可以用於安裝軟體、執行指令、設置檔案等作業,以確保創建的基礎架構能夠滿足特定的需求。
執行方式:Terraform Provisioners 的執行過程是在 Terraform 代碼的本地端執行的,並且會被記錄在 Terraform 狀態檔案中。Terraform 支援多種 Provisioner,例如 local-exec、remote-exec、file、chef、salt-masterless 等。
常用 Provisioner:常用 Provisioner 包括 local-exec、remote-exec 和 file。其中 local-exec 可以在本地端執行命令,remote-exec 可以在遠端主機上執行命令,file 可以在基礎架構上創建檔案或目錄。
使用GCP的cloud shell環境,來執行terraform (沒有使用過請參閱Terraform 工作流程)
產生一個GCE 虛擬機器 (Google Compute Engine)
實作local-exec的功能
比較 local-exec、remote-exec 和 file 的差異
創建專案以後,右上角先啟動cloud shell,並選擇使用vscode 編輯器開啟新頁面。
進入vscode 編輯器後,新建或開啟main.tf的檔案,並複製下列程式碼到視窗中,我們要利用這些程式碼練習,可以先輸入練習後,再來回來看代表的意義。
可以到下方的github連結中,下載對應的參考程式碼
首先創建兩個檔案,分別是 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"
# ]
# }
}
這個檔案的用途是定義和創建一個 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
Terraform tip:可以利用下列的 Terraform tip,來增進部署效率。
打開終端機中的 .bashrc or .zshrc 檔案
在文件最下方加入下列指令
執行 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"
Provisioners 配置器:Provisioners 是 Terraform 中的工具,用於在基礎架構建立後執行特定操作,例如安裝軟體或設定應用程序。可以在本地或遠程機器上執行這些操作,以確保基礎架構符合需求。
Provisioners 概念:Terraform Provisioners 可以在基礎架構創建時或之後執行。常用的 Provisioner 類型包括 local-exec(本地執行)、remote-exec(遠端執行)和 file(創建檔案或目錄)。
實際操作:在 GCP 的 Cloud Shell 中,我們創建了一個 Google Compute Engine(GCE)虛擬機器實例。使用 local-exec Provisioner 在虛擬機器建立後,在本機機器上執行命令,以記錄虛擬機器的 IP 地址。通過執行 terraform apply -auto-approve,成功部署了資源也記錄了虛擬機器的 IP 地址。
Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code — https://github.com/qwedsazxc78/Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code
Terraform-project-best-practice — https://github.com/qwedsazxc78/terraform-project-best-practice
歡迎訂閱我的udemy課程:Terraform 從零開始 - 10+實戰Lab打造GCP雲端自動化架構課程 - https://devops-with-alex.com/go/terraform