Terraform 作為現代基礎設施即程式碼工具,能有效管理和佈署雲端及本地資源。理解其核心概念,包含狀態檔案的運作機制和組態檔案的撰寫方式,對於成功運用 Terraform 至關重要。狀態檔案儲存基礎設施的當前狀態,供應商自動生成並由 Terraform 用於追蹤變更。組態檔案則以 HCL 語言描述期望的基礎設施狀態,包含資源定義、變數及資料來源。本文將以 VMware 虛擬機器佈署為例,逐步說明如何撰寫 Terraform 組態檔案。首先,需要組態提供者區塊,指定 VMware vSphere 的連線資訊,例如伺服器地址、帳號密碼等。接著,利用資料區塊取得既有資源資訊,例如資料中心、資源池、網路等。資源區塊則定義要建立的資源,例如虛擬機器,並設定其規格,例如 CPU、記憶體、磁碟大小等。此外,還可以使用變數來提升組態的彈性,並透過模組化管理提高程式碼的可重用性。透過妥善管理狀態檔案和撰寫清晰的組態檔案,可以有效地使用 Terraform 進行基礎設施的自動化管理和佈署。

Terraform 應用探討:狀態檔案與組態檔案

在前一章節中,我們已經介紹了 Terraform 供應商(Provider),它是一個外掛,讓 Terraform 能夠與特定服務提供者的 API 進行通訊。這使得 Terraform 可以輕鬆且高效地在相應平台上佈署和管理資源。每個平台都有其獨特的供應商,需要與 Terraform 組態檔案整合以管理該平台。

Terraform 狀態檔案

Terraform 生成狀態檔案來追蹤基礎架構的當前狀態。這個檔案是由供應商自動生成並直接從平台取得的,使用者無法直接影響它。狀態檔案描述了 Terraform 基礎架構的實際狀態,包括已生成資源的詳細資料、它們的當前狀態以及它們之間的關係。Terraform 使用狀態檔案來確定需要對基礎架構進行哪些修改以達到期望的狀態。當你執行 Terraform apply 時,Terraform 會檢查狀態檔案並將其與組態檔案進行比較,以確定需要進行哪些變更。

狀態檔案對於 Terraform 的運作至關重要,因為它用來追蹤基礎架構的狀態並維持組態與實際基礎架構之間的一致性。此外,狀態檔案還用於儲存敏感資訊,如密碼和存取金鑰,因此應該妥善儲存並不得在團隊成員之間分享。

保持狀態檔案更新

保持 Terraform 狀態檔案的更新和與基礎架構的一致性非常重要。這可以透過使用版本控制來追蹤組態檔案和狀態檔案的變更,以及定期執行 Terraform plan 來預覽 Terraform 將進行的變更來實作。

備份策略

作為基礎架構自動化工具,Terraform 提供了一種強大的方式來定義和管理基礎架構即程式碼。然而,正如任何複雜系統一樣,維護適當的備份策略以確保資料的可用性和完整性至關重要。對於 Terraform 而言,這意味著備份狀態檔案。

備份步驟

  1. 確定狀態檔案位置: 預設情況下,Terraform 將狀態檔案本地儲存在名為 Terraform.tfstate 的檔案中。但也可以使用 Amazon S3 或 HashiCorp 控制檯等服務將其遠端儲存。

  2. 使用版本控制: 您可以透過使用版本控制系統(如 Git)來追蹤組態檔案和狀態檔案的變更,從而確保您始終擁有最新版本。

  3. 定期執行 terraform plan: 這有助於預覽即將進行的變更,並在實際應用之前發現潛在問題。

  4. 安全儲存: 根據安全考量,應該將備份放置在安全位置且有適當的存取控制許可權。

  5. 加密保護: 您可以使用加密技術進一步保護狀態檔案不受未經授權存取。

  6. 保留版本歷史: 隨著基礎架構的變更,您可能需要回復到以前版本。因此建議保留狀態檔案備份歷史版本。

自動化備份

除了手動備份外,Terraform 還提供了內建功能來自動備份狀態檔案。這可以透過組態後端來自動儲存狀態快照來實作,並且可以根據您環境需求進行調整。

組態檔案及其不同部分

組態檔案是 Terraform 工作流程中的核心部分,定義了所管理基礎設施的期望狀態。這包括需要建立的資源、它們的組態設定以及任何依賴或關係。

組態檔案結構

組態檔案使用 HashiCorp 組態語言(HCL)編寫,並包含資源定義、變數和資料來源等元素。每個部分在基礎設施即程式碼正規化中都有其特定目的和重要性。

以下是不同部分簡要說明:

資源定義(Resource Definitions)
resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

內容解密:

  • resource:指定資源型別及名稱。
  • aws_instance:表示 AWS 上的一個 EC2 例項。
  • "example":為該資源指定一個唯一識別符。
  • ami:Amazon Machine Image (AMI) ID。
  • instance_type:例項型別。
資料來源(Data Sources)
data "aws_ami" "ubuntu" {
  most_recent = true
  owners      = ["099720109477"] # Canonical
}

