🏗️ Terraform Language (HCL)
Providers, Resources, Variables, Outputs, Locals, Data Sources
📦 Providers
Provider — cloud yoki xizmat bilan API orqali ishlaydi. Terraform Registry'dan yuklanadi. required_providers block. Provider versioning: `~> 5.0` (minor va patch update). Multiple provider instances — alias.
🏗️ Resources
Infratuzilma komponenti. `resource "TYPE" "NAME"`. Resource TYPE — `provider_resourcetype` formatida. Resource da'volar: meta-arguments: `depends_on`, `count`, `for_each`, `provider`, `lifecycle`.
📝 Variables, Outputs, Locals
Input Variables: `var.name`, `variable` block, type, default, validation. Output Values: boshqa module/root module ga qiymat qaytarish. Locals: modul ichida expression cache (local.name). Variable precedence: env var > .tfvars > default.
🔍 Data Sources
`data` block — mavjud infratuzilmani o'qish (Terraform yaratmagan). Masalan: mavjud VPC ID ni olish, latest AMI ID. `data.TYPE.NAME.attribute` orqali murojaat.
💡 Asosiy nuqtalar
- resource "aws_instance" "web" {} — resurs yaratish
- var.name — input variable
- output "ip" { value = ... } — output qiymat
- local.name — expression cache
- data "aws_ami" "latest" {} — mavjud resursni o'qish
- count va for_each — ko'p resurs yaratish
📋 Kod misoli
# Provider konfiguratsiya
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.region
}
# Variable
variable "region" {
type = string
description = "AWS Region"
default = "us-east-1"
}
variable "instance_count" {
type = number
default = 2
}
# Resource (with for_each)
resource "aws_instance" "web" {
count = var.instance_count
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
tags = {
Name = "web-${count.index}"
Env = local.env
}
}
# Locals
locals {
env = "production"
}
# Data source
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-*-22.04-amd64-*"]
}
owners = ["099720109477"] # Canonical
}
# Output
output "instance_ips" {
value = aws_instance.web[*].public_ip
}
🎯 Imtihon maslahatlari
- count vs for_each: count — bir xil resurslar (indexed [0],[1]...), for_each — map/set (named instances, refactor da xavfsizroq)
- depends_on — implicit dependency Terraform topolmayotganda manual belgilash uchun (odatda ref = implicit dependency)
- lifecycle { prevent_destroy = true } — accidental `terraform destroy` dan production resursni himoya qilish
- sensitive = true — output va variable da; log da masklash, lekin state da ochiq saqlanadi
- `terraform console` — interactive HCL expression sinab ko'rish (masalan: `toset(["a","b"])`)
⚠️ Ko'p adashadigan
- for_each string set da order kafolatlanadi deb o'ylash — set orderless, map ishlatish afzal
- output sensitive = true bo'lsa state da ham yashiriladi deb o'ylash — state da plain text
- Data source va resource bir xil deb o'ylash: data = READ ONLY, resource = CREATE/UPDATE/DELETE
🧠 Eslab qolish: "VROLED" = Variables (input), Resources, Outputs, Locals, External-data (data sources), Dependencies — HCL asosiy bloklar
Terraform Language (HCL) bo'yicha o'zingizni sinab ko'ring
Bepul interaktiv quiz, mock imtihon va to'liq darslar — CertMaster platformasida.
Bepul boshlash →