Постройте виртуальную машину Windows Azure с помощью Terraform: Пошаговая инструкция

Да, вы когда-либо создавали виртуальную машину Azure через портал Azure? Если да, сколько кликов вам потребовалось для этого? Возможно, вы не сможете повторить этот процесс снова и снова, используя точно такие же входные значения, чтобы соответствовать определенному стандарту. Вам нужно автоматизировать этот процесс. Создавайте виртуальные машины Azure с помощью Terraform!

Terraform от HashiCorp – это утилита, которая создает простую или сложную инфраструктуру как на месте, так и в облаке. Terraform – это один исполняемый файл, который считывает файлы конфигурации, создает состояние, а затем гарантирует, что ваша инфраструктура создается и остается в этом состоянии.

В этой статье вы узнаете, как начать работу с Terraform, создав виртуальную машину Azure. Этот учебник станет отличным примером использования Terraform в Azure.

Предварительные требования

Если вы хотите следовать этому учебнику, убедитесь, что у вас есть следующее:

На протяжении шагов этого учебника будет использоваться macOS с запущенным PowerShell Core, хотя этот же процесс можно выполнить в 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 использует поставщиков для взаимодействия с различными поставщиками облачных и локальных ресурсов. В этом случае вам необходимо настроить поставщика Azure для Terraform. Предполагается, что у вас уже установлен Azure CLI и вы уже аутентифицировались в Azure. Сначала вам нужно создать сервисный принципал. Terraform будет использовать сервисный принципал для аутентификации и получения доступа к вашей подписке Azure.

Создание сервисного принципала

В вашей консоли создайте сервисный принципал с помощью Azure CLI. Для этого:

Сначала найдите свой идентификатор подписки, используя команду az account list ниже.

> az account list --query [*].[name,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 вы будете иметь appId и password, сохраненные в переменной для последующего использования.

Azure ID Application with a Password

Установите переменные среды

Terraform должен знать четыре различных элемента конфигурации, чтобы успешно подключиться к Azure.

  • Идентификатор подписки Azure
  • Идентификатор приложения Azure AD служебного принципала
  • Пароль служебного принципала
  • Тенант 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. Здесь будет храниться конфигурация для создания виртуальной машины Azure с помощью Terraform. Этот файл конфигурации обычно называют “основным” файлом конфигурации. Он содержит объявления провайдера и ресурсов для всей инфраструктуры, которую конфигурация будет управлять.

Если вы хотите узнать больше о синтаксисе (HCL), Майкл Леван и я написали отличную главу о Terraform в нашей книге No BS Azure and DevOps eBook.

Создайте новый файл main.tf внутри папки Terraformtesting, который будет выглядеть следующим образом.

## <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 должен знать, какие провайдеры вы будете использовать, когда он попытается создать ресурсы. Он должен знать это заранее, потому что он загружает эти провайдеры в ту же папку, в которой вы работаете.

Загрузите провайдер ресурсов azurerm, определенный в основном конфигурационном файле, выполнив команду terraform init. После этого вы должны увидеть вывод, аналогичный приведенному ниже.

Downloading the azurerm

Проверьте конфигурацию

Конфигурация, которую вы создали, может быть не идеальной. Знаю, трудно поверить, верно? Terraform должен проверить конфигурацию на наличие синтаксических ошибок. Для этого выполните команду terraform plan. Эта команда считывает файлы конфигурации в каталоге и сообщает об ошибках.

Обязательно устраните все ошибки, которые выявит terraform plan, прежде чем пытаться создавать инфраструктуру!

Создайте виртуальную машину Azure с помощью Terraform

Наконец, пришло время построить виртуальную машину Azure, выполнив terraform apply. Когда вы выполняете 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

Затем удалите виртуальную машину Azure, которую вы только что создали, и все другие ресурсы в файле конфигурации с помощью terraform destroy. Если вы хотите проверить конфигурацию и протестировать, что произошло бы, если бы вы выполнили terraform destroy, вы также можете выполнить terraform plan -destroy.

Заключение

Terraform – отличный и бесплатный инструмент для создания инфраструктуры во многих различных областях. Изучение синтаксиса HCL является самой сложной частью Terraform, но честно говоря, HCL – интуитивно понятный язык. Если вы думаете о использовании инструмента, подобного Terraform или шаблонов ARM, например, изучите Terraform!

Terraform сейчас популярен в индустрии и имеет отличную поддержку сообщества, а также много людей, готовых помочь!

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