Terraform moodulid — Labor (Valik 1)
Kestus: 4 tundi
Tase: Algaste
Eeldused: Nädal 10 — nägid init/plan/apply/destroy tsüklit ja jooksutasid valmis konfiga sama ise. Tead mis on muutuja programmeerimises. Kui udu — tagasi nädal 10 loengusse.
Töökeskkond: oma masin, VS Code, Terraform installitud (terraform -version). local provider — loob faile ainult su kettal, serverit ega kontot vaja pole.
Õpiväljundid
Selle labi lõpuks sa:
- Selgitad mis vahe on
main.tf,variables.tf,outputs.tffailidel - Kirjutad nullist HCL-i, mis loob resource'i
- Kasutad muutujaid (
var.nimi) ja väljundeid (output) - Ehitad korduvkasutatava mooduli ja kutsud seda mitu korda erinevate sisenditega
Labi loogika: HCL nullist → muutujad → outputs → moodul → korda kaks korda. Sa kirjutad iga rea ise (mitte ei kopeeri suurt näidet) — nii jääb süntaks meelde. Fragmendid, testid igal sammul.
Osa 1 · Esimene HCL nullist
Nädal 10 nägid valmis .tf faili teise kirjutatuna. Täna kirjutad rea-realt ise. Tee uus tühi kaust, ava VS Code'is:
1.1 Minimaalne resource
Loo main.tf, tipi käsitsi (ära kopeeri):
terraform {
required_providers {
local = {
source = "hashicorp/local"
version = "~> 2.5"
}
}
}
resource "local_file" "tervitus" {
filename = "tervitus.txt"
content = "Tere, Terraform!"
}
Ainult üks resource — muutujad ja outputid tulevad hiljem.
Terraform has been successfully initialized! + uued .terraform/ ja .terraform.lock.hcl.
Tip
Failed to install provider — kontrolli internetti, init laeb plugina ainult esimesel korral.
Mõtle
Mis on .terraform/ ja .terraform.lock.hcl, ja miks Terraform neid enne plan-i vajab?
1.2 Plan ja apply
+ create näitab mida tehtaks, ei tee veel midagi.
Kinnita yes enne kui fail tekib.
Tip
Korduval testimisel terraform apply -auto-approve jätab kinnituse vahele. Tavatöös on kinnituse lugemine turvavõrk — ära harju -auto-approve-ga.
Mõtle
Mille poolest erineb local_file resource tavalisest echo "tekst" > fail.txt käsust? Miks selleks Terraform?
1.3 State ja lahknevus
JSON, kus Terraform peab arvet mida ta on loonud. State ütleb mis peaks olemas olema, plan võrdleb tegelikkusega. Tekita lahknevus:
Terraform tahab faili taastada — state ütleb et peaks olema. Taasta apply-ga.
1.4 Destroy
Kinnita yes, kontrolli et fail kadus.
Mõtle
Mis tundub teisiti sama init → plan → apply → destroy tsükli juures, kui ise iga rea kirjutasid, võrreldes õpetaja ekraani vaatamisega nädal 10?
Osa 2 · Muutujad
Kõvasti kirjutatud "tervitus.txt" töötab, aga teise nimega faili jaoks pead koodi muutma. Muutuja lahutab sisendi konfist.
2.1 Üks muutuja
Loo variables.tf:
Muuda main.tf, asenda string viitega:
default on sama → tulemus sama. Esimene test enne edasi minemist.
Tip
Kirjutad variable bloki, aga unustad main.tf-is var.faili_nimi kasutada — muutuja jääb kasutuks. Kontrolli alati et iga uus muutuja on päriselt kasutuses.
2.2 Ülekirjutamine käsurealt
Mõtle
Miks on default mugav arenduses, aga tootmises tahaks meeskond ehk nõuda et väärtus antaks alati eksplitsiitselt?
2.3 Teine muutuja — sisu
variables.tf-i:
main.tf-i:
Tip
plan näitab destroy + create lihtsa muutuse asemel? Normaalne kui filename muutub — fail loetakse uueks resource'iks.
Osa 3 · Outputs
Kui konfig loob midagi, tahad tulemust näha ilma faile otsimata — ja Osas 4–5 väärtust edasi anda.
3.1 Esimene output
Loo outputs.tf:
output "loodud_faili_nimi" {
description = "Loodud faili nimi"
value = local_file.tervitus.filename
}
Mõtle
local_file.tervitus.filename — mis need kolm osa tähendavad? Kust said need nimed, kui vaatad main.tf-i?
3.2 Teine output — räsi
local_file loob automaatselt content_md5:
Tip
Atribuudi nimi valesti (nt content_hash) → plan annab Unsupported attribute. Veateade ütleb mis atribuudid on saadaval.
Osa 4 · Moodul
Sul on üks fail, mis loob ühe teksti-faili. Kümne jaoks kopeeriksid koodi kümme korda. Moodul pakib loogika korduvkasutatavaks üksuseks — nagu funktsioon.
4.1 Mooduli kaust
modules/<nimi>/ on Terraformi kokkulepe — juur kutsub, alamkataloogid on moodulid.
4.2 Tõsta kood moodulisse
modules/tekstifail/main.tf (ilma terraform { required_providers } plokita — see jääb ainult juurde):
modules/tekstifail/variables.tf:
variable "faili_nimi" {
type = string
}
variable "faili_sisu" {
type = string
default = "Tere, Terraform!"
}
Tip
faili_nimi-l pole default-i — iga mooduli kutse peab failinime andma, muidu tekiks mitme kutse vahel konflikt.
modules/tekstifail/outputs.tf:
output "faili_nimi" {
value = local_file.see.filename
}
output "sisu_rasi" {
value = local_file.see.content_md5
}
4.3 Kutsu moodulit juurest
Kirjuta juure main.tf ümber — kutsub moodulit resource'i asemel:
terraform {
required_providers {
local = {
source = "hashicorp/local"
version = "~> 2.5"
}
}
}
module "tervitus" {
source = "./modules/tekstifail"
faili_nimi = var.faili_nimi
faili_sisu = var.faili_sisu
}
Uuenda juure outputs.tf viitama moodulile:
output "loodud_faili_nimi" {
value = module.tervitus.faili_nimi
}
output "sisu_rasi" {
value = module.tervitus.sisu_rasi
}
4.4 Testi
Tip
Module not installed — iga kord kui lisad/muudad module plokki, jooksuta init uuesti (mitte ainult provider'ite jaoks).
Mõtle
Ava terraform.tfstate. Kuidas erineb resource'i nimi state's (module.tervitus.local_file.see) võrreldes varasemaga (local_file.tervitus)?
Osa 5 · Kutsu moodulit kaks korda
See ongi mooduli mõte — üks kood, mitu kasutuskorda.
5.1 Teine kutse
main.tf-i kaks module plokki, erineva nimega:
module "tervitus" {
source = "./modules/tekstifail"
faili_nimi = var.faili_nimi
faili_sisu = var.faili_sisu
}
module "logi" {
source = "./modules/tekstifail"
faili_nimi = "logi.txt"
faili_sisu = "Loodud teise mooduli kutsega."
}
Tip
Sama faili_nimi mõlemale → mõlemad kirjutavad sama faili, üks üle teise. Terraform seda plan-i tasemel ei keela. Kontrolli et sisendid ei kattu.
5.2 Outputid
output "tervituse_fail" {
value = module.tervitus.faili_nimi
}
output "logi_fail" {
value = module.logi.faili_nimi
}
5.3 Testi kogu tsükkel
Kontrolli et mõlemad failid tekkisid ja siis kadusid.
Mõtle
Kui homme peaksid tegema kümme faili erinevate sisenditega, mis muutub main.tf-is ja mis jääb samaks modules/tekstifail/-is?
Lõppkontroll — oskad ilma juhendita
- Juurkataloogis
main.tf,variables.tf,outputs.tf+modules/tekstifail/kolme failiga -
terraform validateei anna viga -
terraform plannäitab null muudatust kui midagi pole muudetud -
applyloob kaks faili kahe mooduli kutsega -
terraform outputnäitab vähemalt nelja väljundit -
destroykustutab mõlemad,ls *.txttühi - Selgitad mille poolest
module "logi" {}erineb otse resource'i kirjutamisest
Lisaülesanded (kui jõuad ette)
- Loop: uuri
for_each/count, loo viis faili ühemoduleplokiga. - Uus resource: uuri mis muid resource'e
hashicorp/localpakub, lisa moodulisse kaustaloomine. - Aheldamine: kolmas kutse, mille
faili_sisusõltub teise mooduli outputist (module.logi.sisu_rasi).
Veaotsing
| Probleem | Lahendus |
|---|---|
terraform: command not found |
Pole PATH-is — which terraform, installi |
Failed to install provider |
Kontrolli võrku; kustuta .terraform/, init uuesti |
Unsupported argument |
Kirjaviga atribuudis — kontrolli local_file dokke |
Reference to undeclared resource/module |
Viitad millelegi defineerimata, või kirjaviga |
Module not installed |
terraform init uuesti — iga uus/muudetud module vajab init'i |
| Kaks moodulit kirjutavad sama faili | Iga kutse faili_nimi unikaalseks |
plan tahab faili taastada |
Fail kustutati/muudeti käsitsi — state vs tegelikkus lahknevad |
destroy ei kustuta |
Vale kaust — terraform.tfstate peab samas olema |
Tabel 11.2. Levinumad tõrked ja lahendused.
Allikad
| Allikas | URL |
|---|---|
| Local Provider | https://registry.terraform.io/providers/hashicorp/local/latest/docs |
| Terraform Modules (õpetus) | https://developer.hashicorp.com/terraform/tutorials/modules/module |
| Terraform Language | https://developer.hashicorp.com/terraform/language |
| CLI Commands | https://developer.hashicorp.com/terraform/cli/commands |