在雲端時代,基礎設施即程式碼(IaC)已成為不可或缺的技術。Terraform 作為 IaC 的佼佼者,能有效簡化基礎設施的管理。本文將詳細介紹如何使用 Terraform 在 VMware vSphere 環境中佈署和管理虛擬機器,從基礎的提供者設定到進階的資源組態,提供讀者一個全面的學習。首先,我們需要設定 VMware vSphere 提供者,確保 Terraform 能夠正確連線到 vSphere 伺服器。接著,利用資料來源功能取得資料中心、資源池、標籤等資訊,以便後續資源組態使用。在資源組態階段,我們將定義虛擬機器的規格、網路設定、磁碟設定等,並使用變數來提升組態的靈活性。為了更有效地管理複雜的基礎設施,我們可以運用條件判斷和模組化設計,將組態拆分成更小、更易於管理的單元。實務上,建議在不同環境中進行充分測試,並根據環境差異調整變數值。隨著雲原生技術的發展,Terraform 的應用場景將更加廣泛,掌握 Terraform 技術將成為未來IT工程師的必備技能。
使用 Terraform 組態 VMware 虛擬機器
在現代的基礎設施即程式碼(IaC)架構中,Terraform 是一個強大的工具,能夠幫助我們自動化地佈署和管理各種基礎設施資源。這篇文章將探討如何使用 Terraform 組態 VMware 虛擬機器,涵蓋從提供者組態到資源定義的完整流程。
提供者組態(Provider Section)
提供者組態是 Terraform 組態檔案中的重要部分,用於定義將用來佈建資源的基礎設施提供者。這部分包含了提供者的名稱、版本以及組態選項。提供者可以是雲端提供者,如 VMware、AWS、Azure 和 Google Cloud Platform,也可以是其他基礎設施提供者。
以下是使用 Terraform 佈署 VMware 虛擬機器的參考提供者組態範例:
terraform {
required_providers {
vsphere = {
source = "local/hashicorp/vsphere"
version = "2.3.1" ## 確認最新版本
}
}
}
provider "vsphere" {
vsphere_server = "<Vsphere 伺服器的完全合格網域名稱或 IP>"
user = "administrator@vsphere.local"
password = "XXXX"
allow_unverified_ssl = true # 如果使用自簽名證書
}
內容解密:
- terraform 塊:這個塊定義了所需的提供者及其版本。
source是提供者的來源,version是指定的版本號。 - provider “vsphere” 塊:這個塊包含了與 VMware vSphere 伺服器連線所需的詳細資訊。
vsphere_server:vSphere 伺服器的完全合格網域名稱或 IP。user:用於連線 vSphere 的使用者名稱。password:使用者的密碼。allow_unverified_ssl:如果 vSphere 伺服器使用自簽名 SSL 憑證,則設為 true。
資料來源組態(Data Section)
資料來源部分用於定義資料來源,這些資料來源提供只讀取存取外部資料,以幫助組態資源。Terraform 提供者會將資料來源中參照的值帶入。以下是一些常見的資料來源範例:
data "vsphere_datacenter" "dc" {
name = var.datacenter
}
data "vsphere_resource_pool" "pool" {
name = var.resource_pool
datacenter_id = data.vsphere_datacenter.dc.id
}
data "vsphere_tag" "tag2" {
name = var.environment_tag
category_id = data.vsphere_tag_category.category2.id
}
data "vsphere_folder" "folder" {
path = var.vcentre_folder
}
內容解密:
- data “vsphere_datacenter”: 用於取得指定資料中心的詳細資訊。
name:資料中心名稱。
- data “vsphere_resource_pool”: 用於取得指定資源池的詳細資訊。
name:資源池名稱。datacenter_id:資料中心 ID,確保與正確資料中心關聯。
- data “vsphere_tag”: 用於取得指定標籤的詳細資訊。
name:標籤名稱。category_id:標籤類別 ID。
- data “vsphere_folder”: 用於取得指設定檔案夾路徑的詳細資訊。
path:檔案夾路徑。
資源組態(Resource Section)
資源部分用於定義構成基礎設施的各種資源。這部分包含了資源型別、名稱以及組態選項。每個資源定義在組態檔案中都對應到 Terraform 需要在基礎設施中建立、修改或刪除的一個實際資源。
以下是一個範例資源部分:
resource "vsphere_virtual_machine" "XXXXX" {
name = var.vm_name
resource_pool_id = data.vsphere_resource_pool.pool.id
datastore_id = data.vsphere_datastore.datastore1.id
folder = "${data.vsphere_datacenter.dc.name}/vm/${data.vsphere_folder.folder.path}"
num_cpus = var.vm_cpu
cpu_hot_add_enabled = true
memory = var.vm_memory
memory_hot_add_enabled= true
wait_for_guest_net_timeout = 0
wait_for_guest_ip_timeout = 0
firmware = data.vsphere_virtual_machine.template.firmware
guest_id = data.vsphere_virtual_machine.template.guest_id
tags = [data.vsphere_tag.tag1.id, data.vsphere_tag.tag2.id]
network_interface {
network_id = data.vsphere_network.network_vlan.id
adapter_type = data.vsphere_virtual_machine.template.network_interface_types[0]
}
disk {
label = "disk0.vmdk"
size = var.disk_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 {
windows_options {
computer_name = var.computer_name
admin_password = var.vm_admin_password
auto_logon = true
auto_logon_count = 4
full_name = "Administrator"
run_once_command_list =
var.skip_post_deploy ? local.start_up_nocmd : local.start_up_command
}
network_interface {
ipv4_address = var.network_address
ipv4_netmask =
var.network_address_subnetmask
}
ipv4_gateway =
var.network_address_gateway
}
}
}
內容解密:
- resource “vsphere_virtual_machine” 塊:這個塊定義了一個虛擬機器。
name:虛擬機器的名稱。resource_pool_id:虛擬機器所屬的資源池 ID。datastore_id:虛擬機器所使用的資料儲存 ID。folder:虛擬機器在 vCenter 中所屬的檔案夾路徑。
- num_cpus 和 memory:虛擬機器的 CPU 數量和記憶體大小。設為可熱插拔以便後續調整。
- firmware 和 guest_id:虛擬機器使用的韌體型別和來賓 ID,從範本中繼承。
- tags:虛擬機器應用的標籤,方便管理和分類別。
網路介面組態:
- network_interface:定義虛擬機器的網路介面。
network_id:網路 ID,從之前定義的網路中取得。
傳統介面卡(Disk):
- disk:定義虛擬機器使用的一個磁碟驅動器.
label:磁碟標籤,如 disk0.size:磁碟大小,單位為 GB.- 其他引數則是繼承自範本.
副本複製:
- clone:複製新 VM 的範本UUID.
- 在customize內進行初始化設定如Windows上電自動登入等設定.
- 在network_interface內設定IPv4相關引數.
處理變數(Variable Section)
變數部分用於定義可以在組態檔案中使用的變數。變數可以是字串、數字或布林值,並且可以用來傳遞值給資源組態。變數使得 Terraform 組態更加靈活和可重用。
以下是一些範例變數:
variable "datacenter" {
description = "VMware vSphere 資料中心名稱"
}
variable "resource_pool" {
description =
"指定資料中心中的叢集名稱,例如:<ClusterName>/Resources"
}
variable "vm_name" {
description =
"在 vCenter 中分配給 VM 的名稱"
}
variable "vm_cpu" {
description =
"分配給 VM 的 CPU 數量,例如:1 或 4 或 8"
}
variable "vm_memory" {
description =
在 MB 中分配給 VM 的記憶體大小,例如:12288 MB ==12 GB 的 RAM "
}
variable "datastore" {
description =
在 vSphere 中佈署 VM 的資料儲存區"
}
variable "disk_size" {
description =
希望佈署磁碟大小 (單位GB) "
}
variable “environment_tag” {description =
“要分配給VM的人員標記”}
內容解密:
- variable 塊:每個變數都有一個唯一的名稱和描述。描述幫助理解該變數所代表的內容及其作用。
條件判斷與模組化
在 Terraform 中,條件判斷和模組化是提高組態靈活性和可重用性的重要手段。條件判斷允許我們根據某些條件來決定是否應用某些組態,而模組化則使我們能夠將組態分割成獨立且可重用的模組。
透過結合多樣化技術選型及靈活性需求後,可以更彈性地設計出最適合環境與需求之方案.
例如,此圖示展示了Terraform 模組化架構:
graph TD; A[Root Module] --> B[Network Module]; A --> C[Compute Module]; A --> D[Storage Module]; B --> E[VPC Configuration]; B --> F[Subnet Configuration]; C --> G[VM Configuration]; D --> H[Storage Class Configuration];
內容解密:
- Root Module:根模組負責整體組態管理,呼叫各子模組進行具體實作。
- Network Module:網路模組負責網路相關設定包括 VPC 與子網路.
- Compute Module:計算模組負責運算相關設定,包括VM佈署.
- Storage Module:儲存模組負責儲存相關設定.
根據經驗建議
實務經驗顯示,在此過程中需要特殊注意幾點事項:
- 須針對不同環境進行多次測試來確保無誤執行(如預備環境、開發環境等).
- 不同環境間之變數必須根據需求設計不同值.
- 若遇到錯誤,務必檢查對應之log檔案,以快速排除問題.
未來趨勢
隨著雲原生技術逐漸普及,Terraform 或其他 IaC 工具會更常見並在多種雲端環境中應用(如:多雲策略).因此,深入理解並熟練使用 Terraform 是當前及未來需要具備之技能.