Infrastructure as Code (IaC) İle Hosting Kurulumu: Terraform ve Ansible ile Otomasyonun Gücü
Infrastructure as Code (IaC) İle Hosting Kurulumu: Terraform ve Ansible ile Otomasyonun Gücü
Giriş
Geleneksel yöntemlerle hosting altyapısı kurmak; sunucu sipariş etmek, işletim sistemi yüklemek, ağ ayarlarını elle yapılandırmak ve güvenlik politikalarını manuel uygulamak uzun zaman alır ve hata riskini artırır. Altyapıyı kodla tanımlamak (Infrastructure as Code), bu adımları tekrarlanabilir, sürümlenebilir ve otomatik hâle getirerek; tutarlılığı sağlar, hız kazandırır, insan hatasını en aza indirir ve ekipler arası iş birliğini güçlendirir. Terraform ve Ansible, IaC dünyasında öne çıkan araçlardır. Bu makalede, Terraform ile bulut kaynaklarını oluşturma, Ansible ile sunucu konfigürasyonunu yönetme, adım adım kurulum süreçleri, en iyi uygulamalar, güvenlik yaklaşımları ve gerçek dünya senaryoları ele alınacaktır.
1. Infrastructure as Code Nedir ve Avantajları
Altyapıyı kod olarak tanımlamak, YAML veya HCL (HashiCorp Configuration Language) gibi insan tarafından okunabilir dosyalarda sunucu, ağ, depolama ve güvenlik katmanlarını betimlemek demektir. Bu yaklaşımın sağladığı avantajlar şunlardır:
- Otomasyon ve Hız: Bir komutla yeni bir ortam veya test altyapısı dakikalar içinde ayağa kalkar.
- Versiyon Kontrolü: Git gibi sistemlerle yapılan değişiklikler izlenir; istenirse versiyon geçmişine geri dönülür.
- Tutarlılık ve Tekrarlanabilirlik: Aynı kod parçası, farklı ortamlarda aynı sonucu verir.
- Ekip İş Birliği: Geliştirme, operasyon ve güvenlik ekipleri kod tabanında aynı dili kullanarak iş birliği yapar.
- Dokümantasyon: Kod, altyapının kendisi kadar belgelidir; hangi sunucunun hangi rolü üstlendiği net biçimde görünür.
2. Terraform ile Kaynak Tanımlama ve Sağlayıcı (Provider) Entegrasyonu
Terraform, bulut sağlayıcılarına (AWS, Azure, Google Cloud, DigitalOcean vb.) API üzerinden bağlanarak; sanal makineler, ağ, yük dengeleyiciler, veritabanı instance’ları ve daha fazlasını yaratan bir araçtır.
- Terraform Kurulumu ve Başlangıç
- İndirip bilgisayarınıza veya CI/CD ajanınıza yükleyin.
- terraform init komutuyla çalışılacak dizini başlatın; sağlayıcı eklentileri indirilir.
- HCL ile Kaynak Tanımlama
main.tf dosyasında örnek bir AWS EC2 instance tanımı şu şekilde olabilir: - provider “aws” {
- region = “us-east-1”
- }
- resource “aws_instance” “web_server” {
- ami = “ami-0c94855ba95c71c99”
- instance_type = “t3.micro”
- tags = {
- Name = “iac-web”
- Env = “production”
- }
- }
Bu tanım, tek bir komutla AWS üzerinde t3.micro tipinde bir sunucu oluşturur.
- Değişken Yönetimi
Sabit değerler yerine variables.tf ve terraform.tfvars ile altyapıyı parametreleştirirsiniz: - variable “region” {
- type = string
- default = “us-east-1”
- }
- provider “aws” {
- region = var.region
- }
Farklı ortamlarda (dev, test, prod) aynı kodu kullanıp, sadece terraform.tfvars içindeki değerleri değiştirerek altyapıları farklılaştırabilirsiniz.
- State Dosyası ve Back-end
Terraform durumunu yerel veya uzaktaki bir state dosyasında saklar. Backend olarak S3, GCS, Azure Blob gibi servislere yönlendirerek ekip içi paylaşıma uygun hâle getirebilirsiniz. State dosyası, kaynakların gerçek durumunu ve bağımlılıklarını tutar. - Plan & Apply Aşamaları
- terraform plan komutuyla yapılacak değişikliklerin önizlemesini alın.
- terraform apply ile tanıma uygun olarak kaynaklar oluşturulsun.
Bu iki adım, özellikle üretim ortamına geçerken hata riskini azaltır; ilk önce bekleneni görebilir, sonra onay verirsiniz.
3. Ansible ile Konfigürasyon Yönetimi ve Playbook Tasarımı
Ansible, SSH üzerinden sunuculara bağlanarak idempotent şekilde yazılım yükleme, kullanıcı oluşturma, firewall ayarları ve servis konfigürasyonlarını gerçekleştiren bir otomasyon aracıdır.
- Envanter (Inventory)
Ansible’ın hedef makinelerini tanıdığı dosya veya dinamik kaynaklardır. Statik inventory örneği: - [web]
- web1.example.com
- web2.example.com
- [db]
- db1.example.com
- Playbook Yapısı
Yine YAML ile yazılır; her play, bir grup sunucuya uygulanacak görev listelerini içerir. Örneğin bir LAMP sunucu kurulumu şöyle olabilir: - – name: LAMP stack kurulumu
- hosts: web
- become: true
- tasks:
- – name: Apache yükle
- apt:
- name: apache2
- state: present
- update_cache: true
- – name: PHP yükle
- apt:
- name: “{{ item }}”
- state: present
- with_items:
- – php
- – libapache2-mod-php
- – php-mysql
- – name: Apache servisini başlat
- service:
- name: apache2
- state: started
- enabled: true
- Rollere Ayırma
Daha karmaşık altyapılarda, role’ler sayesinde görevleri modülerleştirirsiniz. roles/web/tasks/main.yml, roles/web/templates/vhost.conf.j2 gibi dizin yapısıyla kodun tekrar kullanımını, test edilebilirliğini ve bakımını kolaylaştırırsınız. - Vault ile Gizli Bilgi Yönetimi
Ansible Vault kullanarak şifre, API anahtarı veya sertifika gibi hassas verileri şifreleyip repo içinde tutabilir, çalıştırma zamanında şifreyi girerek görevlerin erişmesine izin verebilirsiniz. - Ansible Galaxy ve Topluluk Rolleri
Hazır modüller ve roller Galaxy üzerinden indirilebilir; zamandan tasarruf sağlar ve standart konfigürasyonları kolaylaştırır. Örneğin geerlingguy.mysql rolü ile MySQL kurulumu birkaç satır komutla tamamlanır.
4. Terraform ve Ansible Entegrasyonu: Uçtan Uca Otomasyon
Terraform ve Ansible’ı bir arada kullanarak tam bir IaC pipeline’ı oluşturabilirsiniz:
- İlk Aşama – Altyapı Provisyonu: Terraform, bulut üzerinde sanal makineleri, ağları, load balancer’ları ve gerekli IAM rollerini hazırlar.
- İkinci Aşama – Konfigürasyon Yönetimi: Provisioned host’lar Ansible envanteriyle tespit edilir; playbook’lar çalıştırılarak uygulama, güvenlik ve izleme ajanları kurulur.
- CI/CD Pipeline: Jenkins, GitLab CI veya GitHub Actions gibi araçlarla kod değişiklikleri tetiklenir; önce Terraform plan ve apply, sonra Ansible playbook’lar otomatik çalıştırılır. Hata durumunda pipeline durur, ilgili ekibe bildirim gönderilir.
5. Güvenlik ve Uygulama Gizlilikleri
IaC ile altyapı kurarken güvenlik katmanlarını kodda da uygulamalısınız:
- IAM Politikaları: Terraform ile yaratılan roller ve servis hesaplarına en az ayrıcalık (least privilege) prensibiyle izin atayın.
- SSH Anahtar Yönetimi: Ansible ile sunucuya yalnızca kayıtlı public anahtarla erişime izin verin; parola oturumlarını kapatın.
- Network Güvenlik Grupları: Terraform tanımında açılan portları mümkün olduğunca dar tutup, sadece gerekli CIDR bloklarından erişimi serbest bırakın.
- Secrets Management: Ansible Vault, HashiCorp Vault veya AWS Secrets Manager gibi çözümleri kullanarak parola, token ve sertifikaları güvenli saklayın.
6. İzleme, Loglama ve Geri Dönüş (Rollback) Planları
Otomasyon, başarısız bir değişiklik durumunda hızla müdahale edebilmek için geri dönüş mekanizmalarıyla desteklenmeli:
- Terraform State Rollback: Önceki state dosyasına dönerek kaynakları eski haline getirebilirsiniz.
- Ansible Run Tags: Sadece belirli görev veya rollerin tekrar çalıştırılmasını sağlayan etiketleme sistemi.
- Log ve Uyarı: Provisioning ve konfigürasyon adımlarını merkezi log sunucusuna (ELK, Splunk) veya CI/CD log arayüzüne akıtın; başarısız görevlerde e-posta/Slack bildirimleri kurun.
- Monitoring Agent Kurulumu: Ansible ile Datadog, Prometheus node_exporter veya Grafana Agent yükleyerek otomatik izleme altyapısı oluşturun. Değişiklik sonrası trafik, CPU, bellek gibi temel metrikleri takip edip anormalliklere erken müdahale edin.
7. Gerçek Dünya Senaryoları ve Kullanım Örnekleri
- Web Hosting Şirketi: Müşteriye özel sanal sunucu açarken Terraform ile müşteri hesabına ait VM, network, firewall kuralı oluşturulur; Ansible playbook ile cPanel veya Plesk kurulumu yapılır. Böylece müşteri talebi dakikalar içinde karşılanır.
- SaaS Uygulaması: Ürün versiyonuna göre farklı altyapı (dev, test, prod) oluşturmak için Terraform workspace’leri ve Ansible envanter grupları kullanılır; kod değişikliği pipeline’da test ortamına hızlı taşınır.
- Mikroservis Mimarisi: Kubernetes cluster’ları Terraform ile Azure AKS veya AWS EKS üzerinde provision edilir; Ansible ile node bazlı özel konfigürasyonlar, güvenlik yamaları uygulanır.
8. Yedeklilik, Ölçeklenebilirlik ve Felaket Kurtarma
IaC kodu, sadece kurulum değil; felaket anında aynı altyapının başka bir bölgede yeniden oluşturulmasını da sağlar. Terraform module’ları ve Ansible role’leri yeniden kullanılarak;
- Çok Bölgeli (Multi-Region) Dağıtım: Primary ve disaster-recovery ortamı kodla tanımlanır.
- Otomatik Ölçeklendirme: Terraform ile oluşturulan Auto Scaling Group ya da Ansible ile dinamik host grubuna yeni makineler eklenir.
- Veri Replikasyonu: Terraform tanımında RDS Multi-AZ, S3 versioning ve Ansible playbook’ta düzenli yedekleme görevleri yer alır.
9. En İyi Uygulamalar ve Öneriler
- Modüler Kod Yazımı: Terraform module ve Ansible role’lerini küçük, amaç odaklı tutun; tekrar kullanılabilirliği artırın.
- Dokümantasyon: Her module ve role için README dosyası oluşturun; girdileri, çıktıları, varsayılan değerleri açıklayın.
- Kod İncelemesi (Code Review): IaC pull request’lerini dikkatle inceleyin; güvenlik, performans ve tutarlılık açısından onay mekanizması kurun.
- Test ve Validasyon: terraform validate, terraform fmt, Ansible lint ve Molecule gibi araçlarla kod kalitesini otomatik kontrol edin.
- Sürekli Eğitim: Ekip üyelerinin Terraform Registry ve Ansible Galaxy güncellemelerini takip etmesini sağlayın; topluluk rollerini ve proven best practice örneklerini inceleyin.
Sonuç
Infrastructure as Code; zaman, maliyet ve hata payını azaltarak altyapıyı kod dünyasına taşıyor. Terraform ile bulut kaynaklarını hızlıca ayağa kaldırırken, Ansible ile sunucu konfigürasyonlarını yönetmek, uçtan uca tam otomasyon sağlayarak tutarlı, güvenli ve ölçeklenebilir hosting altyapıları oluşturmanızı mümkün kılıyor. Modüler yapı, versiyon kontrol, güvenlik entegrasyonu ve CI/CD ile birleştiğinde; dakikalar içinde yeni bir ortam kurup büyük felaketler karşısında hızla toparlanabilen, geleceğe hazır bir mimari elde edersiniz. IaC’in gücünü kullanmak, işletmenize rekabet avantajı kazandırır ve operasyonel yükü hafifletir. Bu rehberi takip ederek, Terraform ve Ansible ile hosting altyapınızı bir sonraki seviyeye taşımaya başlayabilirsiniz.