返回文章列表

使用 Terraform 部署 Azure 虛擬機與網路配置

本文闡述如何使用 Terraform 編寫腳本,以部署完整的 Azure 虛擬機器環境。內容聚焦於網絡接口(NIC)的 IP 配置、公共 IP 地址的關聯,以及用於啟動診斷的存儲賬戶設置。文章詳細解析 azurerm_network_interface、azurerm_public_ip 與

雲端運算 DevOps

在現代雲端架構管理中,基礎設施即代碼(Infrastructure as Code, IaC)已成為提升效率與穩定性的核心實踐。透過 Terraform 這類工具,開發與維運團隊能以宣告式語法精確定義所有雲端資源的規格與相互關係。本文將聚焦於 Azure 平台,深入探討如何運用 Terraform 部署一台功能完整的 Linux 虛擬機器。其理論核心在於資源間的依賴性管理,例如將虛擬機器綁定至特定的網路接口,該接口又關聯著子網路與公共 IP 地址,而啟動診斷日誌則需依賴一個獨立的存儲賬戶。此種模組化且相互引用的配置方式,不僅確保了部署的一致性與可重複性,也體現了 IaC 在處理複雜雲端環境時的結構化優勢,讓基礎設施的管理變得如同軟體開發般清晰可控。

Terraform 腳本編寫:網絡接口、公共 IP 與診斷存儲配置

本章節將繼續深入 Terraform 腳本的編寫,重點介紹如何配置 Azure 虛擬機器的網絡接口 (NIC) 的 IP 配置,包括動態私有 IP 和公共 IP 地址的關聯。同時,我們將定義一個存儲賬戶,用於收集虛擬機器的啟動診斷日誌。內容將詳細解析這些組件的 Terraform 代碼,並說明它們之間的相互作用,以構建一個完整的、可訪問的虛擬機器部署方案。

配置網絡接口的 IP 配置

在上一節中,我們定義了網絡接口 azurerm_network_interface.nic。現在,我們將完善其 IP 配置,使其能夠關聯到一個公共 IP 地址。

網絡接口 (Network Interface) 的 IP 配置細節

我們將繼續完善 azurerm_network_interface.nic 資源塊,特別是 ip_configuration 部分:

resource "azurerm_network_interface" "nic" {
  name                = "book-nic"
  location            = "West Europe"
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "bookipconfig"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = azurerm_public_ip.pip.id # 引用公共 IP 地址
  }
}

在這個更新後的代碼中:

  • name = "bookipconfig": 為 IP 配置指定了一個名稱。
  • subnet_id = azurerm_subnet.subnet.id: 這是關鍵的依賴聲明,確保網絡接口連接到之前定義的 book-subnet
  • private_ip_address_allocation = "Dynamic": 設置為動態分配私有 IP 地址。
  • public_ip_address_id = azurerm_public_ip.pip.id: 這是新增且至關重要的部分。通過引用 azurerm_public_ip.pip.id,我們將此網絡接口與即將定義的公共 IP 地址 azurerm_public_ip.pip 關聯起來。這意味著該虛擬機器將擁有一個公開可訪問的 IP 地址。Terraform 會確保在創建此網絡接口之前,azurerm_public_ip.pip 資源已經被創建。

定義公共 IP 地址

為了讓虛擬機器能夠從外部網絡訪問,我們需要為其分配一個公共 IP 地址。

resource "azurerm_public_ip" "pip" {
  name                = "book-ip"
  location            = "West Europe"
  resource_group_name = azurerm_resource_group.rg.name

  public_ip_address_allocation = "Dynamic"
  domain_name_label            = "bookdevops" # 可選:用於創建 DNS 記錄
}

在這個資源塊中:

  • name = "book-ip": 指定公共 IP 地址資源的名稱。
  • location: 設置部署區域。
  • resource_group_name: 指定所屬資源群組。
  • public_ip_address_allocation = "Dynamic": 設置為動態分配公共 IP 地址。Terraform 會在部署時請求 Azure 分配一個可用的公共 IP 地址。
  • domain_name_label = "bookdevops": 這是一個可選的配置,它允許 Terraform 在 Azure DNS 中為該公共 IP 地址創建一個 DNS 記錄,格式為 bookdevops.westeurope.cloudapp.azure.com(其中 westeurope 是區域名稱)。這使得可以通過域名來訪問虛擬機器。

配置存儲賬戶用於啟動診斷

Azure 虛擬機器的啟動診斷功能可以幫助我們排查啟動問題。這些日誌需要一個存儲賬戶來存放。

resource "azurerm_storage_account" "stor" {
  name                     = "bookstor"
  location                 = "West Europe"
  resource_group_name      = azurerm_resource_group.rg.name
  account_tier             = "Standard"
  account_replication_type = "LRS" # 本地冗餘存儲
}

在這個資源塊中:

  • name = "bookstor": 指定存儲賬戶的名稱。請注意,存儲賬戶名稱在 Azure 範圍內必須是全局唯一的。
  • location: 設置部署區域。
  • resource_group_name: 指定所屬資源群組。
  • account_tier = "Standard": 設置存儲賬戶的層級為標準。
  • account_replication_type = "LRS": 設置存儲的複製類型為本地冗餘存儲 (LRS),這是一種較經濟的冗餘選項。

Terraform 腳本編寫:虛擬機器部署與配置細節

本章節將聚焦於 Terraform 腳本的最後一個關鍵組件:Azure Linux 虛擬機器的定義。內容將詳細闡述如何配置虛擬機器的名稱、大小、網絡接口、操作系統映像以及啟動診斷設置,確保虛擬機器能夠成功部署並與先前定義的網絡基礎設施整合。透過這個完整的實例,讀者將能掌握使用 Terraform 部署複雜雲端資源的能力。

定義 Linux 虛擬機器

現在,我們將編寫 Terraform 代碼來創建一個 Linux 虛擬機器,並將其與之前定義的網絡組件和存儲賬戶關聯起來。

resource "azurerm_linux_virtual_machine" "vm" {
  name                = "bookvm"
  location            = "West Europe"
  resource_group_name = azurerm_resource_group.rg.name

  vm_size = "Standard_DS1_v2" # 指定虛擬機器的 SKU 大小

  # 關聯網絡接口
  network_interface_ids = [azurerm_network_interface.nic.id]

  # 操作系統映像配置
  storage_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "16.04-LTS"
    version   = "latest"
  }

  # 診斷日誌配置
  os_disk {
    caching              = "ReadWrite"
    storage_account_id = azurerm_storage_account.stor.id # 關聯存儲賬戶
  }

  # 啟用啟動診斷
  boot_diagnostics {
    storage_uri = azurerm_storage_account.stor.primary_blob_url
  }

  # SSH 公鑰配置 (簡化示例,實際部署需更詳細配置)
  admin_ssh_key {
    username   = "adminuser"
    public_key = file("~/.ssh/id_rsa.pub") # 替換為您的實際公鑰路徑
  }

  # 替換為您的實際密碼或 SSH 金鑰配置
  admin_username = "adminuser"
  # password = "your_strong_password" # 建議使用 SSH 金鑰而非密碼
}

在這個資源塊中:

  • name = "bookvm": 指定虛擬機器的名稱。
  • location: 設置部署區域。
  • resource_group_name: 指定所屬資源群組。
  • vm_size = "Standard_DS1_v2": 選擇虛擬機器的 SKU 大小,這決定了虛擬機器的 CPU、內存和網絡帶寬。
  • network_interface_ids = [azurerm_network_interface.nic.id]: 這是關鍵的依賴聲明。通過引用 azurerm_network_interface.nic.id,我們將此虛擬機器與之前定義的網絡接口 azurerm_network_interface.nic 綁定。這確保了虛擬機器將使用該網絡接口連接到網絡。
  • storage_image_reference: 定義了虛擬機器將使用的操作系統映像。這裡我們選擇了 Canonical 提供的 Ubuntu Server 16.04 LTS 最新版本。
  • os_disk: 配置操作系統磁盤。
    • storage_account_id = azurerm_storage_account.stor.id: 這是另一個重要的依賴聲明,通過引用 azurerm_storage_account.stor.id,我們將操作系統磁盤的存儲與之前定義的存儲賬戶 azurerm_storage_account.stor 關聯起來。
  • boot_diagnostics: 配置虛擬機器的啟動診斷。
    • storage_uri = azurerm_storage_account.stor.primary_blob_url: 指定用於存儲診斷日誌的存儲賬戶的 Blob 服務 URL。
  • admin_username: 指定虛擬機器的管理員用戶名。
  • admin_ssh_key: 配置 SSH 公鑰用於安全登錄。public_key = file("~/.ssh/id_rsa.pub") 表示從本地 SSH 公鑰文件中讀取公鑰。強烈建議在生產環境中使用 SSH 金鑰進行身份驗證,而非明文密碼。

透過以上配置,Terraform 將能夠創建一個包含指定網絡配置、公共 IP 地址、診斷存儲以及操作系統映像的 Linux 虛擬機器。

縱觀現代雲端基礎設施的管理挑戰,Terraform 的腳本化實踐展現了一種從程序性操作到架構性宣告的思維轉變。此方法的核心價值不僅在於自動化部署,更在於其內建的依賴關係管理。相較於傳統腳本或手動配置,它將虛擬機、網路介面、公共IP與儲存體等分散組件,整合為一個具備內在邏輯、可預測且易於維護的系統藍圖。然而,其真正的門檻並非語法學習,而是管理者與團隊能否建立「狀態導向」與「系統性思考」的心智模式,將基礎設施視為可編程的數位資產。

未來3-5年,這種「基礎設施即代碼」(Infrastructure as Code)的能力,將從DevOps專家的利基技能,演變為雲端架構師與高階工程師的核心素養。

玄貓認為,投資於此種思維與實踐的養成,不僅是技術升級,更是建立組織數位韌性與加速創新週期的策略性佈局。