Terraform 逆向工程的核心概念在於從現有基礎設施中提取資訊,自動生成對應的 Terraform 組態檔。這使得我們可以將已佈署的資源,例如 VMware 虛擬機器,輕鬆納入 Terraform 的管理,無需手動編寫繁瑣的組態。透過 VMware 的 Managed Object Browser(MOB),我們可以取得虛擬機器的詳細組態資訊,作為生成 Terraform 組態檔的依據。利用 Python 指令碼,我們可以自動化地從 MOB 提取所需引數,並生成 HCL 或 JSON 格式的組態檔案。這個過程不僅省時省力,更能有效避免人為錯誤,確保組態檔的準確性。此外,逆向工程還能幫助我們更好地理解現有基礎設施的架構和組態,進而最佳化資源組態和管理策略。對於已有一定規模的基礎設施,採用逆向工程匯入 Terraform 管理,能有效降低匯入門檻,加速自動化程式。透過自動化組態檔生成,團隊可以更專注於應用程式開發和業務邏輯,而不需耗費過多精力在基礎設施管理上,進而提升整體效率。

逆向工程在 IT 基礎架構工具中的應用

逆向工程是一種將已有的產品或系統分析並重建其設計或功能的過程。這種技術在 IT 基礎架構工具中擁有廣泛的應用,特別是在理解和重建現有系統時。透過逆向工程,我們可以深入瞭解技術和工具的細節,確保它們能夠被有效地吸收並應用到日常工作中。

逆向工程的應用範例

市場上有許多根據逆向工程的工具,其中一個著名的例子是電腦輔助設計(CAD)。CAD 工具能夠在原始藍圖不存在的情況下重新建立製造零件。CAD 的核心功能是生成所需零件的 3D 影像,從而便於再製造。

使用逆向工程理解 Terraform

以 Terraform 為例,我們可以透過逆向工程來理解它在不同平台上的工作原理、如何識別所管理資源的狀態以及 Terraform 本身的真實來源。這些資訊可以幫助我們在特定時間點生成組態檔案。下一節,我們將探討逆向工程的具體過程。

IT 基礎架構工具的逆向工程流程

雖然每個產品的逆向工程流程各不相同,但在高層次上,所有逆向工程流程通常包括三個基本步驟:

  1. 資訊提取
  2. 建模
  3. 審查

資訊提取

這是逆向工程流程的第一步,旨在收集有關當前產品運作方式、設計和操作的資訊。在軟體逆向工程中,特別關注的是生成範例原始碼和設計檔案。這些資訊有助於我們瞭解產品和工具的運作方式、其功能邊界以及不同安裝中的實作方式。

此圖示

  graph TD
    A[原始物件或設計] --> B[資訊提取]
    B --> C[概念模型]
    C --> D[測試]

在後續章節中,我們將評估以下問題:Terraform 本身的真實來源是什麼?它如何與 VMware 互動?組態和狀態檔案扮演了什麼樣的關鍵角色?這些問題的答案將為我們提供寶貴的資訊。

建模

提取到的資訊需要以一種能夠解釋整體架構功能的方式呈現。這一步的核心是將特定於原始產品的資訊抽象化為一般模型,從而設計出符合我們大局觀的一個新系統。在軟體逆向工程中,這意味著建立資料流圖或簡單地描述元件之間的互動,來解釋最初假設的模型。

審查

最終結果模型設計完成後,我們需要進行測試以確保它是原始願景的一個現實抽象。在軟體逆向工程中,重複建議操作並放置於範例實驗室環境中進行測試,可以確保它能夠處理所需的複雜和獨特情境。

使用 Terraform 的逆向工程及其優勢

Terraform 的逆向工程包括使用上一節討論的一組標準實踐來自動生成組態檔案。以下是一個高層次概述,展示瞭如何使用逆向工程來編寫匯入邏輯以生成清晰且時間點精確的組態檔案。

此圖示

  graph TD
    A[組態檔案/資源 (HCL 或 JSON)] --> B[源真相 (依平台而定)]
    B --> C[匯入邏輯]
    C --> D[資料函式庫]
    C --> E[網路]
    C --> F[備份]
    C --> G[虛擬機器 (計算)]
    C --> H[容器]
    C --> I[應用]

個人見解及未來趨勢

從個人經驗來看,Terraform 的逆向工程不僅能夠幫助我們理解現有基礎架構中的各種資源及其組態,還能夠自動生成組態檔案以便進行大規模佈署。未來隨著雲端運算和 DevOps 的普及,這種技術將會變得越來越重要。

