Skip to main content

IaC va Terraform Kirish

Infrastructure as Code (IaC) nima?

Infrastructure as Code (IaC) - bu IT infratuzilmasini kod orqali boshqarish va avtomatlashtirish metodologiyasi. IaC yordamida serverlar, tarmoqlar, ma'lumotlar bazalari va boshqa infratuzilma komponentlari kod orqali yaratiladi va boshqariladi.

IaC ning afzalliklari:

  • Versiyalash: Git kabi versiya boshqaruv tizimlarida saqlash mumkin
  • Qayta ishlatish: Bir xil infratuzilmani bir necha marta yaratish oson
  • Avtomatlashtirish: Qo'lda bajarilishi kerak bo'lgan ishlar kamayadi
  • Hujjatlashtirish: Kod o'zi hujjat vazifasini bajaradi
  • Doimiylik: Har safar bir xil natija olish kafolati
  • Tezlik: Infratuzilmani bir necha daqiqada yaratish mumkin
  • Xavfsizlik: Kod orqali xavfsizlik qoidalarini qo'llash oson
  • Testlash: Infratuzilmani test muhitida sinab ko'rish mumkin

IaC turlari:

1. Deklarativ (Declarative)

Nima kerakligini belgilaysiz

# Terraform misoli - Deklarativ
resource "aws_instance" "web" {
ami = "ami-123456"
instance_type = "t2.micro"

tags = {
Name = "WebServer"
}
}

Xususiyatlari:

  • Yakuniy holatni tasvirlaysiz
  • Terraform, CloudFormation, Pulumi
  • O'qish va tushunish oson
  • Idempotent (bir xil natija)

2. Imperativ (Imperative)

Qanday qilishni belgilaysiz

# Ansible misoli - Imperativ
- name: Install nginx
apt:
name: nginx
state: present

- name: Start nginx
service:
name: nginx
state: started

Xususiyatlari:

  • Qadam-baqadam ko'rsatmalar
  • Ansible, Chef, Puppet
  • Murakkab mantiq uchun yaxshi
  • Procedural yondashuv

IaC yondashuvlari

YondashuvIaC oldinIaC keyin
VaqtSoatlar/kunlarDaqiqalar
XatolikKo'pKam
DokumentatsiyaQo'lda yoziladiKod o'zi dokumentatsiya
VersiyalashQiyinOson (Git)
TakrorlanishQiyinOson
TestlashMurakkabAvtomatlashtirilgan

IaC foydalanish holatlari:

  1. Multi-environment deployment: Dev, Staging, Production
  2. Disaster Recovery: Tezda infratuzilmani tiklash
  3. Cloud Migration: On-premise'dan cloud'ga o'tish
  4. Compliance: Xavfsizlik standartlarini qo'llash
  5. Cost Optimization: Resurslarni samarali boshqarish

Terraform nima?

Terraform - bu HashiCorp kompaniyasi tomonidan yaratilgan ochiq manbali Infrastructure as Code vositasi. U deklarativ konfiguratsiya tilini ishlatadi va multi-cloud platformalarni qo'llab-quvvatlaydi.

Terraform tarixi:

  • 2014: Terraform 0.1 versiyasi chiqdi
  • 2015: Terraform 0.6 - remote state qo'shildi
  • 2017: Terraform 0.9 - state locking
  • 2019: Terraform 0.12 - HCL 2.0
  • 2021: Terraform 1.0 - stable release
  • 2023: Terraform 1.5+ - hozirgi versiyalar

Terraform ning asosiy xususiyatlari:

1. Multi-Cloud qo'llab-quvvatlash

# AWS
provider "aws" {
region = "us-east-1"
}

# Azure
provider "azurerm" {
features {}
}

# Google Cloud
provider "google" {
project = "my-project"
region = "us-central1"
}

Qo'llab-quvvatlanadigan platformalar:

  • AWS (Amazon Web Services)
  • Azure (Microsoft Azure)
  • GCP (Google Cloud Platform)
  • Alibaba Cloud
  • Digital Ocean
  • VMware
  • Kubernetes
  • Docker
  • Va 1000+ boshqa provayderlar

