Bouw een Windows Azure VM met Terraform: Stap-voor-stap

Heeft u eerder een Azure VM gemaakt via de Azure-portal? Zo ja, hoeveel klikken kostte dat? Kunt u het telkens opnieuw doen en dezelfde invoerwaarden verstrekken om ervoor te zorgen dat u aan een specifieke standaard voldoet? Waarschijnlijk niet. U moet het proces automatiseren. Maak Azure VM’s met Terraform!

Terraform van Hashicorp is een hulpprogramma dat eenvoudige tot complexe infrastructuur on-prem of in de cloud maakt. Terraform is een enkel binair bestand dat configuratiebestanden leest, een status maakt en vervolgens zorgt dat uw infrastructuur wordt gemaakt en in die staat blijft.

In dit artikel leert u hoe u aan de slag kunt gaan met Terraform door een Azure VM te maken. Deze tutorial zal een goed voorbeeld zijn van Terraform Azure.

Vereisten

Als u deze tutorial wilt volgen, zorg er dan voor dat u het volgende hebt:

Gedurende de stappen zal deze tutorial macOS gebruiken met PowerShell Core, hoewel hetzelfde proces kan worden gevolgd op Windows 10 met PowerShell Core, Windows PowerShell of zelfs de Windows-opdrachtprompt.

Terraform installeren

Om te beginnen moet je eerst Terraform downloaden. Er zijn veel manieren om dat te doen, afhankelijk van je voorkeur. Deze tutorial gebruikt macOS, dus je kunt HomeBrew gebruiken door brew install terraform uit te voeren. Je kunt ook rechtstreeks naar de Terraform downloadpagina gaan of, als je op Windows bent, kun je ook Chocolatey gebruiken.

Wist je dat Azure Cloud Shell Terraform vooraf geïnstalleerd heeft?

Zodra je Terraform hebt gedownload, kopieer je het naar een map in je pad en voer je terraform uit. Je zou enkele gebruiksinstructies moeten zien zoals hieronder getoond. Als je dit ziet, ben je klaar om verder te gaan.

Terraform Usage Instructions

Authenticeren naar Azure

Terraform maakt gebruik van providers om te communiceren met verschillende on-premises en cloudleveranciers. In dit geval moet je de Terraform Azure-provider configureren. Als je ervan uitgaat dat je de Azure CLI hebt geïnstalleerd en al geauthenticeerd bent bij Azure, moet je eerst een serviceprincipaal maken. Terraform zal de serviceprincipaal gebruiken om te authenticeren en toegang te krijgen tot je Azure-abonnement.

Maak een Serviceprincipaal

In je console maak je een serviceprincipaal aan met behulp van de Azure CLI. Om dat te doen:

Eerst, vind uw abonnements-ID met behulp van de az account list opdracht hieronder.

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

Zodra u het abonnements-ID hebt, maak dan een serviceprincipe aan met de Contributor rol toegewezen aan uw abonnement.

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

De Azure CLI zal verbinding maken met Azure en een Azure AD-toepassing maken met een wachtwoord zoals hieronder weergegeven. Aangezien u de onderstaande uitvoer toewijst aan de $sp variabele hierboven, zult u de appId en wachtwoord opgeslagen hebben in de variabele voor later gebruik.

Azure ID Application with a Password

Stel Omgevingsvariabelen In

Terraform moet vier verschillende configuratie-items kennen om met succes verbinding te maken met Azure.

  • Het Azure abonnements-ID
  • Het Azure AD-toepassings-ID van de serviceprincipe
  • Het wachtwoord van de serviceprincipe
  • De Azure AD-tenant

Een manier om deze informatie aan Terraform te verstrekken is door gebruik te maken van omgevingsvariabelen. Aangezien deze tutorial werkt binnen een PowerShell-console, kunt u deze omgevingsvariabelen instellen met $env:. Hieronder ziet u elk van de omgevingsvariabelen waar Terraform naar zal zoeken wanneer het probeert verbinding te maken met Azure.

