Construa uma Máquina Virtual no Windows Azure com o Terraform: Passo a Passo

Você já criou uma VM do Azure via portal do Azure antes? Se sim, quantos cliques foram necessários para fazer isso? Você pode repetir o processo várias vezes, fornecendo os mesmos valores de entrada exatos para garantir que atenda a um padrão específico? Provavelmente não. Você precisa automatizar o processo. Crie VMs do Azure com o Terraform!

O Terraform da Hashicorp é uma ferramenta que cria infraestrutura simples a complexa localmente ou na nuvem. Terraform é um único arquivo binário que lê arquivos de configuração, cria um estado e depois garante que sua infraestrutura seja criada e permaneça nesse estado.

Neste artigo, você aprenderá como começar com o Terraform criando uma VM do Azure. Este tutorial será um ótimo exemplo de uso do Terraform no Azure.

Pré-requisitos

Se você quiser seguir este tutorial, certifique-se de ter o seguinte:

Ao longo dos passos, este tutorial usará macOS executando PowerShell Core, embora o mesmo processo possa ser seguido no Windows 10 usando PowerShell Core, Windows PowerShell ou até mesmo o prompt de comando do Windows.

Instalando o Terraform

Para começar, você precisará baixar o Terraform. Existem várias maneiras de fazer isso, dependendo da sua preferência. Este tutorial está usando o macOS, então você pode usar o HomeBrew executando brew install terraform. Você também pode ir diretamente para a página de download do Terraform ou, se estiver no Windows, pode usar o Chocolatey também.

Você sabia que o Azure Cloud Shell já tem o Terraform pré-instalado?

Depois de baixar o Terraform, copie-o para uma pasta em seu caminho e execute terraform. Você deverá ver algumas instruções de uso, conforme mostrado abaixo. Se vir isso, está pronto para prosseguir.

Terraform Usage Instructions

Autenticação no Azure

O Terraform usa provedores para se comunicar com vários fornecedores locais e em nuvem. Neste caso, você precisa configurar o provedor Azure do Terraform. Supondo que você tenha o Azure CLI instalado e já autenticado no Azure, você precisa primeiro criar um principal de serviço. O Terraform usará o principal de serviço para autenticar e obter acesso à sua assinatura do Azure.

Crie um Principal de Serviço

Na sua console, crie um principal de serviço usando o Azure CLI. Para fazer isso:

Primeiro, encontre o ID da sua assinatura usando o comando az account list abaixo.

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

Assim que tiver o ID da assinatura, crie um principal de serviço usando a função Contributor associada à sua assinatura.

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

O Azure CLI vai se conectar ao Azure e criar um aplicativo do Azure AD com uma senha como mostrado abaixo. Como você está atribuindo a saída mostrada abaixo à variável $sp acima, você terá o appId e a password armazenados na variável para uso posterior.

Azure ID Application with a Password

Configure Variáveis de Ambiente

O Terraform precisa de quatro itens de configuração diferentes para se conectar com sucesso ao Azure.

  • O ID da assinatura do Azure
  • O ID do aplicativo Azure AD do principal de serviço
  • A senha do principal de serviço
  • O locatário do Azure AD

Uma forma de fornecer essas informações ao Terraform é usando variáveis de ambiente. Como este tutorial está sendo executado dentro de um console PowerShell, você pode definir essas variáveis de ambiente usando $env:. Abaixo, você verá cada uma das variáveis de ambiente que o Terraform procurará ao tentar se conectar ao Azure.

Como a saída de az ad sp create-for-rbac foi salva na variável $sp anteriormente, você pode simplesmente fazer referência às propriedades em vez de copiá-las e colá-las.

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

Assim que você definiu as variáveis de ambiente, o Terraform está pronto para se conectar ao Azure!

Crie um Arquivo de Configuração

Todos os configurations do Terraform são criados em uma única pasta, geralmente por um nome de módulo. Neste tutorial, você não está criando um módulo, mas seguirá a mesma prática.

Na sua console do PowerShell, crie uma pasta chamada TerraformTesting onde desejar e, em seguida, mude para esse diretório.

mkdir TerraformTesting
cd TerraformTesting

Em seguida, crie o arquivo de configuração main.tf. Este é o arquivo de configuração onde serão armazenadas as configurações para construir a VM do Azure com o Terraform. Este é o arquivo de configuração que a maioria chama de arquivo de configuração “principal”. Ele contém declarações de provedor e recursos para toda a infraestrutura que a configuração irá gerenciar.

Se você quiser aprender mais sobre a sintaxe (HCL), Michael Levan e eu temos um ótimo capítulo sobre o Terraform em nosso eBook No BS Azure and DevOps.

Crie um novo arquivo main.tf dentro do diretório TerraformTesting que se pareça com o abaixo.

## <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"
  }
}

Inicialize o Terraform

O Terraform precisa saber que tipo de provedores você estará usando quando tentar criar recursos. Ele precisa saber disso antecipadamente porque faz o download desses provedores na mesma pasta em que você está trabalhando.

Faça o download do provedor de recursos azurerm conforme definido no arquivo de configuração principal executando terraform init. Depois de fazer isso, você deverá ver uma saída semelhante à abaixo.

Downloading the azurerm

Valide a Configuração

A configuração que você criou pode não estar perfeita. Eu sei, difícil de acreditar, não é? O Terraform precisa validar a configuração para quaisquer erros de sintaxe na configuração. Para fazer isso, execute o comando terraform plan. Este comando lê os arquivos de configuração no diretório e relata quaisquer erros.

Certifique-se de corrigir quaisquer erros que o terraform plan apresentar antes de tentar efetivamente provisionar a infraestrutura!

Construa a VM do Azure com o Terraform

Finalmente, é hora de realmente construir a VM do Azure executando terraform apply. Quando você executa terraform apply, o Terraform lê quaisquer arquivos de configuração que você tenha no diretório e solicita sua confirmação. Depois de digitar “sim”, ele então se conectará ao Azure e começará a construir a VM e todos os recursos associados.

Buildign Azure VM

Se você vir o texto brilhante e reluzente, verde Apply complete! na parte inferior, o Terraform construiu os recursos com sucesso!

Limpeza

Já que isso foi apenas uma demonstração e você provavelmente não pretende manter esta VM por perto, certifique-se de fazer um favor a si mesmo e remover tudo o que você fez.

Você criou um principal de serviço para o Terraform autenticar no Azure. Você pode remover isso com um comando az ad sp delete abaixo.

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

Em seguida, remova a VM do Azure que você acabou de criar e todos os outros recursos no arquivo de configuração usando terraform destroy. Se você quiser validar a configuração e testar o que aconteceria se você executasse terraform destroy, você também pode executar terraform plan -destroy.

Conclusão

O Terraform é uma ótima e gratuita ferramenta para construir infraestrutura em muitas áreas diferentes. Aprender a sintaxe do HCL é a parte mais difícil do Terraform, mas honestamente, o HCL é uma linguagem intuitiva. Se você está pensando em usar uma ferramenta como o Terraform ou modelos ARM, por exemplo, aprenda o Terraform!

O Terraform é uma ferramenta popular da indústria agora, com ótimo suporte da comunidade e muitas pessoas disponíveis para ajudar!

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