2. Deklarativ sintaksis (HCL)

# Nimani xohlashingizni yozing
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"

tags = {
Name = "main-vpc"
}
}

3. Plan va Apply workflow

# 1. O'zgarishlarni ko'rish
terraform plan

# Output:
# + create aws_instance.web
# + create aws_security_group.web

# 2. Tasdiqlash va qo'llash
terraform apply

4. State Management

# Terraform state - joriy holatni saqlash
{
"version": 4,
"resources": [
{
"type": "aws_instance",
"name": "web",
"instances": [...]
}
]
}

5. Modullar

# Qayta ishlatilishi mumkin bo'lgan komponentlar
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "3.0.0"

name = "my-vpc"
cidr = "10.0.0.0/16"
}

6. Resurs bog'liqligi

# Terraform avtomatik bog'liqliklarni aniqlaydi
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id # Bog'liqlik
cidr_block = "10.0.1.0/24"
}

# Terraform birinchi VPC, keyin Subnet yaratadi

Terraform vs Boshqa IaC vositalari

Terraform vs AWS CloudFormation

XususiyatTerraformCloudFormation
PlatformMulti-cloud (AWS, Azure, GCP, va h.k.)Faqat AWS
TilHCL (odam o'qishi oson)JSON/YAML
StateAlohida fayl (S3, Terraform Cloud)AWS tomonidan boshqariladi
O'rganishO'rtacha qiyinlikMurakkab
CommunityJuda kattaAWS ekosistema
ModullarTerraform RegistryAWS Marketplace
Hisob narxiBepul (ochiq manba)Bepul
RollbackState orqaliAvtomatik rollback

Terraform ustunligi:

  • Multi-cloud loyihalar uchun
  • HCL sintaksisi oson
  • Katta community va modullar

CloudFormation ustunligi:

  • AWS bilan to'liq integratsiya
  • Rollback mexanizmi
  • AWS xizmatlari bilan bevosita ishlash

Terraform vs Ansible

XususiyatTerraformAnsible
MaqsadInfratuzilma yaratish (Provisioning)Konfiguratsiya boshqaruvi
YondashuvDeklarativImperativ va Deklarativ
StateHa (terraform.tfstate)Yo'q
IshlatilishiCloud resurslar, infratuzilmaServer konfiguratsiya, deployment
IdempotencyHaHa
Learning CurveO'rtachaOson
AgentYo'qYo'q (agentless)
TilHCLYAML

Qachon Terraform?

  • Cloud infratuzilmasini yaratish
  • VPC, subnet, security group yaratish
  • Cloud resurslarni boshqarish

Qachon Ansible?

  • Server'larga dastur o'rnatish
  • Konfiguratsiya fayllarini boshqarish
  • Deployment va update'lar

Birgalikda ishlatish:

# Terraform - infratuzilma yaratadi
resource "aws_instance" "web" {
ami = "ami-123456"
instance_type = "t2.micro"

provisioner "local-exec" {
command = "ansible-playbook -i ${self.public_ip}, playbook.yml"
}
}

Terraform vs Pulumi

XususiyatTerraformPulumi
TilHCLPython, TypeScript, Go, C#, Java
O'rganishYangi til (HCL)Mavjud dasturlash tillari
StateTerraform statePulumi state
ModullarHCL modullarDasturlash tilining kutubxonalari
TestingTercera, kitchen-terraformStandard test framework'lar
IDE SupportO'rtachaKuchli (dasturlash tillari uchun)
CommunityJuda kattaO'sib bormoqda

Terraform ustunligi:

  • Oddiy va o'rganish oson
  • Katta community
  • Ko'p ready-made modullar

Pulumi ustunligi:

  • Dasturlash tilini ishlatasiz
  • Murakkab mantiq uchun yaxshi
  • Type safety

Qachon qaysi vositani ishlatish?

┌─────────────────────────────────────────────────┐
│ Infratuzilma yaratish kerakmi? │
│ ├─ Ha → Terraform yoki Pulumi │
│ └─ Yo'q → Quyiga o'ting │
└─────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────┐
│ Multi-cloud kerakmi? │
│ ├─ Ha → Terraform (eng yaxshi tanlov) │
│ └─ Yo'q → CloudFormation (faqat AWS uchun) │
└─────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────┐
│ Konfiguratsiya boshqaruvi kerakmi? │
│ ├─ Ha → Ansible │
│ └─ Yo'q → Terraform kifoya │
└─────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────┐
│ Dasturlash tilini ishlatmoqchimisiz? │
│ ├─ Ha → Pulumi │
│ └─ Yo'q → Terraform │
└─────────────────────────────────────────────────┘

Terraform qachon ishlatiladi?

Terraform uchun eng yaxshi holatlar:

1. Multi-cloud infratuzilma

# AWS va Azure'da bir vaqtda
provider "aws" {
region = "us-east-1"
}

provider "azurerm" {
features {}
}

resource "aws_s3_bucket" "aws_storage" {
bucket = "my-aws-bucket"
}

resource "azurerm_storage_account" "azure_storage" {
name = "myazurestorage"
resource_group_name = "my-resources"
}

2. Infratuzilmani versiyalash

# Git bilan versiyalash
git init
git add *.tf
git commit -m "Initial infrastructure"
git tag -a v1.0 -m "Production ready"

# Keyin rollback qilish mumkin
git checkout v1.0
terraform apply

3. Bir necha muhitni boshqarish

project/
├── environments/
│ ├── dev/
│ │ ├── main.tf
│ │ └── terraform.tfvars
│ ├── staging/
│ │ ├── main.tf
│ │ └── terraform.tfvars
│ └── prod/
│ ├── main.tf
│ └── terraform.tfvars
└── modules/
└── vpc/
└── main.tf

4. Murakkab bog'liqliklar

# Terraform avtomatik tartibini aniqlaydi
resource "aws_vpc" "main" { }
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
}
resource "aws_instance" "web" {
subnet_id = aws_subnet.public.id
}

