文章目標:解釋什麼是配置器,並展示如何使用配置器來在創建後執行額外的設定。
文章同步分享到
blog – https://devops-with-alex.com/day-10-terraform-provisioners-concept/
ithome – https://ithelp.ithome.com.tw/articles/10326990
Medium – https://medium.com/p/bcdaec8d331e
1. Terraform 配置器 (Provisioners) 的概念與使用
Provisioners 配置器介紹
Terraform的”Provisioners”是用於在基礎架構物件建立後執行特定操作的工具。這些操作可以在本地或遠程機器上執行,用於初始化、設定或準備基礎架構,以確保它們適用於服務。”Provisioners”可用於執行腳本、安裝軟件、設定應用程序等操作,以確保基礎架構處於正確的狀態。
說得這樣複雜,其實Provisioners 配置器它本質就是一個麥當勞套餐客製化,我要可樂少冰、薯條不加鹽巴、要多買麥克雞塊跟一包糖醋醬料,或是薯條要用糖跟番茄醬尬起來。
- 概念:Terraform Provisioners 是一個機制,用於在創建或修改基礎架構時執行額外命令或設定。它可以在創建基礎架構時執行,也可以在基礎架構建立完成後執行。
- 實作用途:Terraform Provisioners 可以用於安裝軟體、執行指令、設置檔案等作業,以確保創建的基礎架構能夠滿足特定的需求。
– 例如,開啟虛擬機器後,自動更新套件 apt get update -y。
– Terraform Provisioners 可以使用本地或遠端的 shell、PowerShell、Python、Ansible 等工具來執行額外的命令。 - 執行方式: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 可以在基礎架構上創建檔案或目錄。
2. 實際Terraform操作
任務目標:
- 使用GCP的cloud shell環境,來執行terraform (沒有使用過請參閱Terraform 工作流程)
- 產生一個GCE 虛擬機器 (Google Compute Engine)
- 實作local-exec的功能
- 比較 local-exec、remote-exec 和 file 的差異
啟動cloud shell並輸入代碼
創建專案以後,右上角先啟動cloud shell,並選擇使用vscode 編輯器開啟新頁面。
進入vscode 編輯器後,新建或開啟main.tf的檔案,並複製下列程式碼到視窗中,我們要利用這些程式碼練習,可以先輸入練習後,再來回來看代表的意義。
範例程式碼:產生一個GCE 虛擬機器 (Google Compute Engine)
可以到下方的github連結中,下載對應的參考程式碼
- Terraform-from-zero-to-hero-10-Lab-GCP-Infrastucture-as-Code
- 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" # ] # } }
這個檔案的用途是定義和創建一個 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"
總結 Summary
- 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雲端自動化架構課程