Terraform il tuo (multi) cloud – parte 1

Pubblicato da Andrea il

Terraform è uno dei miei tool open source preferiti, ho iniziato ad usarlo con il mio VMware interno e poi con i cloud Azure e AWS.

L’idea di descrivere un’infrastruttura con un linguaggio di configurazione è relativamente nuova e sta diventando sempre più importante con l’adozione di cloud pubblici e privati.

L’ultimo annuncio di Anthos da parte di Google vi dà l’idea dell’importanza di un approccio multi-cloud e della necessità di tool per gestirli.

Suona complicato ma è più semplice di quello che si pensi e,  dopo la prima definizione della vostra infrastruttura attuale in un paio di file, con alcuni copia e incolla potrete replicare configurazioni molto grandi e complesse, utilizzandolo con Git potrete anche salvare varie versioni della vostra infrastruttura!

Ho iniziato con il mio cloud privato su un cluster VMware vSphere che conosco molto bene e questo mi ha aiutato a capire il workflow e i comandi base.

Potete scaricare Terraform dalla pagina di download del sito HashiCorp:

https://www.terraform.io/downloads.html

Installare Terraform è semplice, basta fare l’unzip e spostare i file in una directory inclusa nel vostro system’s PATH o aggiungere la directory al vostro PATH.

Per editare i file vi suggerisco di utilizzare visual studio code con le estensioni per Terraform, sarà più semplice con questo nuovo linguaggio di alto livello.

Per VMware, ho creato due file, variables.tfbuild.tf.

Il primo variables.tf contiene l’indirizzo del mio vCenter, DNS, utente e password:

variable "vsphere_server" {
description = "vsphere server for the environment"
default = "vcenter01.domain.com"
}

variable "vsphere_user" {
description = "vsphere user for the environment"
default = "administrator@vsphere.local"
}

variable "vsphere_password" {
description = "vsphere server password for the environment"
default = "Password!"
}

variable "virtual_machine_dns_servers" {
type = "list"
default = ["192.168.0.2", "192.168.0.3"]
}

build.tf contiene la definizione iniziale dell’infrastruttura ed inizia con la dichiarazione del provider e del datacenter:

provider "vsphere" {
user = "${var.vsphere_user}"
password = "${var.vsphere_password}"
vsphere_server = "${var.vsphere_server}"

# if you have a self-signed cert
allow_unverified_ssl = true
}

data "vsphere_datacenter" "dc" {
name = "DC"
}

Ora potete già lanciare il vostro primo comando dalla directory che contiene i file della vostra infrastruttura per testare se tutto è ok :

terraform init

Questo inizializzerà vari dati e settaggi locali che verranno utilizzati dai comandi successivi, inoltre farà il download e installerà ogni plugin necessario al provider da voi dichiarato, in questo caso solo vSphere.

Dopo di questo, potete editare il fil aggiungendo Datastores, Clusters, Hosts, Resource pools, virtual switches etc.

