Kod Olarak Altyapı: Terraform, Ansible
Kod Olarak Altyapı: Terraform, Ansible
1) Neden IaC ve araçların nasıl farklılaştığı
Terraform - bildirimsel orkestratör-IaC: Sağlayıcılar aracılığıyla bulut altyapısını (VPC, K8s, LB, DB, IAM) oluşturur/değiştirir. Kaynak yaşam döngüsünü yönetir ve durumu depolar.
Ansible - prosedürel config-IaC ve yapılandırma yönetimi: ana bilgisayarları/yazılımı (paketler, dosyalar, hizmetler) yapılandırır, uygulamaların nasıl sağlanacağını bilir, şablonlama, adımların düzenlenmesi. Bir ajan olmadan (SSH/WinRM), görevlerin idempotensi ile.
Kombinasyon: Terraform - "platformun ne yapıldığı", Ansible - "nasıl yapılandırıldığı ve başlatıldığı".
2) Depoların ve katmanların yapısı
3 katman öneriyoruz:1. Vakıf (İniş Bölgesi): ağlar, IAM, KMS, temel günlükler/izleme.
2. Platform: Kubernetes kümeleri, veritabanları, kuyruklar, gözlemlenebilirlik yığını.
3. İş yükleri: boşluklar/ad alanları, hizmet hesapları, ilkeler, yapılandırmalar.
Repo:- 'iac/terraform/' - modüller ve ortamlar (' modüller/', 'envs/').
- 'iac/ansible/' - roller (' roller/'), playbook'lar ('playbook'lar/'), envanterler (' icatlar/').
- 'policies/' - OPA/Conftest kuralları.
- 'Iplines/' - CI/CD komut dosyaları (tiftik/plan/uygulamak/test).
3) Terraform: modüller, durum, ortamlar
3. 1 Modüller
Küçük, yeniden kullanılan: 'vpc', 'eks', 'rds', 'redis', 'alb', 'iam-role'.
Girdiler - 'değişkenleri. tf ', çıkışlar -' çıkışları. tf ', sürümleri - modüller/git-etiketleri kayıt yoluyla.
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 Devlet
Uzak arka uç (S3/GCS + DynamoDB/LockTable) + kilitler.
Çevreye göre ayırma: 'prod. Tfstate ',' sahneleme. Tfstate '.
State-drift: CI zamanında 'terraform planı'; Sürüklenirken uyarı.
hcl terraform {
backend "s3" {
bucket = "iac-state"
key = "prod/network/terraform. tfstate"
region = "eu-central-1"
dynamodb_table = "iac-locks"
encrypt = true
}
}
3. 3 Çalışma alanları/Envs
Seçenekler:- Ayrı dizinler 'envs/prod', 'envs/stage' (görsel).
- Işık değişimleri için çalışma alanları, ancak sırları karıştırmaktan kaçının.
- Parametreler üzerinden 'tfvars': 'prod. Tfvars ',' sahne. Tfvars'ın.
4) Ansible: Roller, Envanterler, Idempotence
4. 1 Roller ve oyun kitapları
Galaxy standardı:
roles/
nginx/
tasks/main. yml templates/.j2 handlers/main. yml defaults/main. yml playbooks/
site. yml
Playbook örneği:
yaml
- hosts: web become: true roles:
- role: nginx vars:
nginx_listen_port: 8080
4. 2 Stoklar ve dinamikler
'ventories/prod/hosts. yml '+ değişkenleri' group _ vars/host _ vars '.
Dinamik envanter: 'aws _ ec2', 'gcp _ compute', 'kubernetes. Çekirdek.
4. 3 Idempotency
Mümkünse modülleri ('kabuk'değil) kullanın.
Kuru işler için 'changed _ when'/' check _ mode'.
İşleyiciler sadece değişiklikleri yansıtır.
5) Sırlar ve yapılandırmalar
Terraform: 'hassas = gerçek' yoluyla değerlerin salgılanması; Sırların kendileri eyalette değildir (AWS Secrets Manager/HashiCorp Vault/KMS'de saklayın ve veri kaynağına bakın).
Ansible: Değişken şifreleme için kasa ('ansible-vault encrypt'), HashiCorp Vault/KMS ile entegrasyon.
GitOps: Ayrı bir repo/depolama alanındaki sırlar, en az ayrıcalıkla erişim.
6) Kod Olarak Politika
Terraform planları için OPA/Conftest: kamu S3, açık SG, etiketsiz kaynakları (etiketler) yasaklama.
Terraform Cloud/Enterprise - Alternatif olarak Sentinel.
Ansible Lint: stil ve güvenlik (ihtiyaç duyulmayan yerlerde 'sudo: evet' olmadan, ham kabuk 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 testi
Terraform: Entegrasyon kontrolleri için 'tflint', 'tfsec'/' checkov', Terratest (Go).
Ansible: 'Ansible-lint', rolleri test etmek için Molekül (+ Docker/Podman/EC2).
Uygulandıktan sonra duman testleri: HTTP probları, port/işlemler, haklar.
8) GitOps и CI/CD
Boru Hattı (Çekme/Birleştirme İsteği üzerine):1. Lint/Sec: tflint, tfsec/checkov, ansible-lint.
2. Plan: Eserin yayınlanmasıyla 'terraform planı' (MR'da yorum).
3. Politika Kapısı: Conftest/Sentinel.
4. Apply (manual/approved): Sadece eserler imzası ile ana üzerinde.
5. Ansible dağıtımı: Sahnede '--check', sonra prod'da '--diff'.
6. Kontrol sonrası: sentetikler/Probe, açıklama ek açıklama panosu.
GitOps:- Manifestoları bir hakikat kaynağı olarak tutmak; Kubernetes için Argo CD/Flux, ancak Terraform aracılığıyla temel kümeler/ilkeller.
9) Kubernetes, ağlar, veritabanları için desenler
9. 1 Kubernetes
Terraform: EKS/GKE/AKS kümeleri, düğümler, IAM, StorageClass, LB.
Ansible: AMI/burç hazırlama, görüntü montajı/depoları, kurulum sonrası (kaydediciler/ajanlar/OTel).
9. 2 Ağlar ve çevre
Terraform: VPC/alt ağlar/NAT/Transit-Gateway/WAF, rotalar.
Ansible: NGINX/Envoy/HAProxy yapılandırma, TLS, WAF kuralları yapılandırma.
9. 3 Bazlar/önbellekler/kuyruklar
Terraform: RDS/CloudSQL grup parametresi, Redis/ElastiCache, Kafka/MSK.
Ansible: önbellek ısınma, geçiş işleri, yedekleme/aracı kurma.
10) Yapılandırma örnekleri
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 - sırrın veri kaynağı
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-istemci rolü (fragman)
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 şablonlu
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) Sürüklenme ve uyum yönetimi
Salt okunur anahtarda periyodik 'terraform planı'; Bir tutarsızlık olduğunda bir bilet oluşturur.
Kritik roller için zamanlanmış ansible --check kontrolü (denetim modu).
Raporlar: Başarısız OPA/Conftest ilkeleri, etiketsiz/yedekleme/izleme kaynakları.
12) Gözlemlenebilirlik ve denetim
'terraform apply' listeleri ve plan eserleri - nesne depolamaya kaydedin.
Ansible: 'callback _ plugins' (json) - merkezi log/ELK; İş kimliği dahil, SHA, trace_id taahhüt.
Metrikler: planların/oyun kitaplarının yürütme süresi, değişikliklerin sıklığı, test kapsamı.
13) Güvenlik
Modül/rol imzası veya sabit etiketler/hash'ler.
Minimum IAM hakları ('plan' ≠ 'apply'), CI ve insan uygulamasının rollerini ayırır.
Devlet/günlüklerin şifrelenmesi, modüllerin/rollerin özel kayıtları.
Politika "VCS'de açık metin sırları yok", gizli tarayıcılar (gitleaks/trufflehog).
14) Anti-desenler
Bir Terraform canavar modülü'her şey için "; eksik modül versiyonları.
Yerel 'terraform. Tfstate've kilit yok.
IaC üzerinde bulutta manuel düzenlemeler - sonsuz sürüklenme.
Modüller yerine ansible 'kabuk'/' komut' (idempotensi keser).
Envanter'bir dosyada "gruplar/değişkenler olmadan, prod/sahne karıştırma.
Vars/depolardaki sırlar, Vault/KMS yokluğu.
Plan olmadan ve Peer Review olmadan uygulayın.
15) Uygulama kontrol listesi (0-45 gün)
0-10 gün
Uzak arka ucu/kilidi yapılandırın, Terraform modüllerini genişletin.
Tflint/tfsec/checkov, ansible-lint'i etkinleştir; Kaynak etiketleri/etiketleri üzerinde pazarlık yapın.
NGINX/ajanlar/kaydediciler için Ansible rolleri oluşturun; stokları düzenler.
11-25 gün
Kritik modüller/roller için Conftest/OPA, Terratest ve Molecule ekleyin.
CI: MR'da 'plan', plan artefaktı, onayla manuel uygulama; на aşamada ansible '--check'.
Gizli Depolamayı Entegre Edin (Vault/KMS/Secrets Manager).
26-45 gün
Sürüklenme tespiti için otomatik zamanlama, politika raporları.
Sürüm oluşturma ile modüller/roller dizini; 'README. Her birinde md.
GitOps: sürümlerin ek açıklamaları, izleme ve uyarı kapıları ile bir kombinasyon.
16) Olgunluk metrikleri
Uzak durum ve kilitlere sahip ortamların %'si = %100.
Modüllerin/rollerin testlerle (Terratest/Molecule) payı %70 ≥.
MR'den başvurmak için ortalama süre (prod) günler değil saatlerdir.
Sıfır "manuel sürüklenme" (tüm değişiklikler MR'den geçer).
Kritik kaynakların %100'ü Kod Olarak Politika kapsamındadır (etiketler, şifreleme, yedekleme).
17) Sonuç
Terraform öngörülebilir, tekrarlanabilir bir altyapı tabanı belirtir; Ansible, konakçıları ve hizmetleri istenen duruma getirir. Politikayı Kod Olarak Ekle, konumla uzak durum, testler, gizli yönetim ve plan ile CI/CD - inceleme - uygula - ve IaC döngünüz yönetilebilir, güvenli ve hızlı hale gelir ve sürümler atomik ve geri dönüşümlüdür.