Terraform 提供多種變陣列態方式,靈活運用能提升 IaC 管理效率。命令列旗標適合臨時調整引數,環境變數則適用於敏感資訊保護,變數檔案則方便集中管理大量變數。此外,Terraform 也支援互動式提示,方便在佈署過程中手動輸入特定值。實務上,我們可以結合這些方法,例如使用變數檔案管理通用組態,同時利用命令列旗標覆寫特定環境的引數。對於 VMware 資源組態,可以透過變數定義資料儲存、網路等資訊,並利用 Terraform 的 vSphere Provider 與 vCenter 互動,實作自動化佈署。模組化是 Terraform 的核心概念,能將複雜的基礎設施拆分成可重複使用的模組,簡化組態流程並提高程式碼可讀性。例如,可以建立一個 VMware 虛擬機器模組,包含 CPU、記憶體、網路等設定,並在不同專案中重複使用。在實際佈署過程中,terraform init 初始化工作目錄並下載所需外掛,terraform plan 預覽變更,terraform apply 執行佈署。透過版本控制管理 Terraform 組態檔案,可以追蹤基礎設施的變更歷史,方便團隊協作和回復操作。
Terraform 變數管理的多種方式
Terraform 是一個強大的基礎設施即程式碼(Infrastructure as Code, IaC)工具,能夠幫助我們自動化地管理和佈署基礎設施。在使用 Terraform 時,變數管理是一個非常重要的環節。變數可以幫助我們在不同環境中靈活地組態資源,提高了程式碼的可重用性和可維護性。這篇文章將探討 Terraform 中變數管理的多種方式,並結合具體案例進行說明。
概述
變數是 Terraform 中一個非常重要的概念,它允許我們將一些組態值抽象出來,使得我們的 Terraform 組態檔案更加靈活和可重用。在 Terraform 中,變數可以透過多種方式進行組態,包括命令列旗標、環境變數、變數檔案以及互動式提示等。
命令列旗標
命令列旗標是最直接的變陣列態方式之一。我們可以在執行 Terraform 命令時直接透過 -var 旗標來指定變數的值。例如,要在執行時設定一個名為 datastore 的變數,可以使用以下命令:
terraform apply -var="datastore=example_datastore"
環境變數
另一種常見的方式是透過環境變數來組態變數。Terraform 會自動讀取符合特定命名規範的環境變數(TF_VAR_variable_name)。例如,要設定一個名為 network 的變數,可以使用以下命令:
export TF_VAR_network="example_network"
變數檔案
Terraform 還允許我們將變數值儲存在單獨的檔案中,這些檔案通常具有 .tfvars 或 .tfvars.json 副檔名。我們可以建立一個名為 variables.tfvars 的檔案來儲存變數值:
datastore = "example_datastore"
network = "example_network"
然後在執行 Terraform 命令時指定該變數檔案:
terraform apply -var-file="variables.tfvars"
互動式提示
如果上述方法都未設定某個變數,Terraform 會在執行時提示我們輸入該變數的值。例如,如果 cluster 變數未被設定,Terraform 會要求我們輸入該值。
案例:VMware 資源組態
以下是一個結合命令列旗標和變數檔案來組態 VMware 資源的具體案例:
terraform apply -var="datastore=example_datastore"
export TF_VAR_network="example_network"
datastore = "example_datastore"
network = "example_network"
variable "datastore" {
description = "VMware 資料儲存名稱"
type = string
}
variable "network" {
description = "VMware 網路名稱"
type = string
}
resource "vsphere_virtual_machine" "example_vm" {
name = "web-server"
datastore = var.datastore
network = var.network
}
Terraform 模組化
模組化是 Terraform 的一大特色,它允許我們將可重用的基礎設施組態封裝起來。這不僅提高了程式碼的可維護性,還增強了其可重用性。
模組介紹
模組是 Terraform 中的一個重要概念,它允許我們將資源、變數和輸出封裝起來,形成一個可重用的組態單元。以下是建立一個 VMware 虛擬機器模組的具體步驟:
- 建立一個名為
vm_module的目錄。 - 在
vm_module目錄中建立一個名為main.tf的檔案:
resource "vsphere_virtual_machine" "example_vm" {
name = var.vm_name
resource_pool_id = data.vsphere_resource_pool.pool.id
datastore_id = data.vsphere_datastore.datastore.id
template_uuid = data.vsphere_virtual_machine.template.id
num_cpus = var.num_cpus
memory = var.memory
network_interface {
network_id = data.vsphere_network.network.id
}
}
模組結構
模組目錄通常包含以下幾個檔案:
main.tf:定義資源和組態。variables.tf:定義輸入變數。outputs.tf:定義輸出值。
模組目錄結構如下:
vm_module/
├── main.tf
├── variables.tf (可選)
└── outputs.tf (可選)
模組使用
要使用上述定義的模組,我們可以在主組態檔案中參照該模組並提供所需的輸入變數:
module "my_vm" {
source = "./vm_module"
vm_name = "my-vm"
num_cpus = 2
memory = 4096
}
基礎設施佈署流程
以下是使用 Terraform 組態 VMware 資源並進行佈署的一些具體步驟。
提交組態檔案
首先需要建立一個主組態檔案(如 main.tf),定義所需的基礎設施狀態:
provider "vsphere" {
user = var.vsphere_username
password = var.vsphere_password
vsphere_server = var.vsphere_server
allow_unverified_ssl = true
}
resource "vsphere_virtual_machine" "example_vm" {
name = "my-vm"
resource_pool_id = data.vsphere_resource_pool.pool.id
datastore_id = data.vsphere_datastore.datastore.id
template_uuid = data.vsphere_virtual_machine.template.id
num_cpus = var.num_cpus
memory = var.memory
network_interface {
network_id = data.vsphere_network.network.id
}
初始化與佈署
接下來執行以下命令來初始化和佈署基礎設施:
terraform init # 初始化 Terraform 組態檔案(下載必要外掛)
terraform plan # 生成執行計劃(檢視將要進行的更改)
terraform apply # 應用更改(實際佈署基礎設施)
本地架構圖示
此圖示展示了 Terraform 在本地機器上佈署 VMware 虛擬機器的基本流程。
graph TD;
A[主機] --> B[TeraForm 組態];
B --> C[VSPhere Provider];
C --> D[VSPhere API];
D --> E[VMWare Server];
E --> F[虛擬機器];
內容解密:
- A(主機):表示本地開發或維運機器。
- B(TerraForm 組態):包含所有需要佈署之資源之指令碼及引數。
- C(VSPhere Provider):TerraForm 提供與 VSPhere API 做溝通之介面。
- D(VSPhere API):VSPhere 提供之 API 介面,供介面做操作之資訊交換。
- E(VMWare Server):此即 VSPhere 主機所在實體或虛擬伺服器之部屬地點。
- F(虛擬機器):執行完全部部屬步驟後所產生之虛擬機器例項。
透過這些步驟與方式,玄貓相信能夠幫助大家更好地理解和應用 Terraform 在基礎設施自動化中的功能。無論是簡單的資源佈署還是複雜的多環境管理,Terraform 無疑都是一個強大且靈活的選擇。
利用 Terraform 在 vCenter 建立 VMware 虛擬機器
透過範本建立 VMware 虛擬機器
在這個實作中,玄貓將展示如何使用 Terraform 組態 VMware 提供者並建立一個虛擬機器資源。這包括必要的資訊如虛擬機器名稱、資源池、資料儲存、範本、CPU、記憶體和網路組態。以下是完整的步驟和範例程式碼。
初始化 Terraform
準備好組態檔案後,下一步是初始化 Terraform。這個步驟確保 Terraform 下載所需的提供者外掛並設定工作目錄。
terraform init
執行 terraform init 指令會初始化 Terraform 工作目錄,根據組態檔案中的提供者定義下載必要的提供者外掛。
執行 Terraform 計劃
初始化完成後,接下來是執行 Terraform 計劃,這會識別 Terraform 計劃在基礎設施資源上進行的變更。仔細檢查計劃,如果有任何不需要的變更,則需要相應地修改組態檔案並重新執行 terraform plan。
terraform plan
terraform plan 指令不會影響資源;它只顯示 Terraform 對基礎設施所帶來的變更。
應用變更
審核 terraform plan 顯示的變更後,可以應用這些變更。Terraform 與提供者一起開始在目標平台上進行所需的變更。
terraform apply
變更成功應用到目標平台後,Terraform 的狀態檔案會自動更新,以反映當前狀態,以便未來對資源進行進一步的變更。
實作練習:生成組態及狀態檔案以透過 vCenter 使用範本建立 VMware VM
以下是使用 Terraform 透過 vCenter 使用範本建立 VMware VM 的逐步和範例。這個實作假設已經完成了安裝 Terraform 執行檔和 VMware 提供者的步驟,如第一章中的實作練習所述。
第一步:定義組態檔案 (main.tf)
在 main.tf 中定義不同的部分如提供者、資料、資源等。為了簡化,這裡只定義一個完整的檔案 main.tf。
terraform {
required_providers {
vsphere = {
source = "local/hashicorp/vsphere"
version = "2.3.1"
}
}
}
provider "vsphere" {
vsphere_server = "x.x.x.x"
user = "administrator@vsphere.local"
password = "xxxxxxx"
allow_unverified_ssl = true
}
data "vsphere_datacenter" "dc" {
name = "Your DC Name"
}
data "vsphere_compute_cluster" "cluster" {
name = "Your cluster name"
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_datastore" "datastore" {
name = "Datastore name needed for VM deployment"
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_network" "network" {
name = "VM Network"
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_virtual_machine" "template" {
name = "Ubuntu" # Your template name
datacenter_id = data.vsphere_datacenter.dc.id
}
resource "vsphere_virtual_machine" "Ubuntu" {
name = "UbuntuTest" # VM name for deployment
resource_pool_id = data.vsphere_compute_cluster.cluster.resource_pool_id
datastore_id = data.vsphere_datastore.datastore.id
num_cpus = 4
cpu_hot_add_enabled = true
memory = 12288
memory_hot_add_enabled = true
wait_for_guest_net_timeout = 0
wait_for_guest_ip_timeout = 0
guest_id = data.vsphere_virtual_machine.template.guest_id
scsi_type = data.vsphere_virtual_machine.template.scsi_type
network_interface {
network_id = data.vsphere_network.network.id
adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0]
}
disk {
label="disk0.vmdk"
size="${data.vsphere_virtual_machine.template.disks.0.size}"
eagerly_scrub="${data.vsphere_virtual_machine.template.disks.0.eagerly_scrub}"
thin_provisioned="${data.vsphere_virtual_machine.template.disks.0.thin_provisioned}"
}
clone {
template_uuid="${data.vsphere_virtual_machine.template.id}"
customize {
linux_options {
host_name="Terraform-test"
domain="test.internal"
}
network_interface{
ipv4_address="x.x.x.x" # IP you want to assign
ipv4_netmask=24 }
ipv4_gateway="x.x.x.x"}
}
第二步:安裝 Terraform 和 VMware vSphere 提供者
從官方網站下載並安裝最新版本的 Terraform:
https://www.terraform.io/downloads.html
安裝 VMware vSphere 提供者外掛:
terraform init
init 指令初始化 Terraform 專案並下載必要的外掛。
第三步:執行 Terraform計劃
執行 terraform plan 指令以識別即將佈署的組態。計劃指令顯示預覽 Terraform 對基礎設施所做的變更。
root@ubuntu:/home/user/te# terraform plan
data.vsphere_datacenter.dc: Reading...
data.vsphere_datacenter.dc: Read complete after [id=datacenter-1001]
data.vsphere_network.network: Reading...
data.vsphere_datastore.datastore: Reading...
data.vsphere_compute_cluster.cluster: Reading...
data.vsphere_virtual_machine.template: Reading...
data.vsphere_network.network: Read complete after [id=network-1035]
data.vsphere_datastore.datastore: Read complete after [id=datastore-1029]
data.vsphere_compute_cluster.cluster: Read complete after [id=domain-c1006]
data.vsphere_virtual_machine.template: Read complete after [id=4215b623-df65-ae56-72f6-4f7001ae46a3]
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# vsphere_virtual_machine.Ubuntu will be created.
+ resource "vsphere_virtual_machine" "Ubuntu" {
+ annotation (known after apply)
+ boot_retry_delay (known after apply)
+ change_version (known after apply)
+ cpu_hot_add_enabled (known after apply)
+ cpu_limit (known after apply)
+ cpu_share_count (known after apply)
+ cpu_share_level (known after apply)
+ datastore_id (known after apply)
+ default_ip_address (known after apply)
+ ept_rvi_mode (known after apply)
+ extra_config_reboot_required(known after apply)
+ firmware (known after apply)
+ folder (known after apply)
+ force_power_off (known after apply)
+ guest_id (known after apply)
+ guest_ip_addresses (known after apply)
+ hardware_version (known after apply)
####此圖示呈現了Terrafrom組態範例:
graph TD;
A[Terrafrom] --> B[Provider];
B --> C[vSphere];
C --> D[Datacenter];
C --> E[Compute Cluster];
C --> F[Datastore];
C --> G[Network];
G --> H[VM Template];
#####內容解密: 此圖示展示了使用Terrafrom組態VMware虛擬機器時的流程。整體架構分為四大區塊:Terrafrom、Provider、vSphere以及各種與vSphere相關的資料塊(Data)。其中,Provider負責連線vSphere環境,而vSphere內部又包含多種資源如Datacenter、Compute Cluster、Datastore以及Network。這些資源最終用於建立VM Template,從而完成虛擬機器的佈署。
再次強調以下幾點:
- 初始化:使用
terraform init初始化環境。 - 計劃:使用
terraform plan檢視即將進行的變更。 - 應用:使用
terraform apply應用變更到實際環境。 - 詳盡解釋:每個步驟都有詳細解釋,確保理解每個程式碼段落和技術選型。
希望這些內容能夠幫助你順利完成利用Terrafrom在vCenter建立VMware虛擬機器的任務。