Terraform Kodutöö: Moodulid ja Korduvkasutus¶
Navigeerimine
Kasuta paremal olevat sisukorda kiireks navigeerimiseks ↗️
Eesmärk: Õppida Terraform mooduleid ja for_each kasutamist
Projekti Kirjeldus¶
Looge Terraform moodul, mis automatiseerib projektikaustas loomist erinevate meeskondade jaoks. Iga meeskond vajab standardset projektistruktuuri, kuid erinevate seadistustega.
Mida ehitate: - Korduvkasutatav projekti moodul - Mitme meeskonna projektide automaatne loomine - Konfiguratsioonifailide genereerimine
Ülesanne 1: Projekti struktuur (2 punkti)¶
1.1 Kaustade loomine¶
Looge järgmine struktuuri:
bash
terraform-modules-homework/
├── main.tf
├── variables.tf
├── outputs.tf
├── terraform.tfvars
└── modules/
└── project-setup/
├── main.tf
├── variables.tf
└── outputs.tf
text
1.2 Mooduli muutujad¶
Kirjutage modules/project-setup/variables.tf
:
```hcl variable "project_name" { description = "Projekti nimi" type = string
validation { condition = length(var.project_name) > 2 error_message = "Projekti nimi peab olema vähemalt 3 tähemärki." } }
variable "team_name" { description = "Meeskonna nimi" type = string }
variable "environment" { description = "Keskkond (dev, test, prod)" type = string default = "dev"
validation { condition = contains(["dev", "test", "prod"], var.environment) error_message = "Lubatud keskkonnad: dev, test, prod." } }
variable "include_docker" { description = "Kas lisada Docker konfiguratsioon" type = bool default = false } ```text
Ülesanne 2: Mooduli loomine (4 punkti)¶
2.1 Põhiline moodul¶
Kirjutage modules/project-setup/main.tf
:
```hcl
Lokaalid kalkulatsioonid¶
locals { project_full_name = "\({var.team_name}-\)"
# Erinevad seadistused keskkonna kohta env_settings = { dev = { port = 3000 debug = true } test = { port = 3001 debug = true } prod = { port = 80 debug = false } } }
Projekti põhikaust¶
resource "local_file" "project_dir" { content = "" filename = "${local.project_full_name}/.gitkeep" }
Alamkaustad¶
resource "local_file" "subdirs" { for_each = toset(["src", "config", "docs", "scripts"])
content = "" filename = "\({local.project_full_name}/\)/.gitkeep" }
Projekti konfiguratsioon¶
resource "local_file" "config" { content = jsonencode({ project = var.project_name team = var.team_name environment = var.environment settings = local.env_settings[var.environment] created_at = timestamp() })
filename = "${local.project_full_name}/config/project.json" }
README fail¶
resource "local_file" "readme" { content = <<-EOF # ${local.project_full_name}
Text Only | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
EOF
filename = "${local.project_full_name}/README.md" }
Docker konfiguratsioon (tingimislik)¶
resource "local_file" "dockerfile" { count = var.include_docker ? 1 : 0
content = <<-EOF FROM node:16-alpine WORKDIR /app COPY . . EXPOSE ${local.env_settings[var.environment].port} CMD ["npm", "start"] EOF
filename = "${local.project_full_name}/Dockerfile" }
Käivitamise skript¶
resource "local_file" "start_script" { content = <<-EOF #!/bin/bash echo "Käivitan ${local.project_full_name} projekti" echo "Keskkond: ${var.environment}" echo "Port: ${local.env_settings[var.environment].port}"
Text Only | |
---|---|
1 2 3 4 5 |
|
EOF
filename = "${local.project_full_name}/scripts/start.sh" file_permission = "0755" } ```text
2.2 Mooduli väljundid¶
Kirjutage modules/project-setup/outputs.tf
:
```hcl output "project_path" { description = "Projekti kausta tee" value = local.project_full_name }
output "project_info" { description = "Projekti andmed" value = { name = var.project_name team = var.team_name environment = var.environment full_name = local.project_full_name has_docker = var.include_docker } }
output "created_files" { description = "Loodud failid" value = concat([ "\({local.project_full_name}/config/project.json", "\)/README.md", "\({local.project_full_name}/scripts/start.sh" ], var.include_docker ? ["\)/Dockerfile"] : []) } ```text
Ülesanne 3: Mooduli kasutamine (3 punkti)¶
3.1 Peamised muutujad¶
Kirjutage variables.tf
:
hcl
variable "teams" {
description = "Meeskondade ja projektide konfiguratsioon"
type = map(object({
projects = list(object({
name = string
environment = string
include_docker = bool
}))
}))
}
text
3.2 Peamine konfiguratsioon¶
Kirjutage main.tf
:
```hcl terraform { required_providers { local = { source = "hashicorp/local" version = "~> 2.0" } } }
Kõikide projektide nimekiri¶
locals { all_projects = flatten([ for team_name, team in var.teams : [ for project in team.projects : { key = "\({team_name}-\)" team_name = team_name project_name = project.name environment = project.environment include_docker = project.include_docker } ] ])
# Muuda map'iks for_each jaoks projects_map = { for project in local.all_projects : project.key => project } }
Loo kõik projektid¶
module "projects" { source = "./modules/project-setup"
for_each = local.projects_map
project_name = each.value.project_name team_name = each.value.team_name environment = each.value.environment include_docker = each.value.include_docker }
Üldine kokkuvõte¶
resource "local_file" "summary" { content = jsonencode({ total_projects = length(local.all_projects) teams_count = length(var.teams) projects_by_team = { for team_name, team in var.teams : team_name => length(team.projects) } created_at = timestamp() })
filename = "projects-summary.json" } ```text
3.3 Väljundid¶
Kirjutage outputs.tf
:
```hcl output "all_projects" { description = "Kõik loodud projektid" value = { for key, project in module.projects : key => project.project_info } }
output "projects_by_environment" { description = "Projektide arv keskkonniti" value = { for env in ["dev", "test", "prod"] : env => length([ for key, project in module.projects : project.project_info if project.project_info.environment == env ]) } }
output "summary" { description = "Kokkuvõte" value = { total_projects = length(module.projects) total_teams = length(var.teams) docker_projects = length([ for key, project in module.projects : project.project_info if project.project_info.has_docker ]) } } ```bash
Ülesanne 4: Konfiguratsioon ja testimine (1 punkt)¶
4.1 Muutujate väärtused¶
Kirjutage terraform.tfvars
:
```hcl teams = { frontend = { projects = [ { name = "dashboard" environment = "dev" include_docker = true }, { name = "mobile-app" environment = "test" include_docker = false } ] }
backend = { projects = [ { name = "api" environment = "prod" include_docker = true }, { name = "auth-service" environment = "dev" include_docker = true } ] }
devops = { projects = [ { name = "monitoring" environment = "prod" include_docker = false } ] } } ```text
4.2 Käivitamine¶
```bash
Initsialiseerige¶
terraform init
Vaadake plaan¶
terraform plan
Rakendage¶
terraform apply
Kontrollige tulemusi¶
terraform output ls -la cat projects-summary.json ```text
4.3 Testimine¶
-
Käivitage üks projektiskript:
bash chmod +x frontend-dashboard/scripts/start.sh ./frontend-dashboard/scripts/start.sh
text -
Vaadake loodud konfiguratsioonifaile:
bash cat frontend-dashboard/config/project.json cat backend-api/README.md
bash -
Muutke
terraform.tfvars
- lisage uus projekt või muutke environment. Rakendage muudatused.
Esitamise nõuded¶
Kohustuslikud failid¶
- Kõik
.tf
failid (main.tf, variables.tf, outputs.tf) - Mooduli failid
modules/project-setup/
kaustas terraform.tfvars
fail- Kõik genereeritud projektikaustad
projects-summary.json
fail
Demonstratsioon¶
- Näidake, kuidas lisada uut projekti
- Muutke olemasoleva projekti konfiguratsiooni
- Selgitage for_each ja locals kasutamist
Lühike analüüs (0.5 lk)¶
- Mida õppisite moodulite kohta?
- Millised olid keerulisemad osad?
- Kuidas saaksite seda praktikas kasutada?
Hindamise kriteeriumid (10 punkti)¶
- Mooduli struktuur ja töö (3p)
- for_each ja locals kasutamine (3p)
- Konfiguratsioonifailide genereerimine (2p)
- Muutujate valideerimine (1p)
- Dokumentatsioon ja mõistmine (1p)