內容解密:

  • data:表示這是一個資料來源。
  • "aws_ami":表示 AWS 上的一個 AMI 資料來源。
  • "ubuntu":為該資料來源指定唯一識別符。
  • most_recent = true:表示選擇最新的 AMI。
  • owners = ["099720109477"]:指定 AMI 的所有者 ID(Canonical)。
虛擬機器佈署範例

以下是 VMware VM佈署的一個範例:

provider "vsphere" {
  user           = "admin@vsphere.local"
  password       = "password"
  vsphere_server = "vcenter.example.com"
}

data "vsphere_datacenter" "dc" {
  name = "datacenter1"
}

data "vsphere_datastore" "datastore" {
  name          = "datastore1"
  datacenter_id = data.vsphere_datacenter.dc.id
}

data "vsphere_network" "network" {
  name          = "network1"
  datacenter_id = data.vsphere_datacenter.dc.id
}

resource "vsphere_virtual_machine" "vm" {
  name             = "terraform-vm"
  resource_pool_id = data.vsphere_resource_pool.pool.id
  datastore_id     = data.vsphere_datastore.datastore.id

  num_cpus = 2
  memory   = 1024
  guest_id = "otherGuest"

  network_interface {
    network_id   = data.vsphere_network.network.id
    adapter_type = "vmxnet3"
  }

  disk {
    label            = "disk0"
    size             = 20
    eagerly_scrapped = false
    thin_provisioned = true
  }
}

內容解密:

  • provider:提供 vsphere 認證及伺服器連線。
  • data
    • vsphere_datacenter:取得資料中心資訊。
    • vsphere_datastore:取得資料儲存資訊。
    • vsphere_network:取得網路資訊。
  • resource
    • "vsphere_virtual_machine":建立虛擬機器。
    • "vm":指定虛擬機器名稱及基本硬體設定(CPU、記憶體)。
    • "network_interface":網路介面設定。
    • "disk":磁碟設定。

提升可靠性及易維護性

透過瞭解及妥善管理 Terraform 的組態檔案和狀態檔案,我們能夠有效地運用 Terraform 檢視和維護所需基礎設施。此類別措施不僅能減少未預期事件對基礎設施造成影響的風險,還能讓我們及我們團隊更加安心地運作工作流程。

備份策略流程圖示

此圖示展示瞭如何確保 Terrafom 工作流程中備份策略之可靠性與易維護性:

  graph TD;
    C[C]
    F[F]
    J[J]
    A[開始] --> B[確認目標];
    B --> C{是否已啟用版本控制?};
    C -- 是 --> D[追蹤變更];
    C --否 --> E[啟用版本控制];
    D --> F{是否正常執行?};
    E --> F;
    F -- 是 --> G[預覽變更];
    F --否 --> H[解決錯誤];
    H --> F;
    G --> I[安全儲存];
    I --> J{是否加密?};
    J -- 是 --> K[繼續];
    J --否 --> L[加密];

L --> K;
K --> M[保留歷史紀錄];
M --> N[結束];

內容解密:

這張圖示清晰呈現了備份流程中各階段之邏輯關係:

  • 自「開始」開始確認目標並啟用版本控制機制。
  • 接著根據版本控制情況追蹤並預覽相關變更。
  • 安全儲存後再判斷是否加密處理以進一步提升安全性, 最後保留相關歷史紀錄後完成整個流程。

這樣一來我們能夠有效地確保備份策略之可靠性與易維護性, 從而提升整體工作效率與安全性。

探討 Terraform:以 VMware 佈署為例

在現代雲端與虛擬化環境中,Terraform 成為了一個強大的基礎設施即程式碼(Infrastructure as Code, IaC)工具,能夠自動化地管理和佈署資源。透過 Terraform,我們可以輕鬆地定義、組態和管理各種雲端與本地資源,如虛擬機器、網路、儲存等。以下,我們將探討 Terraform 的主要組態區塊,並以 VMware 的虛擬機器佈署為例進行具體說明。

提供者區塊

在 Terraform 中,提供者區塊用於定義將用來佈建資源的基礎設施提供者。這個區塊包含了提供者的名稱、版本及組態選項。提供者可以是雲端服務商如 AWS、Azure、Google Cloud Platform,也可以是其他基礎設施提供者如 VMware。

以下是一個使用 Terraform 佈署 VMware 虛擬機器時的提供者區塊範例:

terraform {
  required_providers {
    vsphere = {
      source  = "local/hashicorp/vsphere"
      version = "2.3.1" ## 檢查最新版本
    }
  }
}

provider "vsphere" {
  vsphere_server   = "<完全合格的網域名稱或 IP 地址>"
  user             = "administrator@vsphere.local"
  password         = "XXXX"
  allow_unverified_ssl = true
}

內容解密:

  • required_providers:定義了所需的提供者及其版本。這裡指定了 vsphere 提供者的來源及版本。
  • provider "vsphere":組態 VSphere 提供者的詳細資訊,包括 VSphere 伺服器的完全合格網域名稱或 IP 地址、使用者名稱及密碼。
  • allow_unverified_ssl:允許未驗證的 SSL 憑證連線。

