Costruisci una VM Windows Azure con Terraform: Passo dopo passo

Hai mai creato una VM Azure tramite il portale Azure? Se sì, quanti clic sono stati necessari per farlo? Puoi farlo ancora e ancora, fornendo gli stessi valori di input esatti per garantire il rispetto di uno standard specifico? Probabilmente no. È necessario automatizzare il processo. Crea VM Azure con Terraform!

Terraform di Hashicorp è un’utility che crea infrastrutture semplici o complesse on-premises o nel cloud. Terraform è un singolo file binario che legge file di configurazione, crea uno stato e poi garantisce che la tua infrastruttura venga creata e rimanga in quello stato.

In questo articolo, imparerai come iniziare con Terraform creando una VM Azure. Questo tutorial sarà un ottimo esempio di Azure con Terraform.

Prerequisiti

Se desideri seguire questo tutorial, assicurati di avere quanto segue:

In tutti i passaggi, questo tutorial utilizzerà macOS con PowerShell Core, anche se lo stesso processo può essere seguito su Windows 10 utilizzando PowerShell Core, Windows PowerShell o persino il prompt dei comandi di Windows.

Installazione di Terraform

Per iniziare, prima devi scaricare Terraform. Ci sono molti modi per farlo a seconda delle tue preferenze. Questo tutorial utilizza macOS, quindi puoi utilizzare HomeBrew eseguendo brew install terraform. Puoi anche andare direttamente alla pagina di download di Terraform o, se sei su Windows, puoi usare Chocolatey anche.

Sapevi che Azure Cloud Shell ha Terraform pre-installato?

Una volta scaricato Terraform, copialo in una cartella nel tuo percorso e esegui terraform. Dovresti vedere alcune istruzioni sull’uso come mostrato di seguito. Se vedi questo, sei pronto per procedere.

Terraform Usage Instructions

Autenticazione su Azure

Terraform utilizza i provider per comunicare con vari fornitori locali e cloud. In questo caso, devi configurare il provider Azure di Terraform. Presumendo che tu abbia installato Azure CLI e ti sia già autenticato su Azure, devi prima creare un service principal. Terraform utilizzerà il service principal per autenticarsi e accedere alla tua sottoscrizione di Azure.

Crea un Service Principal

Nella tua console, crea un service principal utilizzando Azure CLI. Per farlo:

Prima di tutto, trova il tuo ID di sottoscrizione utilizzando il comando az account list di seguito.

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

Una volta ottenuto l’ID di sottoscrizione, crea un principal di servizio utilizzando il ruolo Contributor limitato alla tua sottoscrizione.

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

Azure CLI si collegherà ad Azure e creerà un’applicazione Azure AD con una password come mostrato di seguito. Poiché stai assegnando l’output mostrato di seguito alla variabile $sp sopra, avrai l’appId e la password memorizzate nella variabile per un uso successivo.

Azure ID Application with a Password

Imposta le variabili d’ambiente

Terraform ha bisogno di conoscere quattro elementi di configurazione diversi per connettersi correttamente ad Azure.

  • L’ID di sottoscrizione di Azure
  • L’ID dell’applicazione Azure AD del principal di servizio
  • La password del principal di servizio
  • L’Azure AD tenant

Un modo per fornire queste informazioni a Terraform è utilizzare le variabili d’ambiente. Poiché questo tutorial viene eseguito in una console di PowerShell, puoi impostare queste variabili d’ambiente utilizzando $env:. Di seguito vedrai ciascuna delle variabili d’ambiente che Terraform cercherà quando cercherà di connettersi ad Azure.

Dato che l’output di az ad sp create-for-rbac è stato salvato nella variabile $sp in precedenza, puoi semplicemente fare riferimento alle proprietà anziché copiarle e incollarle.

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

Una volta definiti le variabili d’ambiente, Terraform è pronto per connettersi ad Azure!

Crea un file di configurazione

Tutte le configurazioni di Terraform vengono create in una singola cartella di solito con un nome modulo. In questo tutorial, non stai creando un modulo ma seguirai la stessa pratica.

Nella tua console di PowerShell, crea una cartella chiamata TerraformTesting ovunque tu voglia e poi passa a quella directory.

mkdir TerraformTesting
cd TerraformTesting

Successivamente, crea il file di configurazione main.tf. Qui verranno memorizzate le configurazioni per creare la VM Azure con Terraform. Questo è il file di configurazione che la maggior parte chiama “main”. Contiene dichiarazioni di provider e risorse per tutta l’infrastruttura gestita dalla configurazione.

Se desideri saperne di più sulla sintassi (HCL), Michael Levan ed io abbiamo un ottimo capitolo su Terraform nel nostro eBook No BS Azure and DevOps.

Crea un nuovo file main.tf all’interno della cartella Terraformtesting che assomigli al seguente.

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

Inizializza Terraform

Terraform ha bisogno di sapere quale provider userai quando cercherà di creare risorse. Deve saperlo in anticipo perché scarica questi provider nella stessa cartella in cui stai lavorando.

Scarica il provider di risorse azurerm come definito nel file di configurazione principale eseguendo il comando terraform init. Una volta fatto ciò, dovresti vedere un output simile al seguente.

Downloading the azurerm

Valida la configurazione

La configurazione che hai creato potrebbe non essere perfetta. Lo so, è difficile da credere, vero? Terraform ha bisogno di convalidare la configurazione per eventuali errori di sintassi. Per farlo, esegui il comando terraform plan. Questo comando legge i file di configurazione nella directory e segnala eventuali errori.

Assicurati di correggere eventuali errori segnalati da terraform plan prima di provare effettivamente a creare l’infrastruttura!

Costruisci la VM di Azure con Terraform

Infine, è arrivato il momento di creare effettivamente la VM di Azure eseguendo terraform apply. Quando esegui terraform apply, Terraform legge tutti i file di configurazione presenti nella directory e ti chiede conferma. Una volta digitato “yes”, si connetterà ad Azure e inizierà a creare la VM e tutte le risorse associate.

Buildign Azure VM

Se vedi il testo luminoso e brillante verde Apply complete! in fondo, significa che Terraform ha creato con successo le risorse!

Pulizia

Dato che questa era solo una dimostrazione e probabilmente non hai intenzione di mantenere questa VM, fai un favore a te stesso e rimuovi tutto ciò che hai fatto.

Hai creato un service principal per l’autenticazione di Terraform su Azure. Puoi rimuoverlo con il comando az ad sp delete qui sotto.

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

Inoltre, rimuovi la VM di Azure appena creata e tutte le altre risorse nel file di configurazione utilizzando terraform destroy. Se vuoi convalidare la configurazione e testare cosa accadrebbe se eseguissi terraform destroy, puoi anche eseguire terraform plan -destroy.

Conclusion

Terraform è uno strumento fantastico e gratuito per costruire infrastrutture in molte aree diverse. Imparare la sintassi di HCL è la parte più difficile di Terraform, ma onestamente, HCL è un linguaggio intuitivo. Se stai pensando di utilizzare uno strumento come Terraform o modelli ARM, ad esempio, impara Terraform!

Terraform è uno strumento molto popolare nell’industria, con un grande supporto della comunità e molte persone pronte ad aiutare!

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