# Tartib: VPC → Subnet → Instance

5. CI/CD pipeline integration

# GitHub Actions misoli
name: Terraform
on: [push]
jobs:
terraform:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Terraform Init
run: terraform init
- name: Terraform Plan
run: terraform plan
- name: Terraform Apply
run: terraform apply -auto-approve

6. Katta jamoalarda ishlash

# Remote state - jamoa bilan ishlash uchun
terraform {
backend "s3" {
bucket = "team-terraform-state"
key = "prod/terraform.tfstate"
region = "us-east-1"

# State locking
dynamodb_table = "terraform-locks"
}
}

Terraform ishlatmaslik kerak bo'lgan holatlar:

1. Oddiy skriptlar yetarli

# Buning uchun Terraform kerak emas
#!/bin/bash
aws s3 mb s3://my-simple-bucket

2. Faqat konfiguratsiya boshqaruvi

# Ansible yaxshiroq
- name: Configure web servers
hosts: webservers
tasks:
- name: Install nginx
apt: name=nginx state=present

3. Real-time o'zgarishlar

# Lambda funksiya yaxshiroq
def lambda_handler(event, context):
# Real-time processing
return {'statusCode': 200}

4. Terraform qo'llab-quvvatlamaydigan xizmatlar

# Agar provider yo'q bo'lsa, API'ni to'g'ridan-to'g'ri chaqirish
curl -X POST https://api.custom-service.com/create

Terraform ishlash printsipi

Terraform workflow:

1. WRITE (Yozish)

├─ main.tf
├─ variables.tf
└─ outputs.tf

2. INIT (Ishga tushirish)

terraform init
├─ Provider'larni yuklab olish
├─ Module'larni yuklab olish
└─ Backend'ni sozlash

3. PLAN (Rejalashtirish)

terraform plan
├─ State faylni o'qish
├─ Konfiguratsiyani tahlil qilish
├─ Kerakli holatni hisoblash
└─ O'zgarishlarni ko'rsatish