資料區塊

資料區塊用於定義資料來源,這些資料來源提供唯讀存取外部資料,以幫助組態資源。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":定義了一個資料來源來取得指定資料中心的資訊。
  • data "vsphere_resource_pool":定義了一個資料來源來取得指定資源池的資訊。
  • data "vsphere_tag":定義了一個資料來源來取得指定標籤的資訊。
  • data "vsphere_folder":定義了一個資料來源來取得指定資料夾路徑的資訊。

資源區塊

資源區塊用於定義構成基礎設施的具體資源。這個區塊包含了資源型別、名稱及組態選項。每個資源定義對應於 Terraform 在基礎設施中建立、修改或刪除的實際資源。以下是一個使用 Terraform 組態 VMware 虛擬機器的範例:

resource "vsphere_virtual_machine" "vm_example" {
  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

  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      ="255.255.255.0"
      }
      ipv4_gateway       ="192.168.1.1"
    }
}

內容解密:

  • name:指定虛擬機器的名稱。
  • resource_pool_id:指定虛擬機器所在的資源池 ID。
  • datastore_id:指定虛擬機器所在的資料儲存 ID。
  • folder:指定虛擬機器所在的目錄路徑。
  • num_cpusmemory:組態虛擬機器的 CPU 數量和記憶體大小。
  • network_interface:組態虛擬機器的網路介面。
  • disk:組態虛擬機器的磁碟設定。
  • clonecustomize:組態從範本克隆虛擬機器時進行自定義設定。

單一模組處理(VMware VM)

  flowchart TD;
A[Resource Section] --> B[VM Configuration];
B --> C[CPU & Memory];
B --> D[Network Settings];
B --> E[Disk Settings];
C --> F["num_cpus"];
C --> G["memory"];
D --> H["network_interface"];
E --> I["disk"];

此圖示展示了在Terraform中組態VMware VM時,不同部分之間如何相互連結。

內容解密:

此圖示展示了Terraform中的VMware VM佈署步驟。從「Resource Section」開始,進一步分為「VM Configuration」、「CPU & Memory」、「Network Settings」和「Disk Settings」。每一部分都有詳細的設定專案,例如「num_cpus」、「memory」、「network_interface」和「disk」。

必要變數

變數區塊用於定義可以在整個組態檔案中使用的變數。變數可以包括字串、數字和布林值,並可用於向資源組態傳遞值。變數使得 Terraform 組態更加靈活和可重複使用。以下是一些常見變數範例:

variable "datacenter" {
  description = "VMware Vsphere 資料中心名稱"
}

variable "resource_pool" {
  description ="指定資料中心內叢集,例如 <ClusterName>/Resources"
}

variable "vm_name" {
 description ="需要分配給 Vcentre 的 VM 名稱"
}

variable "vm_cpu"{
 description ="需要分配給 VM 的 CPU 數量,例如1 或4 或8等"
}

variable "vm_memory"{
 description ="需要分配給 VM 的記憶體大小(MB),例如12288 MB ==12 GB RAM "
}

variable "datastore"{
 description ="VM 需要佈署到 VSphre 的資料儲存名稱 "
}

variable "disk_size"{description ="需要佈署磁碟大小(GB)"}
variable "network"{description ="需要分配網路名稱"}
variable "network_address"{description ="需要分配靜態 IP 地址"}
variable "network_address_subnetmask"{description ="子網路遮罩(CIDR 標記法),例如23 或24等"}
variable "network_address_gateway"{description ="子網指定閘道"}
variable "template_name"{description ="透過哪個 VM 範本克隆 VM "}
variable "computer_name"{description ="需要分配電腦名稱"}
variable skip_post_deploy{type=bool, description="啟用/停用後佈署任務(如 Salt bootstrap, DNS)",default=false}
variable environment_tag{description="Resource tags #Possible values: 'Development', 'Production', 'Qualification', 'Test'"}
variable vcentre_folder {description="VSphre 資料夾佈署 VM"}

內容解密:

  • 每個變數都有詳細描述說明它們在 Terraform 組態中的作用。
  • 「skip_post_deploy」是一個布林值變數,決定是否啟用後佈署任務。
  • 「environment_tag」則是標籤變數,可用於標識不同環境。

模組化管理

模組化管理是 Terraform 的一大特點,它使得我們能夠重複使用組態需求。模組允許我們將重複性高且獨立性強的組態抽象化出來,只需輸入特定值即可完成佈署。這不僅提高了效率,還減少了錯誤發生的可能性。

在實際應用中,我們會將上述所有組態合併到一個完整的 .tf 檔案中,並在需要時透過變數檔案進行調整。這樣不僅保證了組態的一致性,還能夠快速適應不同環境和需求。

透過以上對 Terraform 的探討及實際案例說明,希望能夠幫助讀者更好地理解和應用這項強大工具來自動化和管理基礎設施。