Aangezien de uitvoer van az ad sp create-for-rbac eerder is opgeslagen in de $sp variabele, kunt u eenvoudig naar de eigenschappen verwijzen in plaats van ze te kopiëren en te plakken.

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

Zodra u de omgevingsvariabelen hebt gedefinieerd, is Terraform klaar om verbinding te maken met Azure!

Maak een Configuratiebestand aan

Alle Terraform-configuraties worden aangemaakt in een enkele map, meestal met een module-naam. In deze handleiding maak je geen module aan, maar volg je dezelfde werkwijze.

In je PowerShell-console maak je een map genaamd TerraformTesting waar je maar wilt, en ga je vervolgens naar die map.

mkdir TerraformTesting
cd TerraformTesting

Maak vervolgens het configuratiebestand main.tf aan. Hierin wordt de configuratie om de Azure VM met Terraform te bouwen opgeslagen. Dit is het configuratiebestand dat de meesten het “hoofd” configuratiebestand noemen. Het bevat provider- en resourcedeclaraties voor alle infrastructuur die de configuratie zal beheren.

Als je meer wilt weten over de syntaxis (HCL), hebben Michael Levan en ik een geweldig hoofdstuk over Terraform in onze No BS Azure and DevOps eBook.

Maak een nieuw bestand main.tf aan binnen de map Terraformtesting dat er als volgt uitziet.

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

Initialiseer Terraform

Terraform moet weten welke providers je zult gebruiken wanneer het probeert bronnen te maken. Het moet dit van tevoren weten omdat het deze providers downloadt in dezelfde map waarin je werkt.

Download de azurerm-bronprovider zoals gedefinieerd in het hoofdconfiguratiebestand door terraform init uit te voeren. Zodra je dit doet, zou je vervolgens output moeten zien vergelijkbaar met hieronder.

Downloading the azurerm

Valideer de Configuratie

De configuratie die je hebt gemaakt, is mogelijk niet perfect. Ik weet het, moeilijk te geloven, toch? Terraform moet de configuratie valideren op eventuele syntaxisfouten. Voer hiervoor het terraform plan-commando uit. Dit commando leest de configuratiebestanden in de map en meldt eventuele fouten.

Zorg ervoor dat je eventuele fouten die door terraform plan worden gemeld, oplost voordat je daadwerkelijk infrastructuur gaat provisoneren!

Bouw de Azure VM met Terraform

Uiteindelijk is het tijd om daadwerkelijk de Azure VM te bouwen door terraform apply uit te voeren. Wanneer je terraform apply uitvoert, leest Terraform eventuele configuratiebestanden in de map en vraagt het om bevestiging. Zodra je “ja” typt, zal het vervolgens contact opnemen met Azure en beginnen met het bouwen van de VM en alle bijbehorende resources.

Buildign Azure VM

Als je de heldere en glanzende, groene tekst Apply complete! onderaan ziet, heeft Terraform de resources succesvol gebouwd!

Opruimen

Aangezien dit slechts een demonstratie was en je waarschijnlijk niet van plan bent om deze VM te behouden, zorg ervoor dat je alles wat je hebt gedaan verwijdert.

Je hebt een service principal aangemaakt voor Terraform om zich bij Azure te authenticeren. Je kunt dat verwijderen met een az ad sp delete-commando hieronder.

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

Vervolgens verwijder je de Azure VM die je zojuist hebt gemaakt en alle andere resources in het configuratiebestand met behulp van terraform destroy. Als je de configuratie wilt valideren en wilt testen wat er zou gebeuren als je terraform destroy zou uitvoeren, kun je ook terraform plan -destroy uitvoeren.

Conclusie

Terraform is een geweldige en gratis tool om infrastructuur in vele verschillende gebieden te bouwen. Het leren van de HCL-syntaxis is het moeilijkste deel van Terraform, maar eerlijk gezegd is HCL een intuïtieve taal. Als je denkt aan het gebruik van een tool zoals Terraform of ARM-templates, leer dan zeker Terraform!

Terraform is momenteel een populair gereedschap in de industrie, met uitstekende community-ondersteuning en veel mensen die kunnen helpen!

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