4. APPLY (Qo'llash)

terraform apply
├─ Plan'ni bajarish
├─ API so'rovlar yuborish
├─ Resurslarni yaratish/o'zgartirish
└─ State'ni yangilash

5. INFRASTRUCTURE (Natija)

├─ Cloud resources
├─ Running servers
└─ Configured network

Batafsil workflow diagrammasi:

┌─────────────────────────────────────────────────┐
│ Developer │
│ ├─ Konfiguratsiya yozadi (*.tf fayllar) │
│ └─ Git'ga commit qiladi │
└────────────────┬────────────────────────────────┘


┌─────────────────────────────────────────────────┐
│ terraform init │
│ ├─ .terraform/ katalog yaratadi │
│ ├─ Provider plugin'larini yuklab oladi │
│ ├─ Module'larni yuklab oladi │
│ └─ Backend'ni initialize qiladi │
└────────────────┬────────────────────────────────┘


┌─────────────────────────────────────────────────┐
│ terraform plan │
│ ├─ Konfiguratsiya fayllarni o'qiydi │
│ ├─ State faylni o'qiydi │
│ ├─ Provider API'ga query yuboradi │
│ ├─ Joriy va kerakli holatni taqqoslaydi │
│ └─ Execution plan yaratadi │
└────────────────┬────────────────────────────────┘


┌─────────────────────────────────────────────────┐
│ Foydalanuvchi tasdiqlaydi │
│ ├─ Plan natijalarini ko'rib chiqadi │
│ └─ Ha/Yo'q deydi │
└────────────────┬────────────────────────────────┘


┌─────────────────────────────────────────────────┐
│ terraform apply │
│ ├─ Execution plan'ni bajaradi │
│ ├─ Provider API'ga CRUD so'rovlar yuboradi │
│ ├─ Resurslarni yaratadi/yangilaydi │
│ ├─ State faylni yangilaydi │
│ └─ Output'larni ko'rsatadi │
└────────────────┬────────────────────────────────┘


┌─────────────────────────────────────────────────┐
│ Cloud Provider (AWS/Azure/GCP) │
│ ├─ Resurslar yaratildi │
│ ├─ Infratuzilma tayyor │
│ └─ Monitoring boshlandi │
└─────────────────────────────────────────────────┘

Terraform komponentlari:

1. Terraform Core

Terraform Core dasturi:
├─ Go tilida yozilgan
├─ Plugin arxitekturasi
├─ Resource graph yaratadi
├─ State management
└─ Execution engine

2. Providers

Provider plugin'lar:
├─ Cloud API bilan aloqa
├─ CRUD operatsiyalari
├─ Resource schema
└─ Versiyalash

3. State

terraform.tfstate:
├─ JSON format
├─ Infratuzilma holati
├─ Resource metadata
└─ Dependencies

4. Configuration

*.tf fayllar:
├─ HCL sintaksis
├─ Resources
├─ Variables
├─ Outputs
└─ Modules

5. Modules

Qayta ishlatish:
├─ Logical grouping
├─ Encapsulation
├─ Versioning
└─ Sharing (Terraform Registry)

State Management muhimligi:

# State fayl misoli
{
"version": 4,
"terraform_version": "1.5.0",
"serial": 1,
"lineage": "xxxx-xxxx-xxxx",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "aws_instance",
"name": "web",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"schema_version": 1,
"attributes": {
"id": "i-1234567890abcdef0",
"ami": "ami-123456",
"instance_type": "t2.micro",
"public_ip": "1.2.3.4"
}
}
]
}
]
}

State fayl nima uchun muhim:

  1. Joriy infratuzilma holatini kuzatish
  2. O'zgarishlarni aniqlash
  3. Resource metadata saqlash
  4. Performance optimization
  5. Jamoa bilan ishlash (remote state)

Xulosa

Terraform - bu zamonaviy infratuzilmani kod orqali boshqarish uchun eng mashhur vositalardan biri. U:

✅ Multi-cloud qo'llab-quvvatlaydi ✅ Deklarativ va oson sintaksisga ega ✅ Katta community va modullar ✅ State management bilan ishonchli ✅ CI/CD bilan yaxshi integratsiya

Keyingi mavzuda Terraform'ni o'rnatish va birinchi loyiha yaratishni o'rganamiz!