Software Engineering Company

Juhend: õpime tundma Terraformi Pilvio näitel ja seame üles Nginx veebiserveri

  1. Pilvio: Esimene kaasaegne pilveplatvorm Eestis
  2. Miks Terraform?
  3. Juhend
    1. Eeldused
    2. Terraformi projekti algväärtustamine
      1. Loo fail “variables.tf”
      2. Loo fail “init.tf”
      3. Algväärtusta Terraformi projekt
    3. Veebiserveri loomine
      1. Täienda faili “variables.tf”
      2. Loo fail “server.tf”
      3. Loo fail “outputs.tf”
      4. Loo fail “terraform.tfvars” ja väärtusta muutujad
      5. Pane ressursid tööle
      6. Võta ressursid maha

Pilvio: Esimene kaasaegne pilveplatvorm Eestis

Platvorme, mis pakuvad erinevaid pilveteenuseid nagu virtuaalserverite haldamine, on Eestis mitmeid. Paraku ei ole nendel platvormidel (nt Zone) võimalik (veebi)rakenduse taristut hallata rakendusliidese (API) kaudu programmaatiliselt. Seetõttu tuleb operatsioonide meeskonnal juba eos loobuda kaasaaegsetest töövõtetest nagu DevOps ja töövahenditest nagu Terraform.

Pilvio on Eestis esimene pilveteenusepakkuja, kes võimaldab ressursse hallata rakendusliidese abil. Nii saab Pilvio platvormil luua virtuaalvõrke ja -servereid täpselt samamoodi nagu AWS või Google Cloud platvormidelgi. Veelgi enam, rakendusliideste peale saab lisada tarkvarakihid, mis võimaldavad pilve ressursse hallata levinud töövahenditega nagu nt Terraform.

Kõik kasutajad saavad Pilvio platvormil alustamiseks krediiti, millega saab täiesti tasuta võimalusi katsetada. Heaks esimeseks sammuks on näiteks käesoleva juhendi proovimine.

Miks Terraform?

Terraform võimaldab hallata (veebi)rakenduse taristut koodina (Infrastructure as CodeIaC). Taristu haldamine deklaratiivse koodina on DevOps tööpraktika üks alustaladest, luues eeldused arendus- ja tarneprotsesside automatiseerimiseks. Iseenesest võib taristu haldamisega seotud tööd automatiseerida ka skriptide abil, kuid lisaks töökindlusele tekib siin hulgaliselt probleeme. Millised muudatused lähevad peale skripti käivitamisel? Kas ja millised muudatused on viimasena peale pandud? Mis on taristu hetkeseis?

Siin tulebki mängu Terraformi kõige suurem kasu taristu haldamisel: lisaks koodile peab Terraform ka paigaldatud ressursside seisundi (state) üle. Seisund on olemasoleva taristu deklaratiivne väljendus nii, nagu see koodi järgi täpselt olema peaks. Terraform kontrollib, et seisund vastaks ka tegelikkusele. Seega, kui kustutada Terraformiga loodud server käsitsi, loob Terraform selle uuesti seisundi järgi.

Seisund võimaldab planeerida ka ressursside paigalduse protsessi. Näiteks, kui muuta olemasoleva serveri konfiguratsiooni, loob Terraform muudetud koodi alusel uue seisundi ning võrdleb seda olemasolevaga, kuvades erinevused. Erinevalt olemasolevast seisundist ei sisalda uus veel kõike infot. Virtuaalserveri näitel, kui muudatuste käigus tuleb see luua uuesti, selgub IP aadress alles siis kui server püsti. Seega on planeerimisel seisundite võrdlusel esitatud info piiratud. Kuid siiski, fakt, et muudatus tehakse, on juba väga informatiivne ning vajadusel on võimalik koodierinevusest tuletada ka muudatuste põhjused. Igal juhul on Terraformiga ressursside paigaldamise protsess oluliselt etteaimatavam ja kerksam kui isetehtud skripti käivitamine.

Juhend

Eeldused

Juhend on küllaltki lihtne ning sobib seetõttu väga hästi ka algajatele, kes Terraformi veel kasutanud ei ole. Eeldused kaasategemiseks aga on:

  1. Pilvio kasutaja. Kui sul ei ole veel kasutajat, siis tee see endale: https://pilvio.com/
  2. Pilvio kasutaja API võti. Kui sul ei ole seda, logi sisse enda Pilvio kontole ning tee see. Vasakul menüüribas peaks olema valik “Access”, mille alt leiad API võtmete loomise võimaluse.
  3. Pilvio kasutaja billing account id. Selle leiab, kui avada Pilvio portaalis menüüribalt “Billing”, klikkida lisatud maksevahendile ning võtta “Account ID” väärtus.
  4. Terraformi CLI. Kui sul seda ei ole, vaata juhiseid siit.

Terraformi projekti algväärtustamine

NB! Failide sisu koos juhistega pärast projekti algväärtustamist leiad siit: https://github.com/StarlingScripts/tutorials/commit/5cbe711110a1add3224bc74217e589f6cd9163e4

Loo fail “variables.tf”

