Infrastructure as Code: Terraform, Ansible
Infrastructure as Code: Terraform, Ansible
1) Niyə IaC və hansı alətlər fərqlənir
Terraform - deklarativ orchestrator-IaC: bulud infrastrukturunu (VPC, K8s, LB, DB, IAM) provayderlər vasitəsilə yaradır/dəyişir. Resursların həyat dövrünü idarə edir və vəziyyəti saxlayır.
Ansible - prosedur config-IaC və konfiqurasiya menecmenti: hostları/proqramları (paketlər, fayllar, xidmətlər) konfiqurasiya edir, tətbiqlərin provizinq, temperatinq, addımların orkestrləşdirilməsini bilir. Agent olmadan (SSH/WinRM), vəzifələrin idempotentliyi ilə.
Kombinasiya: Terraform - «platforma nədən hazırlanır», Ansible - «necə qurulur və işə salınır».
2) Repozitorların və layların strukturu
3 qat tövsiyə olunur:1. Foundation (Landing Zone): şəbəkələr, IAM, KMS, əsas jurnallar/monitorinq.
2. Platforma: Kubernetes klasterləri, bazalar, növbələr, observability-yığını.
3. Workloads: məkanlar/nişanlar, xidmət hesabları, siyasətçilər, konfiqlər.
Repo:- 'iac/terraform/' - modullar və mühit (' modules/', 'envs/').
- 'iac/ansible/' - rollar (' roles/'), playbooks ('playbooks/'), inventarlar (' inventories/').
- 'policies/' - OPA/Conftest qaydaları.
- 'pipelines/' - CI/CD skriptləri (lint/plan/apply/test).
3) Terraform: modullar, state, mühit
3. 1 Modullar
Kiçik, təkrar istifadə: 'vpc', 'eks', 'rds', 'redis', 'alb', 'iam-role'.
Giriş → 'variables. tf ', çıxışlar →' outputs. tf ', versiyalar - modulların reyestri/git etiketləri vasitəsilə.
hcl module "vpc" {
source = "git::ssh://git@repo/iac. git//modules/vpc? ref=v1. 6. 0"
name = "prod-core"
cidr = "10. 0. 0. 0/16"
azs = ["eu-central-1a","eu-central-1b"]
}
3. 2 State (state)
Uzaqdan backend (S3/GCS + DynamoDB/LockTable) + bloklama.
Ətraf bölgü: 'prod. tfstate`, `staging. tfstate`.
State-drift: cədvəl üzrə CI-də 'terraform plan'; drift zamanı alert.
hcl terraform {
backend "s3" {
bucket = "iac-state"
key = "prod/network/terraform. tfstate"
region = "eu-central-1"
dynamodb_table = "iac-locks"
encrypt = true
}
}
3. 3 Workspaces / Envs
Variantlar:- Ayrı-ayrı kataloqlar 'envs/prod', 'envs/stage' (vizual).
- Workspaces yüngül varyasyonlar üçün, lakin sirləri qarışdırmaq qarşısını almaq.
- 'tfvars' vasitəsilə parametrlər: 'prod. tfvars`, `stage. tfvars`.
4) Ansible: rollar, inventar, idempotent
4. 1 Rollar və Playbook
Galaxy standartı:
roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Playbook nümunəsi:
yaml
- hosts: web become: true roles:
- role: nginx vars:
nginx_listen_port: 8080
4. 2 Inventarlar və dinamika
`inventories/prod/hosts. yml '+ dəyişənlər' group _ vars/host _ vars '.
Dinamik inventar: 'aws _ ec2', 'gcp _ compute', 'kubernetes. core`.
4. 3 İdempotentlik
Modulları ('shell' deyil) mümkün olan yerlərdə istifadə edin.
'changed _ when '/' check _ mode' quru qaçışlar üçün.
Handlers yalnız dəyişikliklər zamanı əks olunur.
5) Sirləri və konfiqləri
Terraform: 'sensitive = true' vasitəsilə qiymətlərin ifrazatı; öz sirləri state deyil (AWS Secrets Manager/HashiCorp Vault/KMS-də saxlayın və məlumat mənbəyinə müraciət edin).
Ansible: Dəyişən şifrələmə üçün Vault ('ansible-vault encrypt'), HashiCorp Vault/KMS ilə inteqrasiya.
GitOps: ayrı repo/saxlama sirləri, least-privilege.
6) Siyasət və uyğunluq (Code kimi siyasət)
Terraform planları üçün OPA/Conftest: açıq S3, açıq SG, qeyd olunmamış resurslar (tags) qadağan.
Terraform Cloud/Enterprise - alternativ olaraq Sentinel.
Ansible Lint: stil və təhlükəsizlik ('sudo: yes' lazım olmayan yerdə, raw-shell olmadan).
rego package terraform. security
deny[msg] {
input. resource_type == "aws_security_group_rule"
input. values. cidr_blocks[_] == "0. 0. 0. 0/0"
input. values. from_port == 22 msg:= "SSH from 0. 0. 0. 0/0 is forbidden"
}
7) IaC test
Terraform: inteqrasiya yoxlamaları üçün 'tflint', 'tfsec '/' checkov', Terratest (Go).
Ansible: 'ansible-lint', rolları yoxlamaq üçün Molecule (+ Docker/Podman/EC2).
apply sonra smouk testlər: HTTP probes, port/proseslər, hüquqlar.
8) CI/CD и GitOps
Paypline (Pull/Merge Request):1. Lint/Sec: tflint, tfsec/checkov, ansible-lint.
2. Plan: «terraform plan» əsərinin nəşri ilə (MR-də şərh).
3. Policy Gate: Conftest/Sentinel.
4. Apply (manual/approved): yalnız artefaktların imzası ilə main.
5. Ansible deploy: '--check' on stage, sonra '--diff' in prod.
6. Post-checks: sintetik/Probe, dashboard annotation release.
GitOps:- Manifestləri həqiqət mənbəyi kimi saxlayın; Kubernetes üçün Argo CD/Flux, lakin əsas klasterlər/primitivlər - Terraform vasitəsilə.
9) Kubernetes üçün nümunələr, şəbəkələr, DB
9. 1 Kubernetes
Terraform: EKS/GKE/AKS klasterləri, qovşaqları, IAM, StorageClass, LB.
Ansible: AMI/bastionların hazırlanması, şəkillərin/anbarların yığılması, post-install (loqgerlər/agentlər/OTel).
9. 2 Şəbəkə və perimetr
Terraform: VPC/alt şəbəkələr/NAT/Transit-Gateway/WAF, marşrutlar.
Ansible: NGINX/Envoy/HAProxy, TLS, Config WAF qaydaları.
9. 3 Bazalar/caches/növbələr
Terraform: RDS/CloudSQL parametr qrupları, Redis/ElastiCache, Kafka/MSK.
Ansible: cache qızdırılması, miqrasiya tapşırıqları, backup/agent konfiqurasiya.
10) Konfiqurasiya nümunələri
10. 1 Terraform — RDS PostgreSQL + SG
hcl module "db" {
source = "terraform-aws-modules/rds/aws"
engine = "postgres"
engine_version = "15. 4"
instance_class = "db. m6g. large"
allocated_storage = 100 name = "core"
username = var. db_user password = var. db_password # см. secret data source vpc_security_group_ids = [module. db_sg. security_group_id]
multi_az = true backup_retention = 7
}
module "db_sg" {
source = "terraform-aws-modules/security-group/aws"
name = "db-core"
vpc_id = module. vpc. vpc_id ingress_cidr_blocks = ["10. 0. 0. 0/8"]
ingress_rules = ["postgresql-tcp"]
}
10. 2 Terraform - gizli məlumat mənbəyi
hcl data "aws_secretsmanager_secret_version" "db" {
secret_id = "prod/db/core"
}
variable "db_password" {
type = string sensitive = true default = jsondecode(data. aws_secretsmanager_secret_version. db. secret_string). password
}
10. 3 Ansible - postgresql-client rolu (fraqment)
yaml
- name: Install packages apt:
name: [ "postgresql-client-15" ]
state: present update_cache: yes
- name: Create. pgpass copy:
dest: /home/deploy/.pgpass mode: '0600'
content: "{{ db_host }}:5432:core:{{ db_user }}:{{ db_password }}"
no_log: true
- name: Smoke query shell: psql -h {{ db_host }} -U {{ db_user }} -d core -c "select 1"
register: psql_out changed_when: false
10. 4 Ansible - Temperatur ilə NGINX
yaml
- name: Deploy nginx. conf template:
src: templates/nginx. conf. j2 dest: /etc/nginx/nginx. conf notify: Restart nginx
- name: Ensure nginx running service:
name: nginx state: started enabled: true
handlers:
- name: Restart nginx service: { name: nginx, state: restarted }
11) Drift və uyğunluğun idarə edilməsi
Periodik 'terraform plan' read-only açar; uyğunsuzluq zamanı bilet yaradır.
Kritik rollar üçün ansible --check (audit rejimi).
Hesabatlar: yerinə yetirilməmiş OPA/Conftest siyasətləri, etiketsiz resurslar/backup/monitorinq.
12) Müşahidə və audit
Log 'terraform apply' və planların artefaktları - obyektin anbarında saxlayın.
Ansible: 'callback _ plugins' (json) → mərkəzi log/ELK; job ID, commit SHA, trace_id daxil edin.
Metriklər: planların/pleybukların icra müddəti, dəyişmə tezliyi, testlərin əhatə dairəsi.
13) Təhlükəsizlik
Modulların/rolların imzası və ya sabit etiketlər/hash.
Minimum IAM hüquqları ('plan' ≠ 'apply'), CI və insan-appruverin rollarını bölüşün.
Hal/log şifrələməsi, modulların/rolların şəxsi reyestrləri.
«no plaintext secrets in VCS» siyasəti, gizli skanerlər (gitleaks/trufflehog).
14) Anti-nümunələr
Terraform bir canavar modulu «hər şeyə»; modulların versiyalarının olmaması.
Lokal 'terraform. tfstate 'və kilidlərin olmaması.
IaC → əbədi sürüklənmə üzərində buludda əl düzəlişləri.
Ansible 'shell '/' command' modulları əvəzinə (idempotentliyi pozur).
Inventar «bir faylda» heç bir qrup/dəyişən, qarışdırma prod/stage.
Vars/repositordakı sirlər, Vault/KMS olmaması.
Plansız və Peer Review olmadan Apply.
15) Giriş çek siyahısı (0-45 gün)
0-10 gün
Uzaq backend/lock konfiqurasiya, Terraform modulları.
tflint/tfsec/checkov, ansible-lint daxil edin; Resursların etiketləri/etiketləri haqqında razılığa gəlmək.
NGINX/Agent/Loger üçün Ansible rolları; inventarları təşkil etmək.
11-25 gün
Kritik modullar/rollar üçün Conftest/OPA, Terratest və Molecule əlavə edin.
CI: MR-də «plan», plan artefaktı, appruvla manual-apply; Ansible `--check` на stage.
Gizli saxlama inteqrasiyası (Vault/KMS/Secrets Manager).
26-45 gün
drift detektor üçün avto-plan cədvəli, siyasət hesabatları.
Modullar/rollar kataloqu; sənədləşmə 'README. md 'hər biri.
GitOps: relizlərin şərhləri, monitorinq və alert gates ilə əlaqə.
16) Yetkinlik metrikası
uzaqdan state və lock ilə mühit% = 100%.
Testlərlə modulların/rolların payı (Terratest/Molecule) ≥ 70%.
MR-dən apply (prod) -ə qədər olan orta vaxt günlər deyil, saatlardır.
Sıfır «əl drift» (bütün dəyişikliklər MR vasitəsilə gedir).
100% kritik resurslar Code (etiketlər, şifrələmə, backup) ilə əhatə olunur.
17) Nəticə
Terraform proqnozlaşdırıla bilən, təkrarlanan infrastruktur bazasını təyin edir; Ansible hostları və xidmətləri tələb olunan vəziyyətə gətirir. Plan → review → apply ilə Policy as Code, uzaqdan state, testlər, gizli idarəetmə və CI/CD əlavə edin - və IaC konturunuz idarə edilə bilən, təhlükəsiz və sürətli olacaq və buraxılışlar atomik və geri qaytarıla bilər.