data "vsphere_datastore" "datastore_01" {
name = "datastore_01
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_compute_cluster" "cluster" {
name = "VMCluster"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_host" "host1" {
name = "host01.domain.com"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_host" "host2" {
name = "host02.domain.com"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_network" "network" {
name = "LAN"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_resource_pool" "pool" {
name = "Server Pool"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

data "vsphere_distributed_virtual_switch" "dvs1" {
name = "DSwitch1"
datacenter_id = "${data.vsphere_datacenter.dc.id}"
}

Ora controllate se la vostra definizione dell’infrastruttura è corretta eseguendo:

terraform plan -out ./dc.out

Se tutto è ok riceverete il messaggio 

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.

Questo comando produrrà inoltre un file dc.out (o il nome file che avete inserito nel comando precedente) che potrete utilizzare per applicare la configurazione alla vostra infrastruttura.

Ora inizia lo spettacolo, con poche linee aggiunte al file build.tf possiamo creare una VM

resource "vsphere_virtual_machine" "vm1" {
name = "spaziani-1"
resource_pool_id = "${data.vsphere_resource_pool.pool.id}"
datastore_id = "${data.vsphere_datastore.datastore_01.id}"

num_cpus = 2
memory = 4096
guest_id = "centos7_64Guest"

scsi_type = "pvscsi"

cdrom {
datastore_id = "${data.vsphere_datastore.datastore_01.id}"
path = "ISO/CentOS-7-x86_64-Everything-1804.iso"
}

network_interface {
network_id = "${data.vsphere_network.network.id}"
adapter_type = "vmxnet3"
}

disk {
label = "disk0"
size = "120"
eagerly_scrub = "false"
thin_provisioned = "true"
}

}

Aggiungere un portgroup a un DVS 

resource "vsphere_distributed_port_group" "pg" {
name = "terraform-pg"
distributed_virtual_switch_uuid = "${data.vsphere_distributed_virtual_switch.dvs1.id}"
active_uplinks = ["${data.vsphere_distributed_virtual_switch.dvs1.uplinks[0]}"]
standby_uplinks = ["${data.vsphere_distributed_virtual_switch.dvs1.uplinks[1]}"]
}

Creare delle regole di affinità VMs to Hosts

resource "vsphere_compute_cluster_vm_group" "test_vm_group" {
name = "terraform-test-cluster-vm-group"
compute_cluster_id = "${data.vsphere_compute_cluster.cluster.id}"
virtual_machine_ids = ["${vsphere_virtual_machine.vm1.id}"]
}


resource "vsphere_compute_cluster_host_group" "test_host_group" {
name = "terraform-test-cluster-host-group"
compute_cluster_id = "${data.vsphere_compute_cluster.cluster.id}"
host_system_ids = ["${data.vsphere_host.host1.id}","${data.vsphere_host.host2.id}"]
}

resource "vsphere_compute_cluster_vm_host_rule" "test_vm_host_rule" {
compute_cluster_id = "${data.vsphere_compute_cluster.cluster.id}"
name = "terraform-test-cluster-vm-host-rule"
vm_group_name = "${vsphere_compute_cluster_vm_group.test_vm_group.name}"
affinity_host_group_name = "${vsphere_compute_cluster_host_group.test_host_group.name}"
}

Se aggiungete la definizione della VM al build.tf ed eseguite ancora il comando plan riceverete questo messaggio

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create

Terraform will perform the following actions:

+ vsphere_virtual_machine.vm1

….

Plan: 1 to add, 0 to change, 0 to destroy.

————————————————————————

This plan was saved to: ./dc.out

To perform exactly these actions, run the following command to apply:
terraform apply “./dc.out”

Verificate il risultato e se tutto è ok eseguite

terraform apply “./dc.out”

e la creazione della VM parte

vsphere_virtual_machine.vm1: Creating…

Alla fine riceverete un errore perchè non ci sono VMware Tools installati, è solo un nuovo Centos 7 da un ISO file, ma non ci sono problemi perchè Terraform si prenderà le altri informazioni alla prossima esecuzione del plan.

Se ora rimuovete dal file la nuova sezione resource vm1

resource "vsphere_virtual_machine" "vm1" ...

e eseguite un nuovo terraform plan e poi apply la vm1 verrà cancellata

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
destroy

Terraform will perform the following actions:

– vsphere_virtual_machine.vm1

Plan: 0 to add, 0 to change, 1 to destroy.

————————————————————————

This plan was saved to: ./dc.out

To perform exactly these actions, run the following command to apply:
terraform apply “./dc.out”

[root@localhost terraform]# terraform apply “./dc.out”
vsphere_virtual_machine.vm1: Destroying… (ID: 4234fd94-fadd-1252-bb96-e4df602d81cd)
vsphere_virtual_machine.vm1: Destruction complete after 0s

Apply complete! Resources: 0 added, 0 changed, 1 destroyed.

Spero che questo vi abbia suscitato la giusta curiosità per il prossimo articolo 😉

Categorie: Informatica