Infrastructure as Code: Terraform, Ansible
Infrastructure as Code: Terraform, Ansible
1) Näme üçin IaC we gurallaryň tapawudy
Terraform - deklaratiw orchestrator-IaC: bulut infrastrukturasyny (VPC, K8s, LB, DB, IAM) üpjün edijiler arkaly döredýär/üýtgedýär. Resurslaryň durmuş siklini dolandyrýar we baýlygy saklaýar.
Ansible - prosedura config-IaC we konfigurasiýa dolandyryşy: host/programma üpjünçiligini (paketleri, faýllary, hyzmatlary) sazlaýar, programma üpjünçiligini, temperatura, ädimleri ýygnamagy bilýär. Agentsiz (SSH/WinRM), wezipeleriň deňsizligi bilen.
Kombinasiýa: Terraform - "platforma näme ýasaldy", Ansible - "nähili sazlanýar we işe girizilýär".
2) Repozitoriýalaryň we gatlaklaryň gurluşy
3 gatlak maslahat berýäris:1. Foundation (Landing Zone): torlar, IAM, KMS, esasy magazinesurnallar/gözegçilik.
2. Platform: Kubernetes klasterleri, bazalar, nobatlar, observability-stek.
3. Workloads: boşluklar/nyşanlar, hyzmat hasaplary, syýasatçylar, konfigikler.
Repo:- 'iac/terraform/' - modullar we gurşaw (' modules/', 'envs/').
- 'iac/ansible/' - rollar (' roles/'), pleýbuklar ('playbooks/'), inwentarlar (' inventories/').
- 'policies/' - OPA/Conftest düzgünleri.
- 'pipelines/' - CI/CD skriptleri (lint/plan/apply/test).
3) Terraform: modullar, state, gurşaw
3. 1 Modullar
Kiçi, gaýtadan ulanylýan: 'vpc', 'eks', 'rds', 'redis', 'alb', 'iam-role'.
Giriş → 'variables. tf ', çykyş →' outputs. tf ', wersiýalary - modullaryň sanawy/git-tegler arkaly.
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 Ýagdaý (state)
Uzakdaky backend (S3/GCS + DynamoDB/LockTable) + blokirleme.
Tegelek bölmek: 'prod. tfstate`, `staging. tfstate`.
State-drift: 'terraform plan' -da CI meýilnama boýunça; dreýfde 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
Wariantlar:- Aýry-aýry kataloglar 'envs/prod', 'envs/stage' (aýdyň).
- Workspaces ýeňil üýtgeşmeler üçin, ýöne syrlary garyşdyrmakdan gaça duruň.
- Parametrler 'tfvars': 'prod. tfvars`, `stage. tfvars`.
4) Ansible: rollar, inwentarlar, idempotentlik
4. 1 Rollar we pleýbuklar
Galaxy standartı:
roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Playbook mysaly:
yaml
- hosts: web become: true roles:
- role: nginx vars:
nginx_listen_port: 8080
4. 2 Inwentarlar we dinamika
`inventories/prod/hosts. yml '+ üýtgewler' group _ vars/host _ vars '.
Dinamiki inwentar: 'aws _ ec2', 'gcp _ compute', 'kubernetes. core`.
4. 3 Idempotentlik
Modullary ('shell' däl) mümkin boldugyça ulanyň.
'changed _ when '/' check _ mode' gury geçişler üçin.
Handlers diňe üýtgän ýagdaýynda şöhlelenýär.
5) Syrlar we gapma-garşylyklar
Terraform: 'sensitive = true' arkaly bahalaryň bölünişi; syrlaryň özleri state-da däl (AWS Secrets Manager/HashiCorp Vault/KMS-de saklaň we data-çeşme bilen baglanyşyň).
Ansible: Üýtgeýjileri şifrlemek üçin Vault ('ansible-vault encrypt'), HashiCorp Vault/KMS bilen integrasiýa.
GitOps: aýratyn repo/ammarda syrlar, least-privilege arkaly elýeterlilik.
6) Syýasatlar we laýyklyk (Code)
Terraform üçin OPA/Conftest: açyk S3, açyk SG, kesgitlenmedik çeşmeleri gadagan etmek (tags).
Terraform Cloud/Enterprise - Alternatiw hökmünde Sentinel.
Ansible Lint: stil we howpsuzlyk ('sudo: yes' gerek däl ýerinde, raw-shell bolmasa).
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 synagy
Terraform: 'tflint', 'tfsec '/' checkov', Terratest (Go) integrasiýa barlaglary üçin.
Ansible: 'ansible-lint', Molecule (+ Docker/Podman/EC2) rollary barlamak üçin.
Apply-dan soň smouk-testler: HTTP probes, port/prosesler, hukuklar.
8) CI/CD и GitOps
Paypline (Pull/Merge Request):1. Lint/Sec: tflint, tfsec/checkov, ansible-lint.
2. Plan: artefaktyň çap edilmegi bilen 'terraform plan' (MR-da düşündiriş).
3. Policy Gate: Conftest/Sentinel.
4. Apply (manual/approved): diňe artefaktlaryň goly bilen main.
5. Ansible deploy: '-check' na stage, sonra '-diff' v prod.
6. Post-checks: sintetika/Probe, neşiriň düşündiriş tagtasy.
GitOps:- Manifestleri hakykat çeşmesi hökmünde saklaň; Kubernetes üçin Argo CD/Flux, ýöne esasy klasterler/primitivler - Terraform arkaly.
9) Kubernetes, torlar, DB üçin patternler
9. 1 Kubernetes
Terraform: EKS/GKE/AKS klasterleri, düwünleri, IAM, StorageClass, LB.
Ansible: AMI/bastionlary taýýarlamak, şekilleri/howdanlary ýygnamak, post-install (loggerler/agentler/OTel).
9. 2 Torlar we perimetri
Terraform: VPC/kiçi torlar/NAT/Tranzit-Gateway/WAF, ugurlar.
Ansible: NGINX/Envoy/HAProxy, TLS, WAF düzgünleriniň konfigi.
9. 3 Bazalar/kesişler/nobatlar
Terraform: RDS/CloudSQL parametrler topary, Redis/ElastiCache, Kafka/MSK.
Ansible: Keshiň gyzmagy, migrasiýa meseleleri, bellikleri/agentleri sazlamak.
10) Konwensiýalaryň mysallary
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 - gizlin maglumat çeşmesi
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 (bölek)
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 - 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) Dreýfiň we laýyklygyň dolandyrylmagy
Döwürleýin 'terraform plan' -da read-only açary; tapawut ýüze çykan halatynda bilet döredýär.
Ansible --check möhüm rollar üçin meýilnama boýunça (audit-re modeim).
Hasabatlar: OPA/Conftest-iň ýerine ýetirilmedik syýasatlary ,/backup/monitoringsiz çeşmeler.
12) Gözegçilik we audit
Logi 'terraform apply' we meýilnamalaryň artefaktlary - obýekt ammarynda saklaň.
Ansible: 'callback _ plugins' (json) → merkezi log/ELK; job ID, commit SHA, trace_id.
Metrikler: meýilnamalary/pleýbuklary ýerine ýetirmegiň wagty, üýtgeşmeleriň ýygylygy, synaglary ýapmak.
13) Howpsuzlyk
Modullaryň/rollaryň goly ýa-da kesgitlenen bellikler/heşler.
Iň az IAM hukuklary ('plan' ≠ 'apply'), CI we adam-appruver rollaryny paýlaşyň.
Ýagdaýy/ýazgylary şifrlemek, modullaryň/rollaryň şahsy sanawlary.
"no plaintext secrets in VCS" syýasaty, gizlin skanerler (gitleaks/trufflehog).
14) Anti-patternler
Terraform "hemme zat üçin" bir haýwan moduly; modullaryň wersiýalarynyň ýoklugy.
Lokal 'terraform. tfstate 'we blokirlemeleriň ýoklugy.
IaC → baky süýşmegiň üstündäki bulutda el bilen düzedişler.
Modullaryň ýerine ansible 'shell '/' command' (duýgurlygy bozýar).
"Bir faýlda" toparsyz/üýtgeýän inwentar, prod/stage garyşdyrma.
Vars/repozitordaky syrlar, Vault/KMS ýoklugy.
Apply Plansiz we Peer Review.
15) Giriş çek-sanawy (0-45 gün)
0-10 gün
Uzakdaky backend/lock sazlaň, Terraform modullaryny düzüň.
Tflint/tfsec/checkov, ansible-lint; resurslaryň bellikleri/bellikleri barada ylalaşmak.
NGINX/agentler/logerler üçin Ansible rollaryny başla; inwentarlary guramak.
11-25 gün
Möhüm modullar/rollar üçin Conftest/OPA, Terratest we Molecule goşuň.
CI: MR-a 'plan', meýilnamanyň artefaktı, appruve bilen manual-apply; Ansible `--check` на stage.
Gizlin saklaýjy (Vault/KMS/Secrets Manager).
26-45 gün
Drift-detektor üçin awto-meýilnama, syýasatlar boýunça hasabatlar.
Modullaryň/rollaryň wersiýalaşdyrylan katalogy; README. md 'her birinde.
GitOps: relizleriň düşündirişleri, gözegçilik we alert girtleri bilen baglanyşyk.
16) Kämillik ölçegleri
Uzakdaky state bilen gurşawyň% -i = 100%.
Synaglar bilen modullaryň/rollaryň paýy (Terratest/Molecule) ≥ 70%.
MR-dan apply (prod) - sagatlar, günler däl.
Nol "el bilen süýşmek" (ähli üýtgeşmeler MR-den geçýär).
Kritiki çeşmeleriň 100% -i Policy as Code (bellikler, şifrlemek, backup) bilen örtülendir.
17) Netijenama
Terraform öňünden aýdyp boljak, gaýtalanýan infrastruktura bazasyny kesgitleýär; Ansible hostlary we hyzmatlary talap edilýän ýagdaýa getirýär. Policy as Code, lokalizasiýa bilen uzakdaky state, synaglar, gizlin dolandyryş we CI/CD bilen plan → review → apply goşuň - IaC konturyňyz dolandyrylýan, howpsuz we çalt bolar we goýberilişleriňiz atomiki we yzyna öwrülip biler.