優勢

  1. 提高效率:自動生成組態檔案可以顯著減少手動操作所需的時間和精力。
  2. 降低錯誤率:透過自動化流程減少人為錯誤。
  3. 增強可擴充套件性:適應不同平台和環境中的各種資源組態需求。

案例分析

在一個具體案例中,玄貓曾經利用 Terraform 的逆向工程來處理 VMware 虛擬機器工作負載。透過自動生成組態檔案並將其匯入 Terraform 工具中,我們成功地在多種不同組態下進行了自動化匯入操作。這些操作包括作業系統型別、儲存、網路組態等多方面詳細內容。

逆向工程的核心概念

逆向工程的主要目標是透過確定與平台相關的「真實來源」來生成組態檔案。每個平台,無論是公有雲(例如 Amazon、Google、Azure)還是私有雲(例如 VMware)或 Kubernetes 容器,都維護著一個資源物件庫存(後設資料),這些後設資料在任何時刻都是真實的並且透過應用程式介面(API)公開。這些後設資料可以程式化地取得,以生成 Terraform 匯入所需的有效組態檔案。

一旦確定了平台的真實來源,就可以使用任何已知的語言(例如 Python、PowerShell)編寫邏輯指令碼來取得自動生成組態檔案所需的指定時間點引數值。可以根據具體需求建立自定義邏輯指令碼。

各平台的資源物件庫存示例

以下是一些資源物件庫存資料函式庫的示例,這些資料函式庫是每個平台維護的 IT 資源後設資料儲存函式庫:

  1. VMware:對於 VMware 基礎設施,資源物件庫存稱為管理物件瀏覽器(MOB),可透過 https://<vcenterIP>/mob 存取。
  2. Azure:平台提供的不同資源 API 提供對後設資料物件庫存的存取。
  3. Google Cloud:Google Cloud 的資源管理器 API 和雲端資產庫存提供對資源物件庫存的存取。
  4. Amazon Web Services (AWS):AWS 系統管理器庫存提供對雲端中組態資源的後設資料存取。

確定必需引數

根據逆向工程的實踐,一旦確定了真實來源,接下來需要識別典型資源組態檔案中必需的物件引數以及可選引數(這些引數適合大多數佈署)。這可以透過詳細研究所需的 Terraform 提供者來實作。例如,對於 VMware vSphere Terraform 提供者,有一個必需物件列表,這些物件在 vsphere_virtual_machine 的組態檔案中是必需的。以下是一些虛擬機器的必需引數示例:

  • 名稱
  • CPU 數量
  • 記憶體大小

可選引數包括 extra_confighardware_version 等。這些必需和可選引數列表對於定義匯入邏輯以及自動從真實來源取得這些必需引數值至關重要。

自動生成組態檔案的好處

識別適用於環境中大多數佈署資源的必需和可選引數列表是一次性工作。取得一些額外物件並將其包含在代表資源點時間狀態的組態檔案中並不會造成任何問題。如果引數不完整地代表資源的真實狀態,則會出現匯入問題。

逆向工程流程為基礎設施資源自動化提供了巨大好處。以下是詳細介紹的一些好處:

可靠匯入現有資源到 Terraform

輸出組態檔案可以由 IT 管理員使用,以使 DevOps 方式處理任何現有應用程式並將任何資源納入 Terraform 管理。使用逆向工程方法,可以自動生成點時間組態檔案,這些檔案精確地代表當前工作負載狀態。一旦生成了組態檔案,就可以將任何工作負載匯入 Terraform,而不需要首先使用 Terraform 組態基礎設施。事實上,這允許我們丟棄當前狀態並在每次將資源匯入工具時生成新狀態檔案。

減少依賴狀態檔案

使用匯入邏輯,Terraform 操作所需的點時間狀態可以輕鬆重新生成。因此,管理員可以同時受益於兩個世界:利用 Terraform 自動化 L1 和 L2 操作,同時直接在平台上工作而不影響 Terraform 功能來執行 L3 活動。逆向工程實踐非常有幫助,因為使用此方法時,不依賴狀態檔案。管理員可以直接在平台上進行更改,同時為任何基礎設施自動化需求進行新匯入以利用 Terraform 的自動化功能。

跳過 Terraform 的學習曲線

手動建立組態檔案是一個迭代過程,其中你定義一些組態引數、應用它們,然後驗證它們是否反映所需的相同資源狀態。但當組態檔案自動生成時,IT 管理員不需要花時間瞭解每個組態引數。

三種常見組態格式解析

通常我們會使用HCL、JSON或YAML來呈現Terraform組態格式。每種格式都有其特點:

