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
| Yondashuv | IaC oldin | IaC keyin |
|---|---|---|
| Vaqt | Soatlar/kunlar | Daqiqalar |
| Xatolik | Ko'p | Kam |
| Dokumentatsiya | Qo'lda yoziladi | Kod o'zi dokumentatsiya |
| Versiyalash | Qiyin | Oson (Git) |
| Takrorlanish | Qiyin | Oson |
| Testlash | Murakkab | Avtomatlashtirilgan |
IaC foydalanish holatlari:
- Multi-environment deployment: Dev, Staging, Production
- Disaster Recovery: Tezda infratuzilmani tiklash
- Cloud Migration: On-premise'dan cloud'ga o'tish
- Compliance: Xavfsizlik standartlarini qo'llash
- 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
| Xususiyat | Terraform | CloudFormation |
|---|---|---|
| Platform | Multi-cloud (AWS, Azure, GCP, va h.k.) | Faqat AWS |
| Til | HCL (odam o'qishi oson) | JSON/YAML |
| State | Alohida fayl (S3, Terraform Cloud) | AWS tomonidan boshqariladi |
| O'rganish | O'rtacha qiyinlik | Murakkab |
| Community | Juda katta | AWS ekosistema |
| Modullar | Terraform Registry | AWS Marketplace |
| Hisob narxi | Bepul (ochiq manba) | Bepul |
| Rollback | State orqali | Avtomatik 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
| Xususiyat | Terraform | Ansible |
|---|---|---|
| Maqsad | Infratuzilma yaratish (Provisioning) | Konfiguratsiya boshqaruvi |
| Yondashuv | Deklarativ | Imperativ va Deklarativ |
| State | Ha (terraform.tfstate) | Yo'q |
| Ishlatilishi | Cloud resurslar, infratuzilma | Server konfiguratsiya, deployment |
| Idempotency | Ha | Ha |
| Learning Curve | O'rtacha | Oson |
| Agent | Yo'q | Yo'q (agentless) |
| Til | HCL | YAML |
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
| Xususiyat | Terraform | Pulumi |
|---|---|---|
| Til | HCL | Python, TypeScript, Go, C#, Java |
| O'rganish | Yangi til (HCL) | Mavjud dasturlash tillari |
| State | Terraform state | Pulumi state |
| Modullar | HCL modullar | Dasturlash tilining kutubxonalari |
| Testing | Tercera, kitchen-terraform | Standard test framework'lar |
| IDE Support | O'rtacha | Kuchli (dasturlash tillari uchun) |
| Community | Juda katta | O'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:
- Joriy infratuzilma holatini kuzatish
- O'zgarishlarni aniqlash
- Resource metadata saqlash
- Performance optimization
- 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!