在使用 Terraform 管理雲端架構時,搞懂它的外掛運作方式很重要。當我們執行 terraform init 的時候,Terraform 會去特定的地方找外掛。這篇文章會詳細說明這些地方是哪裡,還有怎麼用反向工程技巧來產生設定檔。Terraform 尋找外掛的預設路徑包含 Terraform 安裝的路徑、自動下載的提供者外掛目錄 .terraform/plugins,以及使用者自訂的外掛目錄 ~/.terraform.d/plugins。這些路徑讓 Terraform 可以在不同環境下找到對應的外掛。版本控管方面,Terraform 會根據設定檔的版本限制來選擇合適的外掛版本,如果本地沒有,就會自動下載最新版。大多數雲端平台都有提供 API 讓開發者可以寫程式控制,Terraform 的提供者外掛就是利用這些 API 來做自動化管理。開發者要負責維護這些外掛,確保外掛能支援平台的最新功能。如果我們在反向工程的時候也用一樣的 API 函式庫,就能更有效率地產生設定檔。反向工程的模型化步驟,就是把從平台抓到的資訊轉換成通用的模型,這個模型可以用來設計新的系統或管理現有的系統。在模型化的過程中,定義設定檔裡的物件也很重要,這些物件包含了要從平台取得的引數。Terraform 的高手可以很快地找出這些必要的引數,然後寫進設定檔裡。每個 Terraform 提供者都會列出必要的物件和引數,開發者可以根據這些資訊來產生 HCL 或 JSON 格式的設定檔。

Terraform 外掛管理與反向工程模型

在使用 Terraform 進行基礎設施即程式碼(Infrastructure as Code, IaC)時,瞭解其外掛管理機制至關重要。當使用者執行 terraform init 指令時,Terraform 核心會在特定目錄中查詢外掛。以下將詳細說明這些目錄的用途以及如何透過反向工程模型來進行組態檔案的生成。

外掛查詢路徑

Terraform 在初始化時會查詢外掛的位置,這些位置可能是靜態路徑或相對於當前工作目錄的路徑。以下是 Terraform 預設查詢外掛的目錄:

  • Terraform 二進位制檔案所在地:例如 /usr/local/bin,這是典型的 Terraform 安裝位置。
  • 自動下載的 providers:位於 .terraform/plugins/<OS>_<ARCH>,這裡的 <OS><ARCH> 使用 Go 語言標準的作業系統和架構名稱,例如 ubuntu_amd64
  • 使用者外掛目錄:在大多數作業系統上為 ~/.terraform.d/plugins,而在 Windows 上為 %APPDATA%\terraform.d\plugins

第三方外掛應該安裝在使用者外掛目錄中。如果使用 terraform init -plugin-dir=<PATH> 選項,則會覆寫預設的外掛位置,僅搜尋指定的路徑。

外掛版本管理

在找到已安裝的外掛後,Terraform 會根據組態檔案中的版本限制來選擇適合的外掛版本:

  1. 如果已安裝適合版本:Terraform 會使用最新且符合限制的已安裝版本。
  2. 如果沒有安裝適合版本:對於由 HashiCorp 提供的 providers,Terraform 會從 releases.hashicorp.com 下載最新且符合限制的版本。

這些步驟確保了 Terraform 能夠在各種平台上正常執行。

平台客戶端函式庫

大多數現代平台都提供 API 函式庫,允許程式化與平台互動。Terraform 的 providers 應用這些客戶端函式庫來實作自動化互動。這些函式庫通常透過 HTTP(s) 協定與平台互動,因此任何具有 API 基礎管理能力的平台都可以提供 Terraform 整合。

開發者負責管理客戶端函式庫,並隨著客戶端函式庫的更新提供新的 provider 版本。這樣可以確保 provider 能夠支援最新的平台功能。

模型化反向工程

Terraform 依賴客戶端函式庫與目標平台互動。如果我們在反向工程模型中使用相同的函式庫來生成組態檔案,就可以實作高效的匯入操作。以下是如何透過模型化反向工程來實作這一點:

模型化

模型化是反向工程中的一個重要步驟,旨在將從目標平台提取的資訊轉化為一般模型。這個模型可以用來設計新系統。

例如,我們可以使用如下圖示來表示模型化過程:

  graph TD
    A[組態檔案/資源 (HCL 或 JSON)] --> B[平台對應的源頭真實]
    B --> C[匯入邏輯]
    C --> D[資料函式庫]
    C --> E[網路]
    C --> F[備份]
    C --> G[虛擬機器 (Compute)]
    C --> H[容器]
    C --> I[應用程式]
    C --> J[基礎設施資源]

此圖示展示了源頭真實與 Terraform 匯入之間的關係。當編寫匯入邏輯時,如果能夠利用與 Terraform 核心相同的「客戶端函式庫」,就可以生成需要匯入現有資源到 Terraform 的即時組態檔案。

標識物件

在模型化過程中,定義組態檔案中的物件是另一個重要步驟。這些物件包括必須從源頭真實中取得的引數列表。Terraform 的專家可以輕鬆識別出常見物件引數(必需和選擇性),並將其寫入組態檔案中。

每個 Terraform provider 都提供必需和選擇性物件列表,開發者可以根據這些列表來生成適當格式(HCL 或 JSON)的組態檔案。

利用 Terraform 進行逆向工程的流程與範例

在現代資訊科技中,Terraform 是一個強大的工具,能夠幫助我們自動化管理基礎設施。透過逆向工程,我們可以將現有的基礎設施資源匯入到 Terraform 中進行管理。這不僅提高了效率,還能確保資源的一致性和可重複性。

準備階段

首先,我們需要了解目標基礎設施中的物件,並收集這些物件的變數清單。這是一次性的操作,目的是為了將現有的基礎設施匯入到 Terraform 中進行管理。即使收集了一些多餘的物件變數,也不會是問題,因為這樣可以增加匯入成功的機會,減少 Terraform 應用預設值的情況。

評估與測試

在這個階段,我們需要定義逆向工程後的模型,識別組態檔案中的物件,並編寫一個匯入指令碼來代表組態檔案引數。這是逆向工程過程中的關鍵步驟,因為它確保整個過程能夠成功完成。以下是這個階段的一些具體步驟:

  1. 測試樣本匯入:對於我們想要使用 Terraform 管理的各種資源進行全面測試。
  2. 驗證匯入結果:使用 terraform plan 測試每次自動匯入,確保 Terraform 不會建議對基礎設施進行任何變更。如果 Terraform 建議變更,則表示匯入失敗,可能是缺少物件引數或組態檔案中未指定某些引數。
  3. 整合到更大的工作流程:如果我們的逆向工程過程是更大工作流程的一部分,則需要在更大的範圍內驗證這個過程,並解決任何問題。

實際範例:VMware 環境中的自動化匯入

假設我們有一個 VMware 環境,裡面有大量已經存在的虛擬機器(VM)。我們希望使用 Terraform 自動化管理這些 VM。以下是具體的步驟和範例:

準備工作

  1. 瞭解 VMware 的資源:首先,我們需要了解 VMware 環境中的虛擬機器資源。這些資源通常可以透過 VMware 的管理介面或 API 取得。
  2. 收集資源變數:收集所有需要的資源變數,這些變數將用於生成 Terraform 組態檔案。

編寫匯入指令碼

我們可以編寫一個 Python 指令碼來自動化這個過程。這個指令碼將從 vCenter MOB 取得虛擬機器的詳細資訊,並生成一個組態檔案。

import requests
import json

# vCenter 認證資訊
vcenter_url = "https://vcenter.example.com"
vcenter_user = "admin"
vcenter_password = "password"

# 接收虛擬機器名稱
vm_name = "example_vm"

# 取得虛擬機器詳細資訊
def get_vm_details(vm_name):
    url = f"{vcenter_url}/api/vcenter/vm/{vm_name}"
    response = requests.get(url, auth=(vcenter_user, vcenter_password))
    return response.json()

# 生成 HCL 組態檔案
def generate_hcl_config(vm_details):
    config = {
        "resource": {
            "vmware_virtual_machine": {
                vm_details["name"]: {
                    "name": vm_details["name"],
                    "resource_pool_id": vm_details["resource_pool"]["id"],
                    "datastore_id": vm_details["datastore"]["id"],
                    # 其他必要引數
                }
            }
        }
    }
    return json.dumps(config, indent=4)

# 主函式
def main():
    vm_details = get_vm_details(vm_name)
    hcl_config = generate_hcl_config(vm_details)
    with open("vm_config.hcl", "w") as file:
        file.write(hcl_config)

if __name__ == "__main__":
    main()

內容解密:

此段 Python 指令碼展示瞭如何從 vCenter MOB 取得虛擬機器詳細資訊並生成 HCL 組態檔案。

  1. 認證與請求:首先定義了 vCenter 的 URL 和認證資訊。使用 requests 模組傳送 GET 請求來取得虛擬機器詳細資訊。
  2. 解析資料:將接收到的 JSON 資料解析為 Python 字典。
  3. 生成組態檔案:根據解析出的資料生成 HCL 組態檔案。
  4. 儲存組態檔案:將生成的 HCL 組態檔案儲存到本地檔案中。

自動化建立快照組態檔案

瞭解如何將資源反向工程至 Terraform 後,我們來看看一個典型的 VMware 虛擬機器(VM)組態檔案。這個檔案包含了匯入 VMware VM 所需的必要和選擇性引數。

組態檔案的主要部分

組態檔案中有多個部分,以下是每個部分的簡要說明:

提供者(Provider)

提供者部分指定了我們將管理資源的基礎設施。在 VMware 的例子中,提供者是 vSphere。由於 Terraform 不斷對與基礎設施互動的程式碼進行修訂,因此必須使用正確版本的提供者。以下是 JSON 格式的範例程式碼:

{
  "terraform": {
    "required_providers": {
      "vsphere": {
        "source": "local/hashicorp/vsphere",
        "version": "2.3.1"
      }
    }
  },

這裡的 "source": "local/hashicorp/vsphere" 告訴 Terraform 使用本地安裝的提供者版本(2.3.1)。

提供者詳細資料

組態檔案中需要基礎設施平台的詳細資料,以便 Terraform 能夠連線並管理指定平台上的資源。不同提供者有不同的引數,每個提供者都需要驗證您的特定平台。以下是 JSON 格式的範例程式碼:

"provider": {
  "vsphere": {
    "vsphere_server": "xx.xx.xx.xx",
    "user": "user@domain",
    "password": "xxxx",
    "allow_unverified_ssl": true
  }
},

這些引數包括 vSphere 伺服器的 IP 地址、使用者名稱、密碼以及是否允許未驗證的 SSL。

資料部分(Data Section)

資料部分定義了外部額外資源,我們的核心資源將在此基礎上建立。例如,建立或修改 VM 時,資料區塊需要儲存函式庫詳細資料、VM 網路詳細資料等。以下是 JSON 格式的範例程式碼:

"data": {
  "vsphere_datacenter": {
    "dc": {
      "name": "XXX-YourDatacentername-XXX"
    }
  },
  "vsphere_resource_pool": {
    "pool": {
      "name": "<Cluster>/Resources",
      "datacenter_id": "${data.vsphere_datacenter.dc.id}"
    }
  },
  "vsphere_datastore": {
    "datastore": {
      "name": "<Datastore name where VM resides>",
      "datacenter_id": "${data.vsphere_datacenter.dc.id}"
    }
  },
  "vsphere_network": {
    "network0": {
      "name": "VM Network",
      "datacenter_id": "${data.vsphere_datacenter.dc.id}"
    }
  }
}

這些資料部分定義了資料中心、資源池、儲存函式庫和網路等必要的外部資源。

自動化匯入指令碼

匯入指令碼是一種小邏輯軟體,其功能是從一個平台取得詳細資訊並將資訊填充到輸出檔案中。就像其他自動化邏輯一樣,這個匯入指令碼也有依賴性。

Terraform 提供者版本

Terraform 提供者為 Terraform 必要內容與目標基礎設施平台之間建立互動媒介。Terraform社群不斷改進它們的提供者,這可能會導致某些引數值或名稱被新增、修改或移除。因此,為了保持一致性,建議保持提供者版本固定。如果需要更新提供者版本,應該按照反向工程中的「審查」階段來確保匯入邏輯與新版本相符。

基礎設施平台變更

平台上的變更可能會影響到物件及其值。例如,當升級 vCenter 版本時,可能會影響到它在資料函式庫中的物件和值。因此,在進行平台升級時,應該按照反向工程中的「審查」階段來確保匯入邏輯與新版本相符。

常見使用情境

以下是一些常見使用情境:

  • 手動消費:輸出組態檔案可以由 IT 處理人員手動消費,進而使用 Terraform 做應用程式管理。
  • 版本控制:輸出組態檔案可以提交到 DevOps 或 GitHub 儲存函式庫中,供直接消費。
  • DevOps Pipeline:輸出結果可以直接餵入 DevOps Pipeline中,進行進一步自動化管理。
次段落標題
小段落標題

玄貓強制要求內容必須以台灣技術社群經常使用之語言及表達方式書寫

小段落標題

每一行以上述規範內容重寫完成