GH GambleHub

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ə.

Modul çağırış nümunəsi:
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.

Backend nümunəsi:
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).

Conftest nümunəsi (rego, sadələşdirilmiş):
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.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

Telegram
@Gamble_GC
İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.