使用 Terraform 逐步构建 Windows Azure 虚拟机:

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

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

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

先决条件

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

在本教程的步骤中,我们将使用运行PowerShell Core的macOS,但是相同的过程也可以在运行PowerShell Core的Windows 10、Windows PowerShell甚至Windows命令提示符上进行。

安装Terraform

要开始,你首先需要下载 Terraform。根据你的偏好,有许多方法可以做到这一点。本教程使用 macOS,所以你可以通过运行 brew install terraform 使用 HomeBrew。你也可以直接访问 Terraform 下载页面,或者,如果你使用的是 Windows,你也可以 使用 Chocolatey

你知道吗,Azure 云 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配置通常都在一个名为模块的文件夹中创建。在本教程中,您不会创建一个模块,但您将遵循相同的做法。

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

mkdir TerraformTesting
cd TerraformTesting

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

如果您想了解更多关于语法(HCL)的信息,Michael Levan和我在我们的无废话Azure和DevOps电子书中有一章关于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 VM

最后,是时候通过运行terraform apply来实际构建Azure VM了。当你运行terraform apply时,Terraform会读取目录中的任何配置文件,并提示你进行确认。一旦你输入“yes”,它就会联系Azure并开始构建VM和所有关联资源。

Buildign Azure VM

如果你看到亮丽的、绿色的Apply complete!文本出现在底部,Terraform就已经成功构建了资源!

清理

由于这只是一个演示,而且你可能不打算保留这个VM,一定要做自己一个忙,删除你所做的一切。

你为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 VM和配置文件中的所有其他资源。如果你想验证配置并测试如果你运行terraform destroy会发生什么,你也可以运行terraform plan -destroy

结论

Terraform是一个在许多不同领域构建基础设施的强大而免费的工具。学习HCL的语法是Terraform中最难的部分,但老实说,HCL是一种直观的语言。如果你正在考虑使用Terraform或者像ARM模板这样的工具,那么学习Terraform吧!

Terraform现在是一个受欢迎的行业工具,拥有强大的社区支持和大量的人员提供帮助!

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