Faili sisuks on muutujad, mida me ressursside loomisel kasutame. Praegu on meil vaja muutujat, millele saaks väärtusena anda API võtme. Kopeeri variables.tf faili järgmine sisu:

variable "pilvio" {
  type = object({
    api_key = string
    billing_account_id = number
  })
  description = "Information about Pilvio account"
  sensitive = true
}

See kood loob objekt-tüüpi muutuja nimega “pilvio”. Objektil on kaks atribuuti nimedega api_key ja billing_account_id. Esimene on sõne-, teine number-tüüpi. Kuigi billing_account_id muutujat praegu veel vaja ei ole, siis teeme selle ikkagi juba ära. Nii ei pea hiljem enam koodi muutma.

api_key ja billing_account_id võib teha ka eraldi muutujatena. Praegu ma panin need kokku üheks objektiks, sest muutujatele viitamine on informatiivsem ja selgem (API võtme näitel pilvio.api_key). Lihtsalt api_key võib viidata misiganes teenuse API võtmele, mistõttu nimetamisel tuleks prefix (nt pilvio_) ja muutuja oleks: pilvio_api_key. Sarnaselt tuleks toimida iga muutujaga, mis on seotud konkreetselt pilvio teenusega. Selmet lisada prefix pilvio_, panen ma Pilvioga seotud muutujad ühe objekti “pilvio” alla ning saan automaatselt eesliite pilvio.. Eks see kõik on eelistuste ja harjumuste küsimus, kuid kuna Terraformi enda juhendid kasutavad samuti võimalusel objekte, siis olen seda ka ise teinud.

Loo fail “init.tf”

Kopeeri faili järgmine sisu:

terraform {
  required_providers {
    pilvio = {
      source = "pilvio-com/pilvio"
      version = "1.0.9"
    }
  }
}

provider "pilvio" {
  host     = "api.pilvio.com"
  apikey   = var.pilvio.api_key
  location = "tll01"
}

Terraform objekti required_providers kirjeldame ära Pilvio provider‘i päritolu ja versiooni. Selle järgi installib Terraform õiged teegid. provider objekti nimega “pilvio” all anname ette väärtused, mis võimaldavad Terraformil Pilvio platvormiga suhelda. Kõige olulisem on var.pilvio.api_key, millega me kirjeldame API võtit muutujana.

Muutuja pilvio.api_key tegime juba eespool. Nüüd selleks, et viidata muutujale Terraformis, tuleb kasutada var objekti. Seega lõptulemusena viitame API võtmele nii: var.pilvio.api_key

Algväärtusta Terraformi projekt

Projekti kaustas (sinna, kuhu .tf failid tegid), pane tööle käsk:

terraform init

Tulemusena peaksid saama teate: “Terraform has been successfully initialized!”

Veebiserveri loomine

Failide lõppseisu leiad siit: https://github.com/StarlingScripts/tutorials/tree/pilvio-webserver

Täienda faili “variables.tf”

Lisa “variables.tf” faili järgmine objekt-tüüpi muutuja kirjeldus:

variable "vm" {
type = object({
username = string
password = string
})
description = "Sensitive config values for VM"
sensitive = true
}

See muutuja võimaldab väärtustada virtuaalmasina (vm) kasutajat ja parooli. Selmet kirjutada parool koodi, kus see on kõigile ligipääsetav, viitame me üksnes muutujale, mis saab oma väärtuse Terraform CLI käivitamisel.

Pane tähele välja “sensitive” väärtusega “true”. See ütleb Terraformile, et ta ei kuvaks ega salvestaks nende muutujate väärtust. Nii ei leki saladuste väärtused kuhugi logidesse vms kohtadesse, kus need ei tohi olla nähtavad.

Loo fail “server.tf”

Loo teiste .tf failide kõrvale uus “server.tf” järgmise sisuga:

resource "pilvio_vm" "web_server" {
name = "test-web-server"
os_name = "ubuntu"
os_version = "22.04"
memory = 512
vcpu = 1
username = var.vm.username
password = var.vm.password
disks = 20
cloud_init = jsonencode({
"packages" = [
"nginx"
]
})
}

resource "pilvio_floatingip" "web_public_ip" {
name = "test-web-public-ip"
billing_account_id = var.pilvio.billing_account_id
}

resource "pilvio_floatingip_assignment" "web_server_ip_assignment" {
assigned_to = pilvio_vm.web_server.uuid
address = pilvio_floatingip.web_public_ip.address
}

See fail loob 3 ressurssi (formaat resource RESSURSI_TÜÜP NIMI):

  1. virtuaalmasin
  2. avalik IP
  3. avaliku IP määramine virtuaalmasinale

Ressursside tüübid ja võimalikud parameetrid on kirjas provider’i dokumentatsioonis. Nt virtuaalmasina oma, pilvio_vm kirjelduse leiad siit.

