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 虛擬機器模組的具體步驟:

  1. 建立一個名為 vm_module 的目錄。
  2. 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虛擬機器的任務。