在雲端時代,基礎設施即程式碼(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 # 如果使用自簽名證書
}

內容解密:

  1. terraform 塊:這個塊定義了所需的提供者及其版本。source 是提供者的來源,version 是指定的版本號。
  2. 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
}

內容解密:

  1. data “vsphere_datacenter”: 用於取得指定資料中心的詳細資訊。
    • name:資料中心名稱。
  2. data “vsphere_resource_pool”: 用於取得指定資源池的詳細資訊。
    • name:資源池名稱。
    • datacenter_id:資料中心 ID,確保與正確資料中心關聯。
  3. data “vsphere_tag”: 用於取得指定標籤的詳細資訊。
    • name:標籤名稱。
    • category_id:標籤類別 ID。
  4. 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

      }
    }
}

內容解密:

  1. resource “vsphere_virtual_machine” 塊:這個塊定義了一個虛擬機器。
    • name:虛擬機器的名稱。
    • resource_pool_id:虛擬機器所屬的資源池 ID。
    • datastore_id:虛擬機器所使用的資料儲存 ID。
    • folder:虛擬機器在 vCenter 中所屬的檔案夾路徑。
  2. num_cpus 和 memory:虛擬機器的 CPU 數量和記憶體大小。設為可熱插拔以便後續調整。
  3. firmware 和 guest_id:虛擬機器使用的韌體型別和來賓 ID,從範本中繼承。
  4. 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的人員標記}

內容解密:

  1. 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];

內容解密:

  1. Root Module:根模組負責整體組態管理,呼叫各子模組進行具體實作。
  2. Network Module:網路模組負責網路相關設定包括 VPC 與子網路.
  3. Compute Module:計算模組負責運算相關設定,包括VM佈署.
  4. Storage Module:儲存模組負責儲存相關設定.

根據經驗建議

實務經驗顯示,在此過程中需要特殊注意幾點事項:

  1. 須針對不同環境進行多次測試來確保無誤執行(如預備環境、開發環境等).
  2. 不同環境間之變數必須根據需求設計不同值.
  3. 若遇到錯誤,務必檢查對應之log檔案,以快速排除問題.

未來趨勢

隨著雲原生技術逐漸普及,Terraform 或其他 IaC 工具會更常見並在多種雲端環境中應用(如:多雲策略).因此,深入理解並熟練使用 Terraform 是當前及未來需要具備之技能.