{"id":31597,"date":"2025-10-11T18:41:39","date_gmt":"2025-10-11T15:41:39","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31597"},"modified":"2025-10-11T18:41:39","modified_gmt":"2025-10-11T15:41:39","slug":"terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/","title":{"rendered":"Terraform ve Ansible&#8217;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi"},"content":{"rendered":"<p><body><\/p>\n<h2>Terraform ve Ansible&#8217;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi<\/h2>\n<p>Infrastructure as Code (IaC) yakla\u015f\u0131mlar\u0131, modern yaz\u0131l\u0131m geli\u015ftirme ve operasyon s\u00fcre\u00e7lerinin temelini olu\u015fturmaktad\u0131r. Bu yakla\u015f\u0131mlar, altyap\u0131n\u0131n elle yap\u0131lan m\u00fcdahaleler yerine kod arac\u0131l\u0131\u011f\u0131yla tan\u0131mlanmas\u0131n\u0131, s\u00fcr\u00fcm kontrol\u00fcn\u00fc, test edilmesini ve otomatikle\u015ftirilmesini sa\u011flar. IaC&#8217;nin iki temel bile\u015feni, altyap\u0131 sa\u011flama (provisioning) ve konfig\u00fcrasyon y\u00f6netimidir. Bu iki alan\u0131 en etkili \u015fekilde ele alan ara\u00e7lardan ikisi Terraform ve Ansible&#8217;d\u0131r. Her biri kendi uzmanl\u0131k alan\u0131nda g\u00fc\u00e7l\u00fc yeteneklere sahip olan bu ara\u00e7lar\u0131n birlikte kullan\u0131lmas\u0131, u\u00e7tan uca otomatize edilmi\u015f, tutarl\u0131 ve \u00f6l\u00e7eklenebilir bir altyap\u0131 y\u00f6netim s\u00fcreci sunar.<\/p>\n<p>Bu makalede, Terraform ve Ansible&#8217;\u0131n ne oldu\u011funu, neden birlikte kullan\u0131lmalar\u0131 gerekti\u011fini, farkl\u0131 entegrasyon yakla\u015f\u0131mlar\u0131n\u0131, pratik bir senaryo \u00fczerinden \u00f6rnekleri, en iyi uygulamalar\u0131 ve kar\u015f\u0131la\u015fabilecek potansiyel zorluklar\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Amac\u0131m\u0131z, bu iki g\u00fc\u00e7l\u00fc arac\u0131n sinerjisinden tam olarak nas\u0131l faydalanabilece\u011finizi g\u00f6stermektir.<\/p>\n<h3>Terraform Nedir?<\/h3>\n<p>Terraform, HashiCorp taraf\u0131ndan geli\u015ftirilen a\u00e7\u0131k kaynakl\u0131 bir altyap\u0131 sa\u011flama (Infrastructure as Code) arac\u0131d\u0131r. Deklaratif bir dil olan HashiCorp Configuration Language (HCL) kullanarak altyap\u0131 kaynaklar\u0131n\u0131 tan\u0131mlaman\u0131za ve y\u00f6netmenize olanak tan\u0131r. Terraform&#8217;un temel amac\u0131, sunucular, veritabanlar\u0131, a\u011f yap\u0131land\u0131rmalar\u0131, y\u00fck dengeleyiciler ve di\u011fer bulut veya \u015firket i\u00e7i kaynaklar gibi altyap\u0131 bile\u015fenlerini olu\u015fturmak, g\u00fcncellemek ve silmektir.<\/p>\n<h4>Terraform&#8217;un Temel \u00d6zellikleri:<\/h4>\n<p>*   <strong>\u00c7oklu Bulut Deste\u011fi:<\/strong> AWS, Azure, Google Cloud Platform (GCP), Alibaba Cloud gibi pop\u00fcler bulut sa\u011flay\u0131c\u0131lar\u0131n\u0131n yan\u0131 s\u0131ra VMware vSphere, OpenStack gibi \u015firket i\u00e7i platformlar\u0131 ve hatta Kubernetes, Docker gibi konteyner orkestrasyon ara\u00e7lar\u0131n\u0131 destekler. Bu, sa\u011flay\u0131c\u0131lar (providers) arac\u0131l\u0131\u011f\u0131yla sa\u011flan\u0131r.<br \/>\n*   <strong>Deklaratif Yakla\u015f\u0131m:<\/strong> Terraform&#8217;a &#8220;ne istedi\u011finizi&#8221; (hedef durum) s\u00f6ylersiniz, &#8220;nas\u0131l yap\u0131laca\u011f\u0131n\u0131&#8221; de\u011fil. Terraform, mevcut durumu hedef durumla kar\u015f\u0131la\u015ft\u0131r\u0131r ve gerekli de\u011fi\u015fiklikleri otomatik olarak planlar ve uygular.<br \/>\n*   <strong>Durum Y\u00f6netimi (State Management):<\/strong> Terraform, y\u00f6netti\u011fi altyap\u0131n\u0131n durumunu bir &#8220;state&#8221; dosyas\u0131nda (varsay\u0131lan olarak <code>terraform.tfstate<\/code>) saklar. Bu dosya, ger\u00e7ek altyap\u0131 ile Terraform yap\u0131land\u0131rmas\u0131 aras\u0131ndaki e\u015fle\u015fmeyi sa\u011flar ve bir sonraki <code>apply<\/code> i\u015fleminde hangi de\u011fi\u015fikliklerin yap\u0131lmas\u0131 gerekti\u011fini belirlemek i\u00e7in kullan\u0131l\u0131r. \u00dcretim ortamlar\u0131nda bu durum dosyas\u0131n\u0131n g\u00fcvenli ve merkezi bir yerde (\u00f6rn: S3, Azure Blob Storage, GCS) tutulmas\u0131 \u00f6nemlidir.<br \/>\n*   <strong>Y\u00fcr\u00fctme Plan\u0131 (Execution Plan):<\/strong> <code>terraform plan<\/code> komutu, ger\u00e7ek bir de\u011fi\u015fiklik yapmadan \u00f6nce Terraform&#8217;un uygulayaca\u011f\u0131 t\u00fcm de\u011fi\u015fiklikleri g\u00f6steren bir plan olu\u015fturur. Bu, beklenmedik sonu\u00e7lar\u0131n \u00f6n\u00fcne ge\u00e7mek i\u00e7in kritik bir ad\u0131md\u0131r.<br \/>\n*   <strong>Mod\u00fcler Yap\u0131:<\/strong> Altyap\u0131 kodunu yeniden kullan\u0131labilir mod\u00fcller halinde d\u00fczenlemenize olanak tan\u0131r. Bu, kodun okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve tutarl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>\u0130dempotent (Etkisiz Tekrar Edilebilirlik):<\/strong> Bir Terraform yap\u0131land\u0131rmas\u0131n\u0131 birden \u00e7ok kez uygulad\u0131\u011f\u0131n\u0131zda, hedef durum zaten elde edilmi\u015fse ek bir de\u011fi\u015fiklik yap\u0131lmaz.<\/p>\n<p>Terraform, genellikle bir altyap\u0131 kayna\u011f\u0131n\u0131n &#8220;Day 0&#8221; (s\u0131f\u0131r\u0131nc\u0131 g\u00fcn) operasyonlar\u0131, yani kaynaklar\u0131n olu\u015fturulmas\u0131 ve temel yap\u0131land\u0131rmas\u0131n\u0131n yap\u0131lmas\u0131 i\u00e7in kullan\u0131l\u0131r. Ancak i\u015fletim sistemi seviyesindeki yaz\u0131l\u0131m kurulumu, servis y\u00f6netimi veya dosya kopyalama gibi daha ince ayar konfig\u00fcrasyonlar\u0131 i\u00e7in genellikle ba\u015fka bir araca ihtiya\u00e7 duyar\u0131z. \u0130\u015fte bu noktada Ansible devreye girer.<\/p>\n<h3>Ansible Nedir?<\/h3>\n<p>Ansible, Red Hat taraf\u0131ndan geli\u015ftirilen a\u00e7\u0131k kaynakl\u0131 bir otomasyon motorudur. Konfig\u00fcrasyon y\u00f6netimi, uygulama da\u011f\u0131t\u0131m\u0131, g\u00f6rev otomasyonu ve s\u00fcrekli da\u011f\u0131t\u0131m gibi alanlarda kullan\u0131l\u0131r. Python ile yaz\u0131lm\u0131\u015f olup, ajans\u0131z (agentless) mimarisi sayesinde y\u00f6netilecek sunuculara herhangi bir yaz\u0131l\u0131m y\u00fcklemeye gerek duymaz. SSH protokol\u00fc \u00fczerinden hedef sunucularla ileti\u015fim kurar.<\/p>\n<h4>Ansible&#8217;\u0131n Temel \u00d6zellikleri:<\/h4>\n<p>*   <strong>Ajans\u0131z Mimari:<\/strong> Y\u00f6netilen d\u00fc\u011f\u00fcmlere (managed nodes) herhangi bir ajan yaz\u0131l\u0131m\u0131 y\u00fcklenmesi gerekmez. Sadece SSH (Linux\/Unix i\u00e7in) veya WinRM (Windows i\u00e7in) eri\u015fimi yeterlidir. Bu, kurulumu ve bak\u0131m\u0131 basitle\u015ftirir.<br \/>\n*   <strong>YAML Playbook&#8217;lar:<\/strong> Ansible, otomasyon g\u00f6revlerini YAML tabanl\u0131 &#8220;playbook&#8221;lar arac\u0131l\u0131\u011f\u0131yla tan\u0131mlar. Playbook&#8217;lar, okunmas\u0131 kolay ve insan taraf\u0131ndan anla\u015f\u0131labilir bir yap\u0131ya sahiptir.<br \/>\n*   <strong>Mod\u00fcller:<\/strong> Ansible, binlerce yerle\u015fik mod\u00fcl sunar. Bu mod\u00fcller, yaz\u0131l\u0131m kurulumu, servis y\u00f6netimi, dosya kopyalama, kullan\u0131c\u0131 olu\u015fturma, veritaban\u0131 i\u015flemleri gibi \u00e7e\u015fitli g\u00f6revleri yerine getirmek i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong>Envanter (Inventory):<\/strong> Ansible, y\u00f6netilecek sunucular\u0131n listesini ve bu sunuculara \u00f6zg\u00fc de\u011fi\u015fkenleri &#8220;envanter&#8221; dosyas\u0131nda (varsay\u0131lan olarak <code>inventory.ini<\/code> veya <code>inventory.yml<\/code>) tutar. Envanter statik veya dinamik olabilir.<br \/>\n*   <strong>\u0130dempotent:<\/strong> Ansible playbook&#8217;lar\u0131 da idempotent olacak \u015fekilde tasarlanm\u0131\u015ft\u0131r. Bir g\u00f6revi birden \u00e7ok kez \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, hedef durum zaten elde edilmi\u015fse ek bir de\u011fi\u015fiklik yap\u0131lmaz.<br \/>\n*   <strong>Roller (Roles):<\/strong> Karma\u015f\u0131k veya yeniden kullan\u0131labilir otomasyon g\u00f6revlerini d\u00fczenlemek i\u00e7in &#8220;roller&#8221; kullan\u0131l\u0131r. Rol, ilgili g\u00f6revleri, de\u011fi\u015fkenleri, \u015fablonlar\u0131 ve dosyalar\u0131 bir araya getiren yap\u0131land\u0131r\u0131lm\u0131\u015f bir dizin hiyerar\u015fisidir.<br \/>\n*   <strong>Basitlik:<\/strong> D\u00fc\u015f\u00fck \u00f6\u011frenme e\u011frisine sahiptir ve kurulumu kolayd\u0131r.<\/p>\n<p>Ansible, genellikle bir altyap\u0131 kayna\u011f\u0131n\u0131n &#8220;Day 1+&#8221; (birinci g\u00fcn ve sonras\u0131) operasyonlar\u0131, yani i\u015fletim sistemi seviyesinde konfig\u00fcrasyon, yaz\u0131l\u0131m kurulumu, servis ba\u015flatma, g\u00fcvenlik duvar\u0131 ayarlar\u0131, uygulama da\u011f\u0131t\u0131m\u0131 gibi g\u00f6revler i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Neden Terraform ve Ansible Birlikte Kullan\u0131lmal\u0131?<\/h3>\n<p>Terraform ve Ansible, ayr\u0131 ayr\u0131 g\u00fc\u00e7l\u00fc ara\u00e7lar olsalar da, modern altyap\u0131 y\u00f6netimi ve otomasyonu i\u00e7in birbirlerini m\u00fckemmel \u015fekilde tamamlarlar. Birlikte kullan\u0131ld\u0131klar\u0131nda, u\u00e7tan uca bir &#8220;Infrastructure as Code&#8221; (IaC) \u00e7\u00f6z\u00fcm\u00fc sunarak, altyap\u0131n\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn her a\u015famas\u0131n\u0131 otomatize ederler.<\/p>\n<h4>Tamamlay\u0131c\u0131 G\u00fc\u00e7ler:<\/h4>\n<p>*   <strong>Terraform: Altyap\u0131 Sa\u011flama (Provisioning):<\/strong> Terraform, &#8220;ne&#8221; in\u015fa edilece\u011fini tan\u0131mlar. Bulut sa\u011flay\u0131c\u0131larda veya \u015firket i\u00e7inde sanal makineler, a\u011flar, depolama birimleri, veritabanlar\u0131 gibi temel altyap\u0131 kaynaklar\u0131n\u0131 olu\u015fturur, g\u00fcnceller ve siler.<br \/>\n*   <strong>Ansible: Konfig\u00fcrasyon Y\u00f6netimi ve Uygulama Da\u011f\u0131t\u0131m\u0131:<\/strong> Ansible, olu\u015fturulan altyap\u0131 \u00fczerinde &#8220;nas\u0131l&#8221; yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 ve &#8220;ne&#8221; \u00e7al\u0131\u015faca\u011f\u0131n\u0131 tan\u0131mlar. \u0130\u015fletim sistemi ayarlar\u0131n\u0131 yapar, yaz\u0131l\u0131mlar\u0131 kurar, servisleri yap\u0131land\u0131r\u0131r, kullan\u0131c\u0131lar\u0131 y\u00f6netir ve uygulamalar\u0131 da\u011f\u0131t\u0131r.<\/p>\n<h4>Birlikte Kullanman\u0131n Faydalar\u0131:<\/h4>\n<p>*   <strong>U\u00e7tan Uca Otomasyon:<\/strong> Altyap\u0131n\u0131n s\u0131f\u0131rdan olu\u015fturulmas\u0131ndan, i\u015fletim sistemi ve uygulama katmanlar\u0131n\u0131n konfig\u00fcrasyonuna kadar t\u00fcm s\u00fcreci otomatize eder. Bu, manuel m\u00fcdahaleyi minimuma indirir ve insan hatas\u0131 riskini azalt\u0131r.<br \/>\n*   <strong>Tutarl\u0131 Ortamlar:<\/strong> Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131nda tutarl\u0131l\u0131\u011f\u0131 sa\u011flar. Her ortam, ayn\u0131 Terraform ve Ansible kodundan olu\u015fturuldu\u011fu i\u00e7in &#8220;\u00e7al\u0131\u015fan makinede \u00e7al\u0131\u015f\u0131yor&#8221; sorunlar\u0131 azal\u0131r.<br \/>\n*   <strong>Daha H\u0131zl\u0131 Da\u011f\u0131t\u0131mlar:<\/strong> Altyap\u0131 ve uygulama da\u011f\u0131t\u0131m\u0131 s\u00fcre\u00e7lerini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r. Yeni bir ortam\u0131 dakikalar i\u00e7inde aya\u011fa kald\u0131rabilir veya mevcut bir ortam\u0131 kolayca g\u00fcncelleyebilirsiniz.<br \/>\n*   <strong>Geli\u015ftirilmi\u015f G\u00fcvenlik:<\/strong> Kod tabanl\u0131 altyap\u0131 ve konfig\u00fcrasyon, g\u00fcvenlik politikalar\u0131n\u0131n otomatik olarak uygulanmas\u0131n\u0131 sa\u011flar. G\u00fcvenlik a\u00e7\u0131klar\u0131 veya yanl\u0131\u015f yap\u0131land\u0131rmalar daha kolay tespit edilebilir ve d\u00fczeltilebilir.<br \/>\n*   <strong>S\u00fcr\u00fcm Kontrol\u00fc ve \u0130\u015fbirli\u011fi:<\/strong> Hem Terraform hem de Ansible kodlar\u0131 Git gibi s\u00fcr\u00fcm kontrol sistemlerinde saklanabilir. Bu, de\u011fi\u015fikliklerin izlenmesini, geri al\u0131nmas\u0131n\u0131 ve ekip \u00fcyeleri aras\u0131nda i\u015fbirli\u011fini kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Maliyet Optimizasyonu:<\/strong> Kaynaklar\u0131n do\u011fru bir \u015fekilde sa\u011flanmas\u0131 ve kullan\u0131lmayan kaynaklar\u0131n otomatik olarak silinmesi, bulut maliyetlerinin optimize edilmesine yard\u0131mc\u0131 olabilir.<br \/>\n*   <strong>Felaket Kurtarma (Disaster Recovery):<\/strong> T\u00fcm altyap\u0131 ve konfig\u00fcrasyon kod olarak tan\u0131mland\u0131\u011f\u0131ndan, bir felaket durumunda ortam\u0131n h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde yeniden olu\u015fturulmas\u0131 m\u00fcmk\u00fcn olur.<\/p>\n<p>K\u0131sacas\u0131, Terraform size bo\u015f bir tuval \u00fczerinde binalar in\u015fa etme yetene\u011fi verirken, Ansible bu binalar\u0131n i\u00e7ini d\u00f6\u015fer, tesisat\u0131n\u0131 kurar ve ya\u015famaya haz\u0131r hale getirir. \u0130kisi bir araya geldi\u011finde, tamamen i\u015flevsel, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir bir ya\u015fam alan\u0131 yarat\u0131rs\u0131n\u0131z.<\/p>\n<h3>Entegrasyon Yakla\u015f\u0131mlar\u0131<\/h3>\n<p>Terraform ve Ansible&#8217;\u0131 birlikte kullanman\u0131n birka\u00e7 farkl\u0131 yolu vard\u0131r. En uygun yakla\u015f\u0131m, projenizin karma\u015f\u0131kl\u0131\u011f\u0131na, ekibinizin al\u0131\u015fkanl\u0131klar\u0131na ve CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) boru hatt\u0131n\u0131z\u0131n yap\u0131s\u0131na ba\u011fl\u0131 olacakt\u0131r.<\/p>\n<h4>1. Terraform <code>local-exec<\/code> Provisioner ile Do\u011frudan Entegrasyon<\/h4>\n<p>Bu, Terraform&#8217;dan Ansible&#8217;\u0131 \u00e7a\u011f\u0131rman\u0131n en basit yollar\u0131ndan biridir. Terraform, kaynaklar\u0131 sa\u011flad\u0131ktan sonra, <code>local-exec<\/code> provisioner&#8217;\u0131 kullanarak yerel makinede bir Ansible playbook&#8217;unu \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<h5>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h5>\n<p>1.  Terraform, <code>aws_instance<\/code> veya <code>azurerm_virtual_machine<\/code> gibi altyap\u0131 kaynaklar\u0131n\u0131 olu\u015fturur.<br \/>\n2.  Kaynak olu\u015fturulduktan sonra (veya belirli bir ya\u015fam d\u00f6ng\u00fcs\u00fc a\u015famas\u0131nda), Terraform, <code>local-exec<\/code> provisioner&#8217;\u0131 tetikler.<br \/>\n3.  <code>local-exec<\/code>, kontrol makinesinde (Terraform&#8217;un \u00e7al\u0131\u015ft\u0131\u011f\u0131 yer) belirtilen komutu \u00e7al\u0131\u015ft\u0131r\u0131r. Bu komut genellikle <code>ansible-playbook<\/code> komutudur.<br \/>\n4.  Ansible playbook&#8217;u, Terraform taraf\u0131ndan yeni sa\u011flanan sunuculara ba\u011flan\u0131r ve konfig\u00fcrasyon g\u00f6revlerini yerine getirir.<\/p>\n<h5>\u00d6rnek Kullan\u0131m:<\/h5>\n<pre><code class=\"language-hcl\">resource \"aws_instance\" \"web_server\" {\n  ami           = \"ami-0abcdef1234567890\" # L\u00fctfen g\u00fcncel bir AMI ID kullan\u0131n\n  instance_type = \"t2.micro\"\n  key_name      = \"my-ssh-key\"\n  vpc_security_group_ids = [aws_security_group.web_sg.id]\n  tags = {\n    Name = \"WebServer\"\n  }\n\n  # Ansible'\u0131n ba\u011flanabilmesi i\u00e7in instance'\u0131n public IP'sini bekleyin\n  provisioner \"local-exec\" {\n    command = \"sleep 60 && ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i ${self.public_ip}, --private-key ~\/.ssh\/my-ssh-key.pem ansible\/playbook.yml\"\n    # Ansible'\u0131n SSH ile ba\u011flanabilmesi i\u00e7in bir gecikme eklemek iyi bir uygulamad\u0131r.\n    # --private-key parametresini kendi SSH anahtar\u0131n\u0131zla g\u00fcncelleyin.\n    # -i ${self.public_ip}, ile tek bir host'luk dinamik envanter olu\u015fturulur.\n  }\n}\n\nresource \"aws_security_group\" \"web_sg\" {\n  name        = \"web_server_sg\"\n  description = \"Allow SSH and HTTP traffic\"\n\n  ingress {\n    from_port   = 22\n    to_port     = 22\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n\n  ingress {\n    from_port   = 80\n    to_port     = 80\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n\n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n}<\/code><\/pre>\n<p>Ansible playbook&#8217;u (<code>ansible\/playbook.yml<\/code>) ise \u015f\u00f6yle olabilir:<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Configure Web Server\n  hosts: all\n  become: yes\n  tasks:\n    - name: Update apt cache\n      apt:\n        update_cache: yes\n\n    - name: Install Nginx\n      apt:\n        name: nginx\n        state: present\n\n    - name: Start Nginx service\n      service:\n        name: nginx\n        state: started\n        enabled: yes<\/code><\/pre>\n<h5>Avantajlar:<\/h5>\n<p>*   Kurulumu ve anla\u015f\u0131lmas\u0131 kolayd\u0131r.<br \/>\n*   Basit ve k\u00fc\u00e7\u00fck projeler i\u00e7in h\u0131zl\u0131 bir ba\u015flang\u0131\u00e7 sa\u011flar.<\/p>\n<h5>Dezavantajlar:<\/h5>\n<p>*   Terraform&#8217;un \u00e7al\u0131\u015ft\u0131\u011f\u0131 makinede Ansible&#8217;\u0131n y\u00fckl\u00fc olmas\u0131n\u0131 gerektirir.<br \/>\n*   Envanter y\u00f6netimi, birden fazla sunucu oldu\u011funda karma\u015f\u0131kla\u015fabilir.<br \/>\n*   Terraform ve Ansible aras\u0131ndaki s\u0131k\u0131 ba\u011f\u0131ml\u0131l\u0131k, hata ay\u0131klamay\u0131 zorla\u015ft\u0131rabilir.<br \/>\n*   Geli\u015fmi\u015f CI\/CD senaryolar\u0131 i\u00e7in ideal de\u011fildir.<\/p>\n<h4>2. Dinamik Envanter Olu\u015fturma ile Ayr\u0131k Yakla\u015f\u0131m<\/h4>\n<p>Bu yakla\u015f\u0131m, Terraform ve Ansible&#8217;\u0131 daha gev\u015fek bir \u015fekilde ba\u011flar. Terraform sadece altyap\u0131y\u0131 sa\u011flar ve gerekli bilgileri (IP adresleri, host adlar\u0131 vb.) \u00e7\u0131kt\u0131 olarak verir. Daha sonra, ayr\u0131 bir betik veya Ansible&#8217;\u0131n kendi dinamik envanter mekanizmalar\u0131 kullan\u0131larak bu \u00e7\u0131kt\u0131lar bir Ansible envanterine d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr ve Ansible playbook&#8217;lar\u0131 bu envanter \u00fczerinde \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/p>\n<h5>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h5>\n<p>1.  Terraform, altyap\u0131 kaynaklar\u0131n\u0131 olu\u015fturur.<br \/>\n2.  Terraform, <code>output<\/code> bloklar\u0131 arac\u0131l\u0131\u011f\u0131yla sa\u011flanan kaynaklar\u0131n IP adresleri veya DNS adlar\u0131 gibi bilgileri d\u0131\u015far\u0131ya aktar\u0131r.<br \/>\n3.  Bir betik (\u00f6rne\u011fin Python veya Bash) veya Ansible&#8217;\u0131n bulut sa\u011flay\u0131c\u0131lar\u0131 i\u00e7in yerle\u015fik dinamik envanter eklentileri, bu \u00e7\u0131kt\u0131lar\u0131 kullanarak dinamik bir Ansible envanteri olu\u015fturur.<br \/>\n4.  Ansible, bu dinamik envanteri kullanarak playbook&#8217;lar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<h5>\u00d6rnek Kullan\u0131m:<\/h5>\n<p><strong>Terraform K\u0131sm\u0131 (<code>outputs.tf<\/code>):<\/strong><\/p>\n<pre><code class=\"language-hcl\">output \"web_server_ips\" {\n  description = \"Public IPs of the web servers\"\n  value       = aws_instance.web_server.*.public_ip\n}<\/code><\/pre>\n<p><code>terraform apply<\/code> sonras\u0131 <code>terraform output -json<\/code> komutu ile \u015fu \u00e7\u0131kt\u0131y\u0131 alabilirsiniz:<\/p>\n<pre><code class=\"language-json\">{\n  \"web_server_ips\": {\n    \"sensitive\": false,\n    \"type\": \"list\",\n    \"value\": [\n      \"54.1.2.3\",\n      \"54.4.5.6\"\n    ]\n  }\n}<\/code><\/pre>\n<p><strong>Dinamik Envanter Beti\u011fi (Python &#8211; <code>generate_inventory.py<\/code>):<\/strong><\/p>\n<pre><code class=\"language-python\">import subprocess\nimport json\nimport sys\n\ndef get_terraform_output():\n    try:\n        result = subprocess.run(['terraform', 'output', '-json', 'web_server_ips'], capture_output=True, text=True, check=True)\n        return json.loads(result.stdout)['value']\n    except subprocess.CalledProcessError as e:\n        print(f\"Error getting Terraform output: {e}\", file=sys.stderr)\n        sys.exit(1)\n    except json.JSONDecodeError as e:\n        print(f\"Error decoding JSON from Terraform output: {e}\", file=sys.stderr)\n        sys.exit(1)\n\ndef main():\n    web_server_ips = get_terraform_output()\n    \n    inventory = {\n        \"webservers\": {\n            \"hosts\": {},\n            \"vars\": {\n                \"ansible_user\": \"ec2-user\", # AWS i\u00e7in varsay\u0131lan kullan\u0131c\u0131\n                \"ansible_ssh_private_key_file\": \"~\/.ssh\/my-ssh-key.pem\"\n            }\n        },\n        \"_meta\": {\n            \"hostvars\": {}\n        }\n    }\n\n    for i, ip in enumerate(web_server_ips):\n        hostname = f\"webserver_{i+1}\"\n        inventory[\"webservers\"][\"hosts\"][hostname] = {\"ansible_host\": ip}\n        \n    print(json.dumps(inventory, indent=4))\n\nif __name__ == \"__main__\":\n    main()<\/code><\/pre>\n<p>Bu beti\u011fi \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, Ansible&#8217;\u0131 a\u015fa\u011f\u0131daki gibi \u00e7a\u011f\u0131rabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">python generate_inventory.py > inventory.json\nansible-playbook -i inventory.json ansible\/playbook.yml<\/code><\/pre>\n<p>Veya daha geli\u015fmi\u015f senaryolarda, Ansible&#8217;\u0131n kendi bulut sa\u011flay\u0131c\u0131lar\u0131 i\u00e7in geli\u015ftirdi\u011fi dinamik envanter eklentilerini (\u00f6rn: <code>aws_ec2<\/code> envanter eklentisi) kullanarak Terraform taraf\u0131ndan eklenen etiketlere g\u00f6re sunucular\u0131 otomatik olarak ke\u015ffedebilirsiniz.<\/p>\n<h5>Avantajlar:<\/h5>\n<p>*   Terraform ve Ansible aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 azalt\u0131r, daha mod\u00fcler bir yap\u0131 sunar.<br \/>\n*   Daha b\u00fcy\u00fck ve karma\u015f\u0131k altyap\u0131lar i\u00e7in daha \u00f6l\u00e7eklenebilirdir.<br \/>\n*   CI\/CD boru hatlar\u0131na entegrasyonu daha kolayd\u0131r.<br \/>\n*   Ansible&#8217;\u0131n kendi dinamik envanter yeteneklerinden faydalan\u0131labilir.<\/p>\n<h5>Dezavantajlar:<\/h5>\n<p>*   Ek bir betik veya Ansible eklentisi yazma\/yap\u0131land\u0131rma ihtiyac\u0131 do\u011furur.<br \/>\n*   Ba\u015flang\u0131\u00e7 kurulumu, <code>local-exec<\/code>&#8216;e g\u00f6re biraz daha karma\u015f\u0131kt\u0131r.<\/p>\n<h4>3. Harici CI\/CD Boru Hatt\u0131 ile Entegrasyon<\/h4>\n<p>Bu, \u00fcretim ortamlar\u0131 i\u00e7in en sa\u011flam ve yayg\u0131n yakla\u015f\u0131md\u0131r. Terraform ve Ansible&#8217;\u0131n her biri kendi a\u015famalar\u0131nda, Jenkins, GitLab CI, GitHub Actions, Azure DevOps gibi bir CI\/CD arac\u0131 taraf\u0131ndan s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/p>\n<h5>Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h5>\n<p>1.  <strong>Terraform A\u015famas\u0131:<\/strong> CI\/CD boru hatt\u0131, Terraform kodunu \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n    *   <code>terraform init<\/code><br \/>\n    *   <code>terraform plan<\/code> (genellikle manuel onay veya otomatik kontrol ile)<br \/>\n    *   <code>terraform apply<\/code> (altyap\u0131 kaynaklar\u0131n\u0131 sa\u011flar)<br \/>\n    *   Bu a\u015famada, Terraform \u00e7\u0131kt\u0131lar\u0131 (IP adresleri, DNS adlar\u0131 vb.) bir sonraki a\u015fama i\u00e7in ortam de\u011fi\u015fkenleri olarak veya bir dosyaya kaydedilir.<br \/>\n2.  <strong>Ansible A\u015famas\u0131:<\/strong> Terraform a\u015famas\u0131 ba\u015far\u0131yla tamamland\u0131ktan sonra, CI\/CD boru hatt\u0131 Ansible kodunu \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n    *   Terraform \u00e7\u0131kt\u0131lar\u0131ndan elde edilen bilgilerle dinamik bir envanter olu\u015fturulur (veya do\u011frudan Ansible&#8217;\u0131n dinamik envanter eklentileri kullan\u0131l\u0131r).<br \/>\n    *   <code>ansible-playbook<\/code> komutu, bu envanter ve ilgili playbook&#8217;larla \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/p>\n<h5>\u00d6rnek CI\/CD Yap\u0131land\u0131rmas\u0131 (GitLab CI i\u00e7in basitle\u015ftirilmi\u015f):<\/h5>\n<pre><code class=\"language-yaml\">stages:\n  - provision\n  - configure\n\nvariables:\n  TF_ROOT: ${CI_PROJECT_DIR}\/terraform\n  ANSIBLE_ROOT: ${CI_PROJECT_DIR}\/ansible\n\nprovision_infrastructure:\n  stage: provision\n  image: hashicorp\/terraform:latest\n  script:\n    - cd $TF_ROOT\n    - terraform init\n    - terraform apply -auto-approve\n    - terraform output -json web_server_ips > ${CI_PROJECT_DIR}\/terraform_outputs.json\n  artifacts:\n    paths:\n      - ${CI_PROJECT_DIR}\/terraform_outputs.json # Ansible'\u0131n kullanmas\u0131 i\u00e7in \u00e7\u0131kt\u0131lar\u0131 sakla\n\nconfigure_servers:\n  stage: configure\n  image: ansible\/ansible:latest # Veya Python ve Ansible y\u00fckl\u00fc \u00f6zel bir imaj\n  needs: [\"provision_infrastructure\"]\n  script:\n    - cd $ANSIBLE_ROOT\n    - apt-get update && apt-get install -y python3-pip # Gerekliyse pip kur\n    - pip3 install boto3 # AWS dinamik envanter i\u00e7in\n    - python3 ${CI_PROJECT_DIR}\/scripts\/generate_ansible_inventory.py # Terraform \u00e7\u0131kt\u0131lar\u0131ndan envanter olu\u015ftur\n    - ansible-playbook -i inventory.json playbook.yml\n  dependencies:\n    - provision_infrastructure<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>generate_ansible_inventory.py<\/code> beti\u011fi, <code>terraform_outputs.json<\/code> dosyas\u0131n\u0131 okuyarak <code>inventory.json<\/code> dosyas\u0131n\u0131 olu\u015fturur.<\/p>\n<h5>Avantajlar:<\/h5>\n<p>*   <strong>Tam Ayr\u0131m:<\/strong> Terraform ve Ansible s\u00fcre\u00e7leri tamamen ayr\u0131lm\u0131\u015ft\u0131r, bu da her birinin kendi ya\u015fam d\u00f6ng\u00fcs\u00fcne sahip olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>G\u00fcvenilirlik ve \u00d6l\u00e7eklenebilirlik:<\/strong> \u00dcretim ortamlar\u0131 i\u00e7in en g\u00fcvenilir ve \u00f6l\u00e7eklenebilir yakla\u015f\u0131md\u0131r.<br \/>\n*   <strong>Geli\u015fmi\u015f Kontrol:<\/strong> Her a\u015fama i\u00e7in ayr\u0131 testler, onaylar ve hata y\u00f6netimi uygulanabilir.<br \/>\n*   <strong>\u0130\u015fbirli\u011fi:<\/strong> Farkl\u0131 ekiplerin (\u00f6rn. altyap\u0131 ekibi ve uygulama ekibi) kendi uzmanl\u0131k alanlar\u0131na odaklanmas\u0131na olanak tan\u0131r.<\/p>\n<h5>Dezavantajlar:<\/h5>\n<p>*   Kurulumu ve yap\u0131land\u0131rmas\u0131 di\u011fer yakla\u015f\u0131mlara g\u00f6re daha karma\u015f\u0131kt\u0131r.<br \/>\n*   Bir CI\/CD arac\u0131 ve boru hatt\u0131 bilgisi gerektirir.<\/p>\n<h3>Pratik Bir Senaryo: AWS EC2 ve Nginx Kurulumu<\/h3>\n<p>\u015eimdi, AWS \u00fczerinde bir EC2 instance&#8217;\u0131 olu\u015fturan ve \u00fczerine Nginx web sunucusunu kuran basit bir senaryoyu ele alal\u0131m. Dinamik envanter olu\u015fturma yakla\u015f\u0131m\u0131n\u0131 kullanaca\u011f\u0131z.<\/p>\n<h4>1. Terraform K\u0131sm\u0131 (Altyap\u0131 Sa\u011flama)<\/h4>\n<p><code>terraform\/main.tf<\/code> dosyan\u0131z:<\/p>\n<pre><code class=\"language-hcl\">provider \"aws\" {\n  region = \"us-east-1\" # Kendi b\u00f6lgenizi belirleyin\n}\n\nresource \"aws_security_group\" \"web_sg\" {\n  name        = \"web_server_sg_ansible\"\n  description = \"Allow SSH and HTTP traffic for Ansible managed servers\"\n  vpc_id      = var.vpc_id # Kendi VPC ID'nizi belirleyin\n\n  ingress {\n    from_port   = 22\n    to_port     = 22\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"] # G\u00fcvenlik i\u00e7in daha k\u0131s\u0131tl\u0131 bir IP aral\u0131\u011f\u0131 kullan\u0131n\n  }\n\n  ingress {\n    from_port   = 80\n    to_port     = 80\n    protocol    = \"tcp\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n\n  egress {\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0\/0\"]\n  }\n\n  tags = {\n    Name = \"web_server_sg_ansible\"\n  }\n}\n\nresource \"aws_instance\" \"web_server\" {\n  ami           = var.ami_id # Ubuntu 20.04 veya 22.04 LTS AMI ID'si\n  instance_type = \"t2.micro\"\n  key_name      = var.key_pair_name\n  vpc_security_group_ids = [aws_security_group.web_sg.id]\n  associate_public_ip_address = true # Public IP almas\u0131n\u0131 sa\u011fla\n\n  tags = {\n    Name        = \"AnsibleWebServer\"\n    Environment = \"Dev\"\n    Project     = \"TerraformAnsibleDemo\"\n  }\n}<\/code><\/pre>\n<p><code>terraform\/variables.tf<\/code> dosyan\u0131z:<\/p>\n<pre><code class=\"language-hcl\">variable \"ami_id\" {\n  description = \"The AMI ID for the EC2 instance.\"\n  type        = string\n  default     = \"ami-053b0d53c27927904\" # Ubuntu 22.04 LTS (us-east-1) - Kendi b\u00f6lgenize g\u00f6re g\u00fcncelleyin\n}\n\nvariable \"key_pair_name\" {\n  description = \"The name of the SSH key pair to use.\"\n  type        = string\n  default     = \"my-ssh-key\" # Kendi SSH anahtar ad\u0131n\u0131z\u0131 girin\n}\n\nvariable \"vpc_id\" {\n  description = \"The VPC ID where the EC2 instance will be launched.\"\n  type        = string\n  default     = \"vpc-0abcdef1234567890\" # Kendi VPC ID'nizi girin\n}<\/code><\/pre>\n<p><code>terraform\/outputs.tf<\/code> dosyan\u0131z:<\/p>\n<pre><code class=\"language-hcl\">output \"web_server_public_ips\" {\n  description = \"Public IPs of the web servers\"\n  value       = aws_instance.web_server.*.public_ip\n}<\/code><\/pre>\n<h4>2. Ansible K\u0131sm\u0131 (Nginx Kurulumu)<\/h4>\n<p><code>ansible\/playbook.yml<\/code> dosyan\u0131z:<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Configure Web Server with Nginx\n  hosts: webservers\n  become: yes # G\u00f6revleri root ayr\u0131cal\u0131klar\u0131yla \u00e7al\u0131\u015ft\u0131r\n\n  tasks:\n    - name: Ensure apt cache is updated\n      apt:\n        update_cache: yes\n        cache_valid_time: 3600 # 1 saat boyunca \u00f6nbelle\u011fi ge\u00e7erli tut\n\n    - name: Install Nginx package\n      apt:\n        name: nginx\n        state: present\n\n    - name: Ensure Nginx service is running and enabled\n      service:\n        name: nginx\n        state: started\n        enabled: yes\n\n    - name: Configure UFW (Uncomplicated Firewall) to allow Nginx HTTP\n      community.general.ufw:\n        rule: allow\n        name: Nginx HTTP\n\n    - name: Configure UFW to allow SSH\n      community.general.ufw:\n        rule: allow\n        port: '22'\n        proto: tcp\n\n    - name: Enable UFW\n      community.general.ufw:\n        state: enabled\n        \n    - name: Deploy a simple index.html\n      copy:\n        content: \"\"\n        dest: \/var\/www\/html\/index.html\n        owner: www-data\n        group: www-data\n        mode: '0644'<\/code><\/pre>\n<h4>3. Entegrasyon Ad\u0131mlar\u0131 (Dinamik Envanter ile)<\/h4>\n<p>Bu ad\u0131mlar\u0131 manuel olarak veya bir CI\/CD boru hatt\u0131 i\u00e7inde \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<p>1.  <strong>Terraform&#8217;u Ba\u015flat\u0131n ve Uygulay\u0131n:<\/strong><\/p>\n<pre><code class=\"language-bash\">cd terraform\n    terraform init\n    terraform plan\n    terraform apply -auto-approve<\/code><\/pre>\n<p>2.  <strong>Terraform \u00c7\u0131kt\u0131lar\u0131n\u0131 Al\u0131n:<\/strong><br \/>\n    Yeni olu\u015fturulan EC2 instance&#8217;\u0131n\u0131n public IP adresini alaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-bash\">terraform output -json web_server_public_ips > ..\/ansible\/terraform_ips.json\n    cd .. # Ana dizine geri d\u00f6n<\/code><\/pre>\n<p>3.  <strong>Dinamik Envanter Olu\u015fturun:<\/strong><br \/>\n    <code>ansible\/generate_inventory.py<\/code> ad\u0131nda bir Python beti\u011fi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-python\"># ansible\/generate_inventory.py\n    import json\n    import sys\n\n    def main():\n        try:\n            with open('terraform_ips.json', 'r') as f:\n                ips = json.load(f)\n        except FileNotFoundError:\n            print(\"Error: terraform_ips.json not found. Run 'terraform output' first.\", file=sys.stderr)\n            sys.exit(1)\n        except json.JSONDecodeError:\n            print(\"Error: Invalid JSON in terraform_ips.json.\", file=sys.stderr)\n            sys.exit(1)\n\n        inventory = {\n            \"webservers\": {\n                \"hosts\": {}\n            },\n            \"_meta\": {\n                \"hostvars\": {}\n            }\n        }\n\n        for i, ip in enumerate(ips):\n            hostname = f\"webserver_{i+1}\"\n            inventory[\"webservers\"][\"hosts\"][hostname] = {\n                \"ansible_host\": ip,\n                \"ansible_user\": \"ubuntu\", # Ubuntu AMI i\u00e7in varsay\u0131lan kullan\u0131c\u0131\n                \"ansible_ssh_private_key_file\": \"~\/.ssh\/my-ssh-key.pem\" # Kendi anahtar yolunuzu belirtin\n            }\n            \n        print(json.dumps(inventory, indent=4))\n\n    if __name__ == \"__main__\":\n        main()<\/code><\/pre>\n<p>    Bu beti\u011fi \u00e7al\u0131\u015ft\u0131rarak Ansible envanter dosyas\u0131n\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">cd ansible\n    python3 generate_inventory.py > inventory.json<\/code><\/pre>\n<p>4.  <strong>Ansible Playbook&#8217;unu \u00c7al\u0131\u015ft\u0131r\u0131n:<\/strong><\/p>\n<pre><code class=\"language-bash\">ansible-playbook -i inventory.json playbook.yml<\/code><\/pre>\n<p>Bu ad\u0131mlar tamamland\u0131\u011f\u0131nda, Terraform EC2 instance&#8217;\u0131n\u0131 sa\u011flam\u0131\u015f ve Ansible bu instance \u00fczerine Nginx&#8217;i kurup yap\u0131land\u0131rm\u0131\u015f olacakt\u0131r. <code>terraform output web_server_public_ips<\/code> komutu ile ald\u0131\u011f\u0131n\u0131z IP adresini taray\u0131c\u0131n\u0131zda a\u00e7t\u0131\u011f\u0131n\u0131zda &#8220;Hello from Ansible on Terraform EC2!&#8221; mesaj\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h3>En \u0130yi Uygulamalar<\/h3>\n<p>Terraform ve Ansible&#8217;\u0131 birlikte kullan\u0131rken, verimli, g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir bir i\u015f ak\u0131\u015f\u0131 sa\u011flamak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir.<\/p>\n<p>*   <strong>Mod\u00fcler Yap\u0131land\u0131rma:<\/strong><br \/>\n    *   <strong>Terraform Mod\u00fclleri:<\/strong> Yeniden kullan\u0131labilir altyap\u0131 bile\u015fenleri olu\u015fturmak i\u00e7in Terraform mod\u00fcllerini kullan\u0131n (\u00f6rn: bir VPC mod\u00fcl\u00fc, bir EC2 instance mod\u00fcl\u00fc).<br \/>\n    *   <strong>Ansible Rolleri:<\/strong> Konfig\u00fcrasyon g\u00f6revlerini mant\u0131ksal birimlere ay\u0131rmak ve yeniden kullan\u0131labilirli\u011fi art\u0131rmak i\u00e7in Ansible rollerini kullan\u0131n (\u00f6rn: bir Nginx rol\u00fc, bir veritaban\u0131 rol\u00fc).<br \/>\n*   <strong>Durum Y\u00f6netimi (Terraform State):<\/strong><br \/>\n    *   Terraform durum dosyas\u0131n\u0131 (tfstate) uzak bir backend&#8217;de (\u00f6rn: AWS S3, Azure Blob Storage, Google Cloud Storage) depolay\u0131n. Bu, durum dosyas\u0131n\u0131n kaybolmas\u0131n\u0131 \u00f6nler, e\u015f zamanl\u0131 \u00e7al\u0131\u015fmay\u0131 destekler ve g\u00fcvenli\u011fi art\u0131r\u0131r.<br \/>\n    *   Durum dosyas\u0131n\u0131 kilitlemek i\u00e7in backend yap\u0131land\u0131rmas\u0131nda kilitleme mekanizmalar\u0131n\u0131 (\u00f6rn: DynamoDB ile S3) etkinle\u015ftirin.<br \/>\n*   <strong>Gizli Bilgilerin Y\u00f6netimi:<\/strong><br \/>\n    *   Hassas bilgileri (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri, SSH anahtarlar\u0131) do\u011frudan kodda tutmaktan ka\u00e7\u0131n\u0131n.<br \/>\n    *   <strong>Ansible Vault:<\/strong> Ansible de\u011fi\u015fkenlerini \u015fifrelemek i\u00e7in Ansible Vault kullan\u0131n.<br \/>\n    *   <strong>Gizli Bilgi Y\u00f6netimi Hizmetleri:<\/strong> AWS Secrets Manager, Azure Key Vault, HashiCorp Vault gibi hizmetleri kullan\u0131n.<br \/>\n    *   Terraform ile gizli bilgileri y\u00f6netirken, <code>terraform plan<\/code> ve <code>terraform apply<\/code> \u00e7\u0131kt\u0131lar\u0131nda g\u00f6r\u00fcnmemesi i\u00e7in <code>sensitive = true<\/code> kullan\u0131n.<br \/>\n*   <strong>Idempotency:<\/strong><br \/>\n    *   Hem Terraform hem de Ansible&#8217;\u0131n idempotent do\u011fas\u0131n\u0131 anlay\u0131n ve bu prensibi kendi kodlar\u0131n\u0131zda da uygulay\u0131n. G\u00f6revlerin birden \u00e7ok kez \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131n ayn\u0131 sonucu verdi\u011finden ve istenmeyen yan etkiler yaratmad\u0131\u011f\u0131ndan emin olun.<br \/>\n*   <strong>Test Etme:<\/strong><br \/>\n    *   <strong>Terraform:<\/strong> <code>terraform plan<\/code> ile de\u011fi\u015fiklikleri \u00f6nizleyin. Daha geli\u015fmi\u015f testler i\u00e7in Terratest gibi ara\u00e7lar\u0131 kullanabilirsiniz.<br \/>\n    *   <strong>Ansible:<\/strong> Playbook&#8217;lar\u0131n\u0131z\u0131 Molecule gibi ara\u00e7larla test edin. Uygulama katman\u0131nda InSpec veya Serverspec gibi ara\u00e7larla uyumluluk ve g\u00fcvenlik denetimleri yap\u0131n.<br \/>\n*   <strong>CI\/CD Entegrasyonu:<\/strong><br \/>\n    *   Altyap\u0131 sa\u011flama ve konfig\u00fcrasyon y\u00f6netimi s\u00fcre\u00e7lerini CI\/CD boru hatlar\u0131na entegre edin. Bu, otomatik testleri, kod kalitesi kontrollerini ve da\u011f\u0131t\u0131mlar\u0131 m\u00fcmk\u00fcn k\u0131lar.<br \/>\n    *   Terraform&#8217;u ayr\u0131 bir a\u015famada, Ansible&#8217;\u0131 ise onu takip eden ba\u015fka bir a\u015famada \u00e7al\u0131\u015ft\u0131r\u0131n.<br \/>\n*   <strong>Versiyon Kontrol\u00fc:<\/strong><br \/>\n    *   T\u00fcm Terraform ve Ansible kodlar\u0131n\u0131 Git gibi bir s\u00fcr\u00fcm kontrol sisteminde saklay\u0131n. Bu, de\u011fi\u015fikliklerin izlenmesini, geri al\u0131nmas\u0131n\u0131 ve i\u015fbirli\u011fini kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>\u0130zinler ve Yetkilendirme:<\/strong><br \/>\n    *   Hem Terraform&#8217;un bulut sa\u011flay\u0131c\u0131s\u0131yla etkile\u015fim kurarken hem de Ansible&#8217;\u0131n hedef sunuculara ba\u011flan\u0131rken en az ayr\u0131cal\u0131k (least privilege) ilkesini uygulay\u0131n. Yaln\u0131zca gerekli izinleri verin.<br \/>\n    *   SSH anahtarlar\u0131n\u0131 g\u00fcvenli bir \u015fekilde y\u00f6netin ve bunlar\u0131 CI\/CD ortam\u0131nda da g\u00fcvenli bir \u015fekilde kullan\u0131ld\u0131\u011f\u0131ndan emin olun.<br \/>\n*   <strong>Dok\u00fcmantasyon:<\/strong><br \/>\n    *   Terraform yap\u0131land\u0131rmalar\u0131n\u0131z\u0131 ve Ansible playbook&#8217;lar\u0131n\u0131z\u0131 iyi belgeleyin. Bu, \u00f6zellikle yeni ekip \u00fcyelerinin projeye dahil olmas\u0131 veya uzun vadeli bak\u0131m i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Potansiyel Zorluklar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p>Terraform ve Ansible&#8217;\u0131 birlikte kullanmak bir\u00e7ok avantaj sunsa da, baz\u0131 zorluklarla kar\u015f\u0131la\u015fabilirsiniz. Bu zorluklar\u0131 \u00f6nceden bilmek ve olas\u0131 \u00e7\u00f6z\u00fcmlerini anlamak, sorunsuz bir entegrasyon s\u00fcreci sa\u011flaman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi ve S\u0131ralama:<\/strong><br \/>\n    *   <strong>Zorluk:<\/strong> Terraform&#8217;un olu\u015fturdu\u011fu kaynaklar tam olarak haz\u0131r olmadan Ansible&#8217;\u0131n \u00e7al\u0131\u015fmaya ba\u015flamas\u0131. \u00d6rne\u011fin, bir EC2 instance&#8217;\u0131n\u0131n ba\u015flat\u0131lmas\u0131 ve SSH&#8217;in eri\u015filebilir hale gelmesi zaman alabilir.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong><br \/>\n        *   <code>local-exec<\/code> kullan\u0131rken <code>sleep<\/code> komutu eklemek (basit senaryolar i\u00e7in).<br \/>\n        *   Terraform&#8217;un <code>remote-exec<\/code> provisioner&#8217;\u0131n\u0131 kullanarak sunucunun haz\u0131r oldu\u011funu kontrol eden bir betik \u00e7al\u0131\u015ft\u0131rmak.<br \/>\n        *   Ansible&#8217;\u0131n <code>wait_for_connection<\/code> mod\u00fcl\u00fcn\u00fc veya <code>delegate_to<\/code> ile <code>wait_for<\/code> mod\u00fcl\u00fcn\u00fc kullanarak hedef sunucunun SSH ba\u011flant\u0131s\u0131na haz\u0131r olmas\u0131n\u0131 beklemek.<br \/>\n        *   CI\/CD boru hatlar\u0131nda, Terraform ad\u0131m\u0131 ile Ansible ad\u0131m\u0131 aras\u0131na yeterli bir bekleme s\u00fcresi veya daha ak\u0131ll\u0131 bir haz\u0131r olma kontrol\u00fc eklemek.<br \/>\n*   <strong>Hata Y\u00f6netimi ve Geri Alma (Rollback):<\/strong><br \/>\n    *   <strong>Zorluk:<\/strong> Terraform ba\u015far\u0131l\u0131 bir \u015fekilde altyap\u0131y\u0131 sa\u011flad\u0131ktan sonra Ansible playbook&#8217;u ba\u015far\u0131s\u0131z olursa ne olur? Terraform altyap\u0131y\u0131 geri almaz.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong><br \/>\n        *   Ansible playbook&#8217;lar\u0131n\u0131 mod\u00fcler ve test edilebilir hale getirin.<br \/>\n        *   CI\/CD boru hatt\u0131n\u0131zda, Ansible ad\u0131m\u0131n\u0131n ba\u015far\u0131s\u0131z olmas\u0131 durumunda Terraform taraf\u0131ndan sa\u011flanan kaynaklar\u0131 temizleyen (veya \u00f6nceki duruma geri d\u00f6nd\u00fcren) bir geri alma stratejisi tan\u0131mlay\u0131n.<br \/>\n        *   Geli\u015ftirme ve test ortamlar\u0131nda bolca pratik yaparak hatalar\u0131 \u00f6nceden tespit edin.<br \/>\n*   <strong>Durum Senkronizasyonu:<\/strong><br \/>\n    *   <strong>Zorluk:<\/strong> Terraform state&#8217;i ile ger\u00e7ek altyap\u0131 aras\u0131nda veya Ansible&#8217;\u0131n varsay\u0131lanlar\u0131yla ger\u00e7ek konfig\u00fcrasyon aras\u0131nda tutars\u0131zl\u0131klar olu\u015fabilir.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong><br \/>\n        *   Terraform i\u00e7in uzak backend ve durum kilitleme kullan\u0131n.<br \/>\n        *   Ansible&#8217;\u0131n idempotent do\u011fas\u0131na g\u00fcvenin ve playbook&#8217;lar\u0131n\u0131z\u0131 bu prensibe g\u00f6re yaz\u0131n.<br \/>\n        *   D\u00fczenli olarak <code>terraform plan<\/code> ve <code>ansible-playbook --check<\/code> komutlar\u0131n\u0131 kullanarak mevcut durum ile istenen durum aras\u0131ndaki farkl\u0131l\u0131klar\u0131 kontrol edin.<br \/>\n*   <strong>Yetkilendirme ve Kimlik Do\u011frulama:<\/strong><br \/>\n    *   <strong>Zorluk:<\/strong> Terraform&#8217;un bulut sa\u011flay\u0131c\u0131s\u0131yla ve Ansible&#8217;\u0131n hedef sunucularla g\u00fcvenli bir \u015fekilde kimlik do\u011frulamas\u0131 yapmas\u0131.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong><br \/>\n        *   Terraform i\u00e7in IAM rolleri (AWS), Service Principals (Azure), Service Accounts (GCP) gibi bulut sa\u011flay\u0131c\u0131s\u0131n\u0131n yerel kimlik ve eri\u015fim y\u00f6netimi ara\u00e7lar\u0131n\u0131 kullan\u0131n.<br \/>\n        *   Ansible i\u00e7in SSH anahtarlar\u0131n\u0131 kullan\u0131n ve bunlar\u0131 g\u00fcvenli bir \u015fekilde y\u00f6netin. <code>ansible_ssh_private_key_file<\/code> veya SSH agent forwarding kullan\u0131n.<br \/>\n        *   Gizli bilgileri (\u015fifreler, API anahtarlar\u0131) asla do\u011frudan kodda tutmay\u0131n; Ansible Vault veya \u00f6zel gizli bilgi y\u00f6netim hizmetleri kullan\u0131n.<br \/>\n*   <strong>Performans ve \u00d6l\u00e7eklenebilirlik:<\/strong><br \/>\n    *   <strong>Zorluk:<\/strong> \u00c7ok say\u0131da kaynak sa\u011fland\u0131\u011f\u0131nda veya \u00e7ok say\u0131da sunucu konfig\u00fcre edildi\u011finde i\u015flemlerin yava\u015flamas\u0131.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong><br \/>\n        *   Terraform mod\u00fcllerini ve Ansible rollerini optimize edin.<br \/>\n        *   Terraform&#8217;da <code>max_parallelism<\/code> ayar\u0131n\u0131 kullanarak paralel kaynak olu\u015fturmay\u0131 kontrol edin.<br \/>\n        *   Ansible&#8217;da <code>forks<\/code> ayar\u0131n\u0131 art\u0131rarak veya <code>pipelining<\/code> \u00f6zelli\u011fini etkinle\u015ftirerek performans art\u0131\u015f\u0131 sa\u011flay\u0131n.<br \/>\n        *   B\u00fcy\u00fck da\u011f\u0131t\u0131mlar i\u00e7in CI\/CD ortam\u0131n\u0131n performans\u0131n\u0131 ve kaynaklar\u0131n\u0131 g\u00f6zden ge\u00e7irin.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Terraform ve Ansible, modern DevOps ve bulut altyap\u0131 y\u00f6netiminde vazge\u00e7ilmez iki ara\u00e7t\u0131r. Terraform, altyap\u0131 kaynaklar\u0131n\u0131 kod olarak tan\u0131mlaman\u0131za ve sa\u011flaman\u0131za olanak tan\u0131rken, Ansible bu kaynaklar\u0131n i\u015fletim sistemi ve uygulama katmanlar\u0131n\u0131 yap\u0131land\u0131rman\u0131za, yaz\u0131l\u0131mlar\u0131 da\u011f\u0131tman\u0131za ve s\u00fcrekli konfig\u00fcrasyon y\u00f6netimi yapman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<p>Bu iki arac\u0131n stratejik olarak birle\u015ftirilmesi, altyap\u0131n\u0131n &#8220;s\u0131f\u0131r\u0131nc\u0131 g\u00fcn\u00fcnden&#8221; \u00f6tesine ge\u00e7erek, tamamen otomatize edilmi\u015f, tutarl\u0131, g\u00fcvenli ve \u00f6l\u00e7eklenebilir bir altyap\u0131 ya\u015fam d\u00f6ng\u00fcs\u00fc sunar. <code>local-exec<\/code> ile do\u011frudan entegrasyondan dinamik envanter olu\u015fturma ve harici CI\/CD boru hatlar\u0131na kadar farkl\u0131 entegrasyon yakla\u015f\u0131mlar\u0131, projenizin ihtiya\u00e7lar\u0131na g\u00f6re esneklik sa\u011flar.<\/p>\n<p>En iyi uygulamalar\u0131 takip ederek ve potansiyel zorluklara kar\u015f\u0131 haz\u0131rl\u0131kl\u0131 olarak, ekipler altyap\u0131lar\u0131n\u0131 daha verimli bir \u015fekilde y\u00f6netebilir, da\u011f\u0131t\u0131m s\u00fcrelerini k\u0131saltabilir ve operasyonel maliyetleri d\u00fc\u015f\u00fcrebilirler. Terraform ve Ansible&#8217;\u0131 birlikte kullanmak, &#8220;Infrastructure as Code&#8221; felsefesini tam anlam\u0131yla benimsemenin ve modern bulut tabanl\u0131 sistemlerin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 y\u00f6netmenin g\u00fc\u00e7l\u00fc bir yoludur. Bu sinerji, altyap\u0131 y\u00f6netimini bir sanat olmaktan \u00e7\u0131kar\u0131p, m\u00fchendislik disiplini haline getirir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Terraform ve Ansible&#8217;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi\nInfrastructure as Code (IaC) yakla\u015f\u0131mlar\u0131, modern yaz\u0131l\u0131m geli\u015ftirme ve op","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31597","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Terraform ve Ansible&#039;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Terraform ve Ansible&#039;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi\" \/>\n<meta property=\"og:description\" content=\"Terraform ve Ansible&#039;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi Infrastructure as Code (IaC) yakla\u015f\u0131mlar\u0131, modern yaz\u0131l\u0131m geli\u015ftirme ve op\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-11T15:41:39+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Terraform ve Ansible&#8217;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi\",\"datePublished\":\"2025-10-11T15:41:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/\"},\"wordCount\":3656,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/\",\"name\":\"Terraform ve Ansible'\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-11T15:41:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Terraform ve Ansible&#8217;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Terraform ve Ansible'\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Terraform ve Ansible'\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi","og_description":"Terraform ve Ansible'\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi Infrastructure as Code (IaC) yakla\u015f\u0131mlar\u0131, modern yaz\u0131l\u0131m geli\u015ftirme ve op","og_url":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-11T15:41:39+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Terraform ve Ansible&#8217;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi","datePublished":"2025-10-11T15:41:39+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/"},"wordCount":3656,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/","url":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/","name":"Terraform ve Ansible'\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-11T15:41:39+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/terraform-ve-ansiblei-birlikte-kullanarak-konfigurasyon-yonetimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Terraform ve Ansible&#8217;\u0131 Birlikte Kullanarak Konfig\u00fcrasyon Y\u00f6netimi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31597"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31597\/revisions"}],"predecessor-version":[{"id":31598,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31597\/revisions\/31598"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31597"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31597"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}