Aga lühidalt ressurssidest. Virtuaalmasina juures kirjeldame kõik tavapärased parameetrid: nimi, operatsioonisüsteem, ketta maht jne. Eraldi võiks välja tuua aga cloud_init parameetri, mis viitab cloud-init konfiguratsioonihaldusele. Tegemist on pilveteenuste standardiga, mis võimaldab seadistada masinat esmesel käivitamisel. Näiteks SSH kasutajate lisamine, host‘i aliased, teekide installimine jne. Võimalusi on palju ja kasutada saab ka tuntumaid konfiguratsioonihalduse tööriistu nagu Ansible või Chef. Vaata näiteid siit: https://cloudinit.readthedocs.io/en/latest/reference/examples.html.

Näites kasutame cloud_init parameetrit selleks, et kirjeldada nginx’i installi. cloud_init peab olema JSON vormingus. Et teha kood lihtsamini loetavaks, kasutan “jsonencode” funktsiooni. See võimaldab parameetrit kirjeldada samamoodi nagu teisi ressursse, Terraformi enda HCL vormingus, kuid käivitamisel muudab selle korrektseks JSON-iks.

Järgmine ressurss, pilvio_floatingip kirjeldab avaliku IP loomist. Täiendava parameetrina tuleb juurde anda ka “billing_account_id”. Selle jaoks tegime juba alguses muutuja, millele saamegi nüüd viidata: var.pilvio.billing_account_id

Viimaks, kasutades pilvio_floatingip_assignment tüüpi ressurssi, määrame IP masinale. Meil on vaja masina UUID-d ja kasutusse antava IP aadressi, kuid nende väärtused selguvad alles loomisel. Õnneks ei pea me looma ressursse enne IP sidumist, vaid saame viidata loodavate ressursside atribuutidele juba enne nende teket. Terraform tunneb viited ära ning loob vajalikud ressurssid enne, kui edasi liigub.

Loodavale ressurssile viitamisel on järgmine formaat:

RESSURSI_TÜÜP.RESSURSI_NIMI.ATRIBUUT

Nt virtuaalmasina UUID-le viitame nii: pilvio_vm.web_server.uuid

Loo fail “outputs.tf”

Terraform “output” võimaldab kirjeldada väljundväärtusi, mis tagastatakse pärast ressursside edukat loomist. See on ennekõike vajalik siis, kui loome Terraformi mooduleid (korduvkasutatavad projektid). Nii saab nt mooduli poolt loodud ressursse vm infot kasutada sisendiks teiste ressursside loomisel.

Praegu kasutame väljundväärtust selleks, et saada teada Pilvio poolt määratud IP väärtus veebiaadressina. Siis saame kohe külastada veebiserverit. “outputs.tf” faili sisu on järgmine:

output web_server_ip {
value = "http://${pilvio_floatingip.web_public_ip.address}"
sensitive = false
description = "IP addres of created web server"
}

Pane tähele, et väärtus on sõne, millele on sisse pikitud loodava IP väärtus. Terraform võimaldab muutujaid sõnesse sisestada järgmises formaadis:

"tekst ${MUUTUJA} tekst"

Loo fail “terraform.tfvars” ja väärtusta muutujad

See on fail, kus saab kirjeldada Terraform CLI-le kaasa antavaid väärtusi. NB! vaata, et see fail oleks sul kirjeldatud .gitignore failis, et mitte kogemata salajasi väärtusi üles panna.

Faili sisu on järgmine:

pilvio = {
api_key = ""
billing_account_id = ""
}

vm = {
username = ""
password = ""
}

Tühjad väärtused asenda nüüd õigete väärtusega. Kasutajanime ja parooli võid ise välja mõelda. NB! parool peab sisaldama suur- ja väiketähti ning numbrit. Kui sa seda ei tee, saad veateate:

Could not create VM: unexpected error: Pilvio error. Response code: 400, api.pilvio.com /v1/tll01/user-resource/vm:

map[errors:map[password:'password=mannapuder123' is not valid, value must match regular expression
'^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{8,}$']]

Pane ressursid tööle

Kõigepealt testi, kas kõik sai õigesti. Selle jaoks on hea käsk:

terraform plan

Kui kõik korras, näitab terraform Sulle, milliseid ressursse ja kuidas ta plaanib luua. See võimaldab hästi ka vigu avastada. Kusjuures, vajadusel võib plaani ära salvestada ja hiljem käivitadagi selle sama plaani: nii saab garanteerida, et vahepeal ei teki ootamatusi.

Praegu läheme aga lihtsama vastupanu teed ja paneme kohe tööle käsu:

terraform apply

Nüüd koostab terraform uuesti plaani ja palub sul seda ka kinnitada. Kui sa kinnitust ei sisesta, siis ressursse ei looda.

Kui kõik läks edukalt, annab Terraform väljundväärtusena IP aadressi. Selle külastamisel peaksid nägema Nginx lehte:

*Pane tähele, et Sinul on tõenäoliselt teine IP aadress kui pildil. Peale aadressi saamist võib kuluda veidi aega (ca minut), kuni server tööle läheb.

Võta ressursid maha

Kui kõik korras, siis võta ressurssid maha, et Sa asjata nende eest ei maksaks. Selleks pane tööle käsk:

terraform destroy

Leave a comment