使用 Terraform 構建 Windows Azure VM: 逐步指南

你以前是否通过Azure门户创建过Azure虚拟机?如果是这样,需要点击几次才能完成?你能够一次又一次地创建,并提供完全相同的输入值,以确保符合特定标准吗?可能无法做到。你需要自动化这个过程。使用Terraform创建Azure虚拟机!

Terraform是Hashicorp开发的一个实用工具,可在本地或云端创建简单到复杂的基础架构。Terraform是一个单一的二进制文件,它读取配置文件,创建一个状态,并确保你的基础架构处于该状态。

在本文中,你将学习如何通过创建Azure虚拟机来开始使用Terraform。这个教程将是一个很好的Terraform Azure示例。

先决条件

如果你想跟着本教程进行操作,请确保已经具备以下条件:

在本教程中,将使用运行PowerShell Core的macOS进行操作,尽管在Windows 10上也可以使用PowerShell Core、Windows PowerShell甚至Windows命令提示符来进行相同的过程。

安装Terraform

首先,您需要先下載 Terraform。根據您的偏好,有許多不同的方式可以進行下載。本教程使用 macOS,您可以使用 HomeBrew 執行 brew install terraform 來進行下載。您也可以直接前往 Terraform 下載頁面 下載,或者如果您使用的是 Windows,您也可以 使用 Chocolatey 進行下載。

您知道嗎,Azure Cloud Shell 已預先安裝了 Terraform?

當您下載完 Terraform 後,將其複製到您的路徑中的某個資料夾中,並執行 terraform。您應該看到一些使用說明,如下所示。如果您看到這個畫面,表示您已準備就緒。

Terraform Usage Instructions

Azure 的身份驗證

Terraform 使用提供者與各種本地和雲端供應商進行溝通。在這種情況下,您需要配置 Terraform Azure 提供者。假設您已安裝 Azure CLI 並且已經通過驗證連接到 Azure,您需要首先創建一個服務主體。Terraform 將使用該服務主體進行身份驗證並獲取對 Azure 訂閱的訪問權限。

創建服務主體

在您的控制台中,使用 Azure CLI 創建一個服務主體。操作如下:

首先,使用以下az account list命令查找您的訂閱 ID。

> az account list --query [*].[name,id]

在獲取訂閱 ID 後,使用Contributor角色在您的訂閱範圍內創建一個服務主體。

$subscriptionId = 'xxxx-xxxxx-xxxxx'
$sp = az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/$subscriptionId" -n TerraformTesting | ConvertFrom-Json

Azure CLI 將與 Azure 進行通信,並創建一個帶有密碼的 Azure AD 應用程式,如下所示。由於您將將以下輸出分配給上面的$sp變數,因此您將在以後使用該變數中存儲的appIdpassword

Azure ID Application with a Password

設置環境變數

Terraform 需要知道四個不同的配置項,才能成功連接到 Azure。

  • Azure 訂閱 ID
  • 服務主體的 Azure AD 應用程式 ID
  • 服務主體密碼
  • Azure AD 租戶

向 Terraform 提供此信息的一種方法是使用環境變數。由於本教程在 PowerShell 控制台中工作,您可以使用$env:設置這些環境變數。下面您將看到 Terraform 在嘗試連接到 Azure 時將查找的每個環境變數。

由於先前將az ad sp create-for-rbac的輸出保存到$sp變數中,因此您可以直接引用屬性,而不是複製和粘貼它們。

$env:ARM_SUBSCRIPTION_ID = $subscriptionId
$env:ARM_CLIENT_ID = $sp.appId
$env:ARM_CLIENT_SECRET = $sp.password
$env:ARM_TENANT_ID = $sp.tenant

定義環境變數後,Terraform 將準備好連接到 Azure!

創建配置文件

所有的Terraform配置通常都是在一个名为module的文件夹中创建的。在本教程中,您不会创建一个模块,但您将遵循相同的做法。

在您的PowerShell控制台中,创建一个名为TerraformTesting的文件夹,然后切换到该目录。

mkdir TerraformTesting
cd TerraformTesting

接下来,创建名为main.tf的配置文件。这是存储使用Terraform构建Azure虚拟机的配置的文件。这个配置文件被大多数人称为“主”配置文件。它包含了配置将管理的所有基础设施的提供程序和资源声明。