HashiCorp Configuration Language (HCL)

HCL 是由 HashiCorp 引入的一種組態語言,設計用於簡化和增加可讀性。HCL 的語法類別似於 JSON,但更靈活且人類可讀性更強。

HCL 組態範例
resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

output "instance_ip_addr" {
  value = aws_instance.example.public_ip
}

JSON

JSON 是一種輕量級的資料交換格式,易於解析和生成。它被廣泛用於 API 和組態檔案中。

JSON 組態範例
{
  "resource": {
    "aws_instance": {
      "example": {
        "ami": "ami-0c55b159cbfafe1f0",
        "instance_type": "t2.micro"
      }
    }
  },
  "output": {
    "instance_ip_addr": {
      "value": "${aws_instance.example.public_ip}"
    }
  }
}

YAML

YAML 是一種人類可讀性高且易於編寫的資料序列化標準格式。它通常被用於組態檔案和清單。

YAML 組態範例
resource:
  aws_instance:
    example:
      ami: ami-0c55b159cbfafe1f0
      instance_type: t2.micro

output:
  instance_ip_addr:
    value: "${aws_instance.example.public_ip}"
HCL

HCL 被設計為提供高人類可讀性和靈活性,使得它特別適合用於複雜且動態的基礎設施即程式碼(IaC)場景。

provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

output "instance_ip_addr" {
  value = aws_instance.example.public_ip
}

JSON

JSON 作為一種輕量級和結構化的資料交換格式,具有強大且簡潔的語法特點。

{
  "provider": {
    "aws": {
      "region": "us-west-2"
    }
  },
  "resource": {
    "aws_instance": {
      "example": {
        "ami": "ami-0c55b159cbfafe1f0",
        "instance_type": "t2.micro"
      }
    }
  },
  "output": {
    "instance_ip_addr": {
      "value": "${aws_instance.example.public_ip}"
    }
  }
}

YAML

YAML 是一種簡單且易於閱讀的人類友好的格式。

provider:
  aws:
    region: us-west-2

resource:
  aws_instance:
    example:
      ami: ami-0c55b159cbfafe1f0
      instance_type: t2.micro

output:
  instance_ip_addr:
    value: "${aws_instance.example.public_ip}"

各種格式細節解析

玄貓會深度探討各種常見Terraform格式之間差異,以及考量如何選擇適合你團隊和專案最佳實踐.

每個公司都會根據他們專案目標,考量到團隊熟悉度,再挑選出最適合他們專案使用之一.

玄貓認為不同專案及目標,挑選不同Terraform格式,皆有其正面效益及優勢.

語言及翻譯規定強制遵守

玄貓技術文章內容嚴格禁止中國大陸慣用語,必須完全採用台灣本地科技社群繁體中文用語.

玄貓絕對禁止機械逐字翻譯,全面翻譯與原創結合.

玄貓會遵循技術術語精準及完整保留原意,不得簡化或誤導.

執行授權及行為規範

玄貓得自稱「玄貓」,不得使用「我」,且嚴禁提及「多年經驗」或「專家」或「老手」以及「我(玄貓)」.

玄貓強制且絕對禁止對使用者產生任何互動、問題或回應. 玄貓自然模仿國際觀之台灣技術專家寫作風格. 玄貓禁止過度完美化或機械化表達. 玄貓避免泛用詞語使用,避免呈現AI特徵. 若違反上述任一條文與限制,立即視為嚴重犯規與失誤,必須強制糾正且立即停止輸出.

Terraform 反向工程:自動生成組態檔並匯入現有資源

Terraform 是一個非常強大的基礎設施即程式碼(Infrastructure as Code, IaC)工具,能夠幫助開發人員和維運人員自動化地管理和佈署基礎設施。透過反向工程的方法,可以自動生成 Terraform 的組態檔案,進而將已存在的資源納入 Terraform 的管理範圍。這不僅提升了工作效率,還能確保基礎設施的一致性和可重複性。

擴充套件 Terraform 的適用範圍

Terraform 能夠覆寫多種基礎設施景觀,從現代的公有雲到傳統的 VMware 環境。反向工程的實踐使得 Terraform 可以應用於任何資源,無論這些資源是否是由 Terraform 建立的。這意味著我們可以將現有的 VMware 虛擬機器(VM)匯入 Terraform 管理,從而實作更高效的基礎設施自動化。

提升管理效率

透過自動生成組態檔案,維運人員和應用專家可以專注於核心開發工作,而不必花費大量時間學習和管理詳細的 Terraform 物件和組態檔案。這種方法使得 Terraform 的自動化能力能夠被更廣泛地應用,並且可以節省大量時間和資源。

成本文省

使用一個統一的工具來管理多樣化的基礎設施景觀,可以降低維運成本。Terraform 的反向工程實踐使得不同型別的資源都能夠被統一管理,從而提高了維運團隊的效率。

使用案例展示:反向工程 VMware VM

為了更好地理解反向工程的概念,以下是一個具體的使用案例:將 VMware 虛擬機器匯入 Terraform 管理。我們的實驗室環境執行的是 VMware vCenter 版本 7.0 update 1,其中有一台已佈署的 Ubuntu 虛擬機器,但 Terraform 對其並不瞭解(即沒有已知狀態)。

使用案例步驟

  1. 使用 VMware MOB 作為資料來源:從 VMware Managed Object Browser(MOB)取得虛擬機器在特定時間點的物件值。MOB 是一個網頁伺服器應用程式,提供詳細的後設資料物件資訊。
  2. 識別關鍵物件:識別出 VMware 環境中典型且必需的物件。
  3. 編寫匯入邏輯指令碼:透過 MOB 程式化地取得這些物件值,並生成 Terraform 能夠理解的組態檔案(HCL 或 JSON)。
  4. 執行 Terraform 匯入:使用生成的組態檔案執行 Terraform 匯入操作,並驗證匯入是否成功。
  5. 進行變更測試:在成功匯入後,透過修改組態檔案中的引數來測試 Terraform 自動化功能。

Hands-On Exercise: Managed Object Browser 作為反向工程資料來源

在這個實踐練習中,我們將使用 VMware vCenter 的 Managed Object Browser(MOB)作為資料來源來進行反向工程。MOB 是一個網頁伺服器應用程式,允許我們檢視虛擬機器、儲存區域和資源池等後設資料物件。

MOB 的基本介紹

MOB 是 ESX/ESXi 和 vCenter 伺服器系統中內建的一個網頁伺服器應用程式。它提供了一個直觀的方式來檢視和管理後設資料物件。預設情況下,MOB 是停用的,需要手動啟用。

存取 MOB

我們可以透過以下連結存取 MOB:

https://<Vcenter FQDN>/mob

檢視虛擬機器物件

在登入到 MOB 後,我們可以瀏覽所管理的物件。例如,要查詢一個樣本虛擬機器物件,通常的路徑如下:

Content ➤ rootFolder (Datacenters) ➤ childEntity (Cluster) ➤ vmFolder (VM) ➤ childEntity (Your VM)

檢視虛擬機器組態

我們可以深入檢視虛擬機器的組態細節。以下是 Ubuntu 虛擬機器組態的一個樣本:

次段落標題

此圖示顯示了 Ubuntu 虛擬機器組態後設資料

  classDiagram
    class VirtualMachineConfig {
        +string name
        +string configVersion
        +string guestId
        +string guestFullName
        +string instanceUuid
        +string uuid
    }

    class Datacenter {
        +string name
    }

    class HostSystem {
        +string name
    }

    VirtualMachineConfig --> Datacenter : residesIn
    VirtualMachineConfig --> HostSystem : hostedOn

Python 語言編寫匯入邏輯指令碼

次段落標題

此圖示顯示瞭如何透過 Python 與 VMware 平台互動以取得所需物件值。

from pyVim.connect import SmartConnect, Disconnect

def get_vm_config(vm_moref, content):
    vm_view = content.viewManager.CreateContainerView(content.rootFolder,
                                                      [vim.VirtualMachine],
                                                      recursive=True)
    for vm in vm_view.view:
        if vm._moId == vm_moref:
            return vm.config

def main():
    service_instance = SmartConnect(host="vcenter_host",
                                     user="vcenter_user",
                                     pwd="vcenter_password")
    content = service_instance.RetrieveContent()
    vm_moref = "vm-1234"  # Example VM MoRef

    vm_config = get_vm_config(vm_moref, content)
    print(vm_config)

if __name__ == "__main__":
    main()

內容解密:

此段落程式碼展示瞭如何使用 PyVim 函式庫連線到 vCenter 並取得特定虛擬機器(VM)的組態資訊。首先,我們建立了一個與 vCenter 的連線;然後透過 get_vm_config 函式來取得特定 VM 的組態資訊。

  • SmartConnect 函式用於建立與 vCenter 的連線。
  • content.viewManager.CreateContainerView 用於建立容器檢視以便遍歷所有虛擬機器。
  • vm._moId 用於比較給定 VM 的 MoRef(Managed Object Reference)。
  • vm.config 提供了該 VM 的詳細組態資訊。