現今混合雲架構日益普及,管理不同平台上的基礎設施成為一大挑戰。Terraform 作為一款熱門的基礎設施即程式碼工具,能有效管理多種雲端和本地資源,然而,將現有資源匯入 Terraform 卻常因繁瑣的組態檔撰寫而受阻。本文介紹的反向工程方法,能自動從 VMware vCenter 提取虛擬機器資訊,生成對應的 Terraform 組態檔,從而簡化匯入流程,並實作自動化管理。透過與 vSphere 管理物件瀏覽器(MOB)互動,我們可以取得虛擬機器的各項引數,包含 CPU、記憶體、網路設定等,並將這些資訊轉換為 Terraform 可讀的 HCL 或 JSON 格式。此方法能有效降低手動組態的錯誤率,並減少學習 Terraform 的時間成本,讓工程師更專注於應用程式開發與佈署。此外,自動生成的組態檔也能確保與實際環境一致,方便後續的版本控制和自動化更新。
反向工程:Terraform 之生成組態檔
反向工程的核心目標是透過確定平台的「真實來源」來生成組態檔。無論是公有雲(例如 Amazon、Google、Azure)還是私有雲(例如 VMware)或 Kubernetes 容器,每個平台都會維護一個資源物件庫存(後設資料),這些後設資料在任何時間點都是真實且可透過應用程式程式設計介面(API)存取。這些後設資料可以透過程式碼自動取得,用於生成 Terraform 匯入所需的有效組態檔。
確定真實來源
當平台的真實來源已知後,可以使用任何已知的語言(例如 Python、PowerShell)撰寫邏輯指令碼來取得所需的時間點引數值,以自動生成組態檔。這些指令碼可以根據自訂邏輯進行建立。
以下是一些資源物件庫存資料函式庫的範例,這些資料函式庫是每個平台維護的 IT 資源後設資料的倉函式庫:
- VMware:對於 VMware 基礎設施,資源物件庫存稱為受控物件瀏覽器(MOB),可透過
https://<vcenterIP>/mob存取。 - Azure:平台提供的不同資源 API 提供對後設資料物件庫存的存取。
- Google Cloud:Google Cloud 的資源管理器 API 和雲端資產庫存提供對資源物件庫存的存取。
- Amazon Web Services (AWS):AWS 系統管理員庫存提供了雲端組態資源的後設資料存取。
一旦確定了平台的真實來源,就可以撰寫邏輯指令碼來取得所需物件的值,以便將資源清潔地匯入 Terraform。
必要與選擇性引數
根據反向工程的做法,一旦確定了真實來源,接下來需要識別一個典型資源組態檔所需的必要物件引數以及選擇性引數(適合大多數佈署)。這可以透過深入研究所需的 Terraform 提供者來完成。例如,對於 VMware vSphere Terraform 提供者,有列出必要物件以管理典型 vsphere_virtual_machine 的組態檔。詳細引數列表請參考 VSphere 提供者範例。
以下是虛擬機器的一些必要引數範例:
- 名稱
- CPU 數量
- 記憶體
選擇性引數包括 extra_config、hardware_version 等。
這些必要和選擇性引數的列表對於定義匯入邏輯和自動從真實來源取得這些必要引數值至關重要。
自動生成組態檔案
識別適用於環境中大多數佈署資源的必要和選擇性引數是一次性任務。取得一些額外物件並將它們包含在代表資源在特定時間點狀態的組態檔中並無不可。然而,如果缺少代表資源真實狀態的完整引數,則可能會出現匯入問題。
自動生成組態檔案的好處
反向工程流程為基礎設施資源提供了顯著好處以啟用自動化。讓我們詳細討論這些好處。
可靠地將現有資源匯入 Terraform
輸出組態檔案可供 IT 管理員使用,以採用 DevOps 方式處理任何現有應用程式並將任何資源納入 Terraform 管理。使用反向工程方法,可以自動生成代表當前工作負載狀態的時間點組態檔案。一旦生成了組態檔案,就可以在不先用 Terraform 組態基礎設施的情況下將任何工作負載匯入 Terraform。事實上,這使我們能夠丟棄當前狀態並每次匯入資源到工具時生成新狀態檔案。
減少對狀態檔案的依賴
使用匯入邏輯,可以輕鬆重新生成 Terraform 操作所需的資源時間點狀態。因此,管理員可以同時從兩個世界中受益:使用 Terraform 自動化 L1 和 L2 操作。同時,他們可以直接在平台上工作而不影響 Terraform 的功能來進行需要直接在平台上執行的 L3 活動。反向工程做法很有幫助,因為使用這種方法,你完全不依賴狀態檔案。管理員可以直接在平台上進行更改,同時為任何基礎設施自動化需求執行新匯入以利用 Terraform 的自動化功能。
跳過 Terraform 學習曲線
手動建立組態檔案是一個迭代過程:定義一些組態引數、應用它們並驗證它們是否反映出相同所需狀態。然而,當組態檔案自動生成時,IT 管理員不必花時間嘗試理解每個細節。
# Python 指令碼範例
import requests
def fetch_vmware_metadata(vcenter_ip, username, password):
url = f"https://{vcenter_ip}/mob"
response = requests.get(url, auth=(username, password))
return response.json()
# 輸出示例
metadata = fetch_vmware_metadata('vcenter.example.com', 'admin', 'password')
print(metadata)
內容解密:
以上範例展示了一個簡單的 Python 指令碼來從 VMware 平台取得虛擬機器後設資料。此指令碼首先設定 API 的 URL 與認證資訊;然後傳送 HTTP GET 請求並傳回 JSON 格式之後設資料。 此範例中提到 API URL 與認證資訊應根據您實際環境設定;此外此範例僅展示基本 GET 請求方式且沒有處理錯誤與網路連線問題。
graph TD;
A[VMware 平台] --> B[API URL];
B --> C[認證資訊];
C --> D[HTTP GET 請求];
D --> E[傳回 JSON 後設資料];
此圖示展示了從 VMware 平台取得後設資料的一系列步驟。從平台開始進入 API URL 和認證資訊階段;隨後傳送 HTTP GET 請求並傳回 JSON 後設資料。
反向工程方法可幫助我們在未經培訓情況下快速掌握 Terraform 自動化技術;並且減少學習曲線與培訓時間。
VMware 虛擬機器反向工程與 Terraform 自動化
反向工程的好處
反向工程可以自動生成 Terraform 的組態檔案,這些檔案包含所有管理資源所需的引數。這項技術可以由一群 Terraform 專家來撰寫,並與大量的管理員和應用程式專家分享,讓他們能夠利用 Terraform 的自動化功能。這樣一來,管理員和應用程式專家就可以專注於核心開發工作,而不需要花費時間學習詳細的 Terraform 物件和組態檔案來管理佈署。
此外,Terraform 具有覆寫各種基礎設施景觀的能力,自動生成組態檔案讓管理員能夠更容易地適應不同的基礎設施自動化需求。無論平台是現代的(如公有雲)還是傳統的(如 VMware 虛擬機器),這種反向工程實踐都允許使用 Terraform 來管理任何資源,無論它是否是使用 Terraform 建立的。
這種方法還能節省成本,因為它允許使用一個共同的工具來管理多樣化的基礎設施景觀,並且只需要一個共同的團隊來操作。玄貓將在下一節介紹一個範例案例,以強化對反向工程的理解。這裡開發的方法論可以輕鬆地在其他平台上重複使用,以幫助進行自動化。
範例案例:反向工程 VMware 虛擬機器
玄貓將在接下來的章節中展示如何利用反向工程實踐,對 VMware 平台上的虛擬機器進行自動化匯入。這個實驗環境執行的是 VMware vCenter 版本 7.0 update 1,其中有一台佈署好的 Ubuntu 機器,而 Terraform 尚未知曉此機器的狀態。
此範例案例包含以下步驟:
- 使用 VMware MOB 作為真實資料來源,取得虛擬機器物件在特定時間點的值。
- 識別典型 VMware 環境中必須和可選物件。這些物件對於反向工程方法至關重要。
- 撰寫匯入邏輯指令碼,以從 MOB 中程式化地取得這些物件值並建立指定格式(HCL 或 JSON)的檔案,Terraform 能夠理解該檔案。
- 使用組態檔案進行 Terraform 匯入並驗證匯入是否成功。
- 在成功匯入後,透過修改組態檔案中的引數來改變虛擬機器的狀態,以利用 Terraform 自動化。
必備條件
在進入實作練習之前,需要具備以下基本知識:
- 中級 Python 語言知識以及相關函式庫操作能力
- 中級 VMware 虛擬化知識
- 對 Terraform 的瞭解
虛擬機器管理物件瀏覽器(MOB)
虛擬機器管理物件瀏覽器(MOB)是一個網頁伺服器應用程式,可在所有 ESX/ESXi 和 vCenter 伺服器系統中找到。這個 vSphere 工具允許檢視虛擬機器、資料儲存和資源池等後設資料物件的詳細資訊。預設情況下 MOB 是停用的,需要手動啟用。通常可以透過以下連結存取 MOB:https://
登入後會看到一個類別似於圖 3-5 的登入頁面。可以瀏覽 vCenter 中所管理的任何物件。例如,要查詢一個樣本 VM 物件,典型位置如下:Content ➤ rootFolder (Datacenters) ➤ childEntity (Cluster) ➤ vmFolder (VM) ➤ childEntity (Your VM)。
圖 3-6 展示了透過 MOB 檢視樣本虛擬機器後設資料時的一個例子。可以進一步深入檢視 “config” 來檢視樣本虛擬機器所需匯入的更多詳細資訊。
圖 3-7 展示了我們 Ubuntu 虛擬機器的一些組態後設資料。仔細觀察圖中的屬性會發現其中許多屬性都是典型組態檔中必要引數。
Python 指令碼範例
以下是一些樣本 Python 語法範例:
import requests
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
# 建立連線至 vCenter
si = SmartConnect(host="vcenter.example.com",
user="your_username",
pwd="your_password")
# 搜尋特定虛擬機器
vm_name = "Your_VM_Name"
vm = None
for datacenter in si.content.rootFolder.childEntity:
for vm_folder in datacenter.vmFolder.childEntity:
for vm_object in vm_folder.childEntity:
if vm_object.name == vm_name:
vm = vm_object
break
# 提取虛擬機器組態
config = vm.config
print(config)
內容解密:
上述 Python 指令碼展示瞭如何連線到 vCenter 並搜尋特定名稱的虛擬機器。首先,透過 SmartConnect 函式建立連線至 vCenter。然後遍歷所有資料中心、虛擬機器資料夾和虛擬機器物件來搜尋目標虛擬機器。找到目標虛擬機器後,提取其組態資訊並列印預出來。
這段指令碼展示瞭如何與 VMware 平台進行程式化互動以取得所需資料。這樣就可以將實際運作中的值從 MOB 中提取出來每次讓 Terraform 操控我們的虛擬機器時都能利用最新資料。
自動化流程圖表
此圖示展示了反向工程 VMware 虛擬機器到 Terraform 的自動化流程:
graph TD;
C[C]
H[H]
A[開始] --> B[連線到 vCenter];
B --> C{查詢目標虛擬機器};
C -- 是 --> D[提取虛擬機器組態];
C -- 否 --> E[重新查詢];
D --> F[生成 HCL/JSON 組態檔案];
F --> G[Teraform 匯入];
G --> H{驗證匯入};
H -- 成功 --> I[修改引數進行自動化操作];
H -- 不成功 --> J[重新生成組態檔案];
此圖示解說:
- 開始:流程開始。
- 連線到 vCenter:使用 Python 指令碼連線到 vCenter。
- 查詢目標虛擬機器:查詢特定名稱或 ID 的虛擬機器。
- 提取虛擬機器組態:如果找到目標虛擬機器則提取其組態資訊。
- 生成 HCL/JSON 組態檔案:將提取到的組態資訊轉換為 Terraform 能夠理解的格式。
- Terraform 匯入:使用生成的組態檔案進行 Terraform 匯入操作。
- 驗證匯入:驗證匯入是否成功。
- 修改引數進行自動化操作:如果匯入成功則可以進一步修改引數進行自動化操作;如果不成功則重新生成組態檔案並重複上述步驟。
透過上述步驟和流程圖表展示瞭如何利用反向工程將 VMware 虛擬機器整合到 Terraform 自動化系統中,讓管理員能夠更高效地管理和操控基礎設施資源。
透過 VMware 管理物件瀏覽器反向工程取得虛擬機器組態
環境設定與必要套件安裝
在開始之前,玄貓建議確保你的虛擬機器環境已經正確設定,並且具備必要的 Python 套件。以下是你需要的虛擬機器資訊:
- 虛擬機器名稱:UbantuTest
- 虛擬機器作業系統全名:Ubuntu Linux (64-bit)
- 虛擬機器作業系統 ID:ubuntu64Guest
為了與 vSphere 的管理物件瀏覽器(Managed Object Browser,MOB)進行溝通,你需要安裝 pyVim 和 pyVmomi 這兩個 Python 函式庫。如果這些函式庫尚未安裝,可以使用以下指令進行安裝:
sudo pip install pyvim
sudo pip install pyvmomi
Python 程式碼範例
接下來,玄貓將展示一個完整的 Python 程式碼範例,這段程式碼可以從 GitHub 存放函式庫取得(雖然我們不會直接包含超連結,但可以參考原始檔案)。以下是程式碼的主要部分:
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
from pyVim import connect
import ssl
from pyVmomi import vim
app_settings = {
'api_pass': "xxxx",
'api_user': "user@vsphere.local",
'api_url': "https://<vCenterFQDN/rest/",
'vcenter_ip': "vCenter IP",
'VM_name': "UbantuTest" # 希望取得詳細資訊的虛擬機器名稱
}