GH GambleHub

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.

Modül çağrısı örneği:
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ı.

Örnek arka uç:
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).

Conftest örneği (rego, basitleştirilmiş):
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.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Telegram
@Gamble_GC
Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.