如果您想了解更多关于语法(HCL)的信息,Michael Levan和我在我们的No BS Azure and DevOps eBook中有一个很棒的Terraform章节。

Terraformtesting目录中创建一个名为main.tf的新文件,内容如下。

## <https://www.terraform.io/docs/providers/azurerm/index.html>
provider "azurerm" {
  version = "=2.5.0"
  features {}
}

## <https://www.terraform.io/docs/providers/azurerm/r/resource_group.html>
resource "azurerm_resource_group" "rg" {
  name     = "TerraformTesting"
  location = "eastus"
}

## <https://www.terraform.io/docs/providers/azurerm/r/availability_set.html>
resource "azurerm_availability_set" "DemoAset" {
  name                = "example-aset"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/virtual_network.html>
resource "azurerm_virtual_network" "vnet" {
  name                = "vNet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}

## <https://www.terraform.io/docs/providers/azurerm/r/subnet.html> 
resource "azurerm_subnet" "subnet" {
  name                 = "internal"
  resource_group_name  = azurerm_resource_group.rg.name
  virtual_network_name = azurerm_virtual_network.vnet.name
  address_prefix       = "10.0.2.0/24"
}

## <https://www.terraform.io/docs/providers/azurerm/r/network_interface.html>
resource "azurerm_network_interface" "example" {
  name                = "example-nic"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.subnet.id
    private_ip_address_allocation = "Dynamic"
  }
}

## <https://www.terraform.io/docs/providers/azurerm/r/windows_virtual_machine.html>
resource "azurerm_windows_virtual_machine" "example" {
  name                = "example-machine"
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  size                = "Standard_F2"
  admin_username      = "adminuser"
  admin_password      = "P@$$w0rd1234!"
  availability_set_id = azurerm_availability_set.DemoAset.id
  network_interface_ids = [
    azurerm_network_interface.example.id,
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "MicrosoftWindowsServer"
    offer     = "WindowsServer"
    sku       = "2016-Datacenter"
    version   = "latest"
  }
}

初始化Terraform

Terraform在尝试创建资源时需要知道你将使用哪些提供程序。它必须提前知道这一点,因为它会在你工作的同一文件夹中下载这些提供程序。

运行terraform init来下载在主配置文件中定义的azurerm资源提供程序。一旦你这样做,你应该看到类似下面的输出。

Downloading the azurerm

验证配置

你創建的配置可能不完美。難以置信,對吧?Terraform需要驗證配置中是否存在任何語法錯誤。為此,運行terraform plan命令。該命令會讀取目錄中的配置文件並報告任何錯誤。

確保在嘗試實際提供基礎架構之前修復terraform plan引發的任何錯誤!

使用Terraform建立Azure虛擬機

最後,現在是實際運行terraform apply來建立Azure虛擬機的時候了。當你運行terraform apply時,Terraform會讀取目錄中的任何配置文件並提示你確認。一旦你輸入“yes”,它將連接到Azure並開始建立虛擬機和所有相關資源。

Buildign Azure VM

如果你在底部看到明亮閃亮的綠色Apply complete!文本,代表Terraform已成功建立資源!

清理工作

因為這只是一個演示,你可能不打算保留這個虛擬機,所以請幫自己一個忙,刪除你所做的一切。

你為Terraform創建了一個用於驗證Azure身份的服務主體。你可以使用下面的az ad sp delete命令刪除它。

$spId = ((az ad sp list --all | ConvertFrom-Json) | Where-Object { '<http://TerraformTesting>' -in $_.serviceprincipalnames }).objectId
az ad sp delete --id $spId

然後,使用terraform destroy命令刪除你剛剛建立的Azure虛擬機和配置文件中的所有其他資源。如果你想驗證配置並測試如果運行terraform destroy會發生什麼,你也可以運行terraform plan -destroy

結論

Terraform 是一個很棒且免費的工具,可以用來建立不同領域的基礎設施。學習 HCL 語法是 Terraform 最難的部分,但說實話,HCL 是一種直觀的語言。如果你正在考慮使用像 Terraform 或 ARM temples 這樣的工具,建議學習 Terraform!

Terraform 現在是一個受歡迎的行業工具,擁有強大的社群支持和許多人可以提供幫助!

Source:
https://adamtheautomator.com/terraform-azure-vm/