{"id":38169,"date":"2026-01-24T21:40:53","date_gmt":"2026-01-24T18:40:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38169"},"modified":"2026-01-24T21:40:53","modified_gmt":"2026-01-24T18:40:53","slug":"ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/","title":{"rendered":"Ansible Playbook&#8217;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Ansible Playbook&#8217;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Sunucu kurulumu ve yap\u0131land\u0131rmas\u0131, bilgi teknolojileri altyap\u0131s\u0131n\u0131n temel ta\u015flar\u0131ndan biridir. Geleneksel olarak manuel s\u00fcre\u00e7lerle y\u00fcr\u00fct\u00fclen bu g\u00f6revler, zaman al\u0131c\u0131, hataya a\u00e7\u0131k ve tutars\u0131z sonu\u00e7lar do\u011furabilen i\u015flemlerdir. Modern BT d\u00fcnyas\u0131nda, altyap\u0131n\u0131n h\u0131zla de\u011fi\u015fen ihtiya\u00e7lar\u0131na ayak uydurabilmek i\u00e7in otomasyon vazge\u00e7ilmez bir gereklilik haline gelmi\u015ftir. Bu makalede, a\u00e7\u0131k kaynakl\u0131 ve kullan\u0131m\u0131 kolay bir otomasyon arac\u0131 olan Ansible&#8217;\u0131 kullanarak sunucu kurulumunu nas\u0131l otomatikle\u015ftirebilece\u011finizi ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyece\u011fiz. Ansible&#8217;\u0131n temel kavramlar\u0131ndan ba\u015flayarak, playbook yaz\u0131m\u0131na, geli\u015fmi\u015f \u00f6zelliklerine ve en iyi uygulamalara kadar geni\u015f bir yelpazede bilgi sunaca\u011f\u0131z. Amac\u0131m\u0131z, sunucu yap\u0131land\u0131rma s\u00fcre\u00e7lerinizi daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha y\u00f6netilebilir hale getirmeniz i\u00e7in size pratik bir yol haritas\u0131 sunmakt\u0131r.<\/p>\n<h2>Sunucu Kurulumunu Neden Otomatikle\u015ftirmeliyiz?<\/h2>\n<p>Sunucu kurulumunu otomatikle\u015ftirmek, g\u00fcn\u00fcm\u00fcz\u00fcn dinamik ve \u00f6l\u00e7eklenebilir altyap\u0131 gereksinimlerini kar\u015f\u0131lamak i\u00e7in kritik \u00f6neme sahiptir. Manuel s\u00fcre\u00e7lerin getirdi\u011fi zorluklar ve riskler, otomasyonun sundu\u011fu avantajlarla kolayca a\u015f\u0131labilir.<\/p>\n<h3>Tutarl\u0131l\u0131k<\/h3>\n<p>Manuel kurulumlar s\u0131ras\u0131nda insan hatas\u0131 ka\u00e7\u0131n\u0131lmazd\u0131r. Farkl\u0131 sunucular\u0131n farkl\u0131 zamanlarda, farkl\u0131 ki\u015filer taraf\u0131ndan kurulmas\u0131, yap\u0131land\u0131rma tutars\u0131zl\u0131klar\u0131na yol a\u00e7abilir. Otomasyon, t\u00fcm sunucular\u0131n ayn\u0131 blueprint&#8217;e g\u00f6re, hatas\u0131z bir \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. Bu, sorun gidermeyi kolayla\u015ft\u0131r\u0131r ve beklenmeyen davran\u0131\u015flar\u0131 azalt\u0131r.<\/p>\n<h3>H\u0131z<\/h3>\n<p>Yeni bir sunucu kurmak veya mevcut bir sunucuyu yeniden yap\u0131land\u0131rmak, manuel olarak saatler hatta g\u00fcnler s\u00fcrebilir. Otomasyon ara\u00e7lar\u0131, bu s\u00fcreci dakikalara indirerek i\u015f y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Bu h\u0131z, \u00f6zellikle acil durum kurtarma senaryolar\u0131nda veya anl\u0131k \u00f6l\u00e7eklendirme ihtiya\u00e7lar\u0131nda hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<h3>G\u00fcvenilirlik<\/h3>\n<p>Otomatikle\u015ftirilmi\u015f s\u00fcre\u00e7ler, belirli bir mant\u0131k ve s\u0131ralama dahilinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in \u00e7ok daha g\u00fcvenilirdir. Bir playbook bir kez do\u011fru yaz\u0131ld\u0131\u011f\u0131nda, her \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda ayn\u0131 sonucu verir. Bu, da\u011f\u0131t\u0131mlar\u0131n ve yap\u0131land\u0131rmalar\u0131n \u00f6ng\u00f6r\u00fclebilirli\u011fini art\u0131r\u0131r ve \u00fcretim ortamlar\u0131nda g\u00fcvenli\u011fi ve istikrar\u0131 sa\u011flar.<\/p>\n<h3>Maliyet Etkinli\u011fi<\/h3>\n<p>Otomasyon, insan g\u00fcc\u00fcnden tasarruf sa\u011flayarak maliyetleri d\u00fc\u015f\u00fcr\u00fcr. BT ekipleri, tekrarlayan ve s\u0131k\u0131c\u0131 g\u00f6revler yerine, daha stratejik ve de\u011fer yaratan projelere odaklanabilirler. Ayr\u0131ca, hatalardan kaynaklanan kesinti s\u00fcrelerinin azalmas\u0131 da dolayl\u0131 maliyet avantajlar\u0131 sunar.<\/p>\n<h3>S\u00fcrd\u00fcr\u00fclebilirlik ve Y\u00f6netilebilirlik<\/h3>\n<p>Otomasyon betikleri (playbook&#8217;lar), s\u00fcr\u00fcm kontrol sistemleri (Git gibi) ile y\u00f6netilebilir. Bu, yap\u0131land\u0131rma de\u011fi\u015fikliklerinin izlenmesini, geri al\u0131nmas\u0131n\u0131 ve denetlenmesini kolayla\u015ft\u0131r\u0131r. Altyap\u0131n\u0131z\u0131n &#8220;kod olarak&#8221; y\u00f6netilmesi (Infrastructure as Code &#8211; IaC) prensibiyle, altyap\u0131 de\u011fi\u015fiklikleri yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7leriyle ayn\u0131 disiplinle ele al\u0131nabilir.<\/p>\n<h2>Ansible&#8217;a Giri\u015f<\/h2>\n<p>Ansible, Red Hat taraf\u0131ndan geli\u015ftirilen, a\u00e7\u0131k kaynakl\u0131 bir BT otomasyon motorudur. Yap\u0131land\u0131rma y\u00f6netimi, uygulama da\u011f\u0131t\u0131m\u0131, hizmet orkestrasyonu ve daha bir\u00e7ok g\u00f6revi otomatikle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Ansible&#8217;\u0131 di\u011fer otomasyon ara\u00e7lar\u0131ndan ay\u0131ran en \u00f6nemli \u00f6zelliklerden biri, &#8220;agents\u0131z&#8221; (agentless) olmas\u0131d\u0131r. Yani, y\u00f6netilecek sunuculara \u00f6zel bir yaz\u0131l\u0131m y\u00fcklemenize gerek yoktur; standart SSH protokol\u00fc \u00fczerinden ileti\u015fim kurar.<\/p>\n<h3>Ansible&#8217;\u0131n Temel Bile\u015fenleri<\/h3>\n<p>Ansible&#8217;\u0131n \u00e7al\u0131\u015fma prensibini anlamak i\u00e7in temel bile\u015fenlerini bilmek \u00f6nemlidir:<\/p>\n<h3>Kontrol D\u00fc\u011f\u00fcm\u00fc (Control Node)<\/h3>\n<p>Ansible&#8217;\u0131n y\u00fckl\u00fc oldu\u011fu ve playbook&#8217;lar\u0131n \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 makinedir. Bu makine, y\u00f6netilecek di\u011fer sunucularla SSH \u00fczerinden ileti\u015fim kurar.<\/p>\n<h3>Y\u00f6netilen D\u00fc\u011f\u00fcmler (Managed Nodes)<\/h3>\n<p>Ansible taraf\u0131ndan yap\u0131land\u0131r\u0131lacak veya y\u00f6netilecek hedef sunuculard\u0131r. Bunlar fiziksel sunucular, sanal makineler, bulut \u00f6rnekleri veya a\u011f cihazlar\u0131 olabilir.<\/p>\n<h3>Envanter (Inventory)<\/h3>\n<p>Y\u00f6netilen d\u00fc\u011f\u00fcmlerin bir listesini i\u00e7eren bir dosyad\u0131r. Bu dosya, hangi sunucular\u0131n hangi gruplara ait oldu\u011funu ve bunlara \u00f6zg\u00fc de\u011fi\u015fkenleri tan\u0131mlar. Genellikle INI veya YAML format\u0131nda yaz\u0131l\u0131r.<\/p>\n<h3>Mod\u00fcller (Modules)<\/h3>\n<p>Ansible&#8217;\u0131n i\u015fi yapan birimleridir. Bir mod\u00fcl, belirli bir g\u00f6revi (\u00f6rne\u011fin, bir paket kurma, bir hizmeti ba\u015flatma, bir dosyay\u0131 kopyalama) ger\u00e7ekle\u015ftirmek i\u00e7in tasarlanm\u0131\u015f ba\u011f\u0131ms\u0131z bir betiktir. Ansible y\u00fczlerce yerle\u015fik mod\u00fcl ile gelir (apt, yum, service, copy, file vb.).<\/p>\n<h3>G\u00f6revler (Tasks)<\/h3>\n<p>Bir g\u00f6revi ger\u00e7ekle\u015ftirmek i\u00e7in bir mod\u00fcl\u00fcn \u00e7a\u011fr\u0131lmas\u0131d\u0131r. Her g\u00f6rev, bir eylemi ve o eylemi ger\u00e7ekle\u015ftirmek i\u00e7in gereken parametreleri tan\u0131mlar.<\/p>\n<h3>Oyun Kitaplar\u0131 (Playbooks)<\/h3>\n<p>Ansible&#8217;\u0131n kalbidir. Bir veya daha fazla &#8220;oyun&#8221; (play) i\u00e7eren YAML format\u0131nda yaz\u0131lm\u0131\u015f dosyalard\u0131r. Playbook&#8217;lar, belirli bir hedefe (\u00f6rne\u011fin, bir web sunucusu kurmak) ula\u015fmak i\u00e7in ad\u0131m ad\u0131m g\u00f6revleri tan\u0131mlar.<\/p>\n<h3>Oyunlar (Plays)<\/h3>\n<p>Bir playbook i\u00e7indeki bir b\u00f6l\u00fcm\u00fc temsil eder. Bir oyun, belirli bir envanter grubundaki veya ana bilgisayardaki g\u00f6revlerin bir listesini belirli bir s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<h3>Roller (Roles)<\/h3>\n<p>Playbook&#8217;lar\u0131 daha d\u00fczenli ve yeniden kullan\u0131labilir hale getirmek i\u00e7in kullan\u0131lan bir organizasyon mekanizmas\u0131d\u0131r. Roller, g\u00f6revler, de\u011fi\u015fkenler, \u015fablonlar ve i\u015fleyiciler gibi ilgili t\u00fcm bile\u015fenleri belirli bir dizin yap\u0131s\u0131 alt\u0131nda toplar.<\/p>\n<h2>Ansible Kurulumu<\/h2>\n<p>Ansible&#8217;\u0131 kontrol d\u00fc\u011f\u00fcm\u00fcn\u00fcze kurmak olduk\u00e7a basittir. Ansible genellikle Linux tabanl\u0131 sistemlerde \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r. Bu \u00f6rnekte, Ubuntu\/Debian tabanl\u0131 bir sistemde kurulumu g\u00f6sterece\u011fiz.<\/p>\n<p>\u00d6ncelikle, sisteminizde Python ve pip&#8217;in kurulu oldu\u011fundan emin olun:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install python3 python3-pip -y<\/code><\/pre>\n<p>Ard\u0131ndan, pip kullanarak Ansible&#8217;\u0131 kurun:<\/p>\n<pre><code class=\"language-bash\">pip3 install ansible<\/code><\/pre>\n<p>Kurulumun ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">ansible --version<\/code><\/pre>\n<p>Bu komut, Ansible s\u00fcr\u00fcm\u00fcn\u00fc ve di\u011fer yap\u0131land\u0131rma bilgilerini g\u00f6stermelidir.<\/p>\n<p><strong>SSH Anahtar Yap\u0131land\u0131rmas\u0131:<\/strong> Ansible, y\u00f6netilen d\u00fc\u011f\u00fcmlerle SSH \u00fczerinden g\u00fcvenli bir \u015fekilde ileti\u015fim kurar. Bu nedenle, kontrol d\u00fc\u011f\u00fcm\u00fcn\u00fczden y\u00f6netilen d\u00fc\u011f\u00fcmlere parolas\u0131z SSH eri\u015fimi sa\u011flaman\u0131z \u00f6nemlidir.<\/p>\n<p>1.  <strong>SSH anahtar \u00e7ifti olu\u015fturma (e\u011fer yoksa):<\/strong><\/p>\n<pre><code class=\"language-bash\">ssh-keygen -t rsa -b 4096 -C \"your_email@example.com\"<\/code><\/pre>\n<p>    Varsay\u0131lan konum ve bo\u015f parola ile devam edebilirsiniz. Bu, <code>~\/.ssh\/id_rsa<\/code> (\u00f6zel anahtar) ve <code>~\/.ssh\/id_rsa.pub<\/code> (genel anahtar) dosyalar\u0131n\u0131 olu\u015fturacakt\u0131r.<\/p>\n<p>2.  <strong>Genel anahtar\u0131 y\u00f6netilen d\u00fc\u011f\u00fcmlere kopyalama:<\/strong><\/p>\n<pre><code class=\"language-bash\">ssh-copy-id username@remote_host_ip<\/code><\/pre>\n<p>    Bu komut, genel anahtar\u0131n\u0131z\u0131 hedef sunucudaki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na ekleyecektir. Bu ad\u0131m\u0131 her hedef sunucu i\u00e7in tekrarlay\u0131n. Art\u0131k kontrol d\u00fc\u011f\u00fcm\u00fcn\u00fczden hedef sunuculara parola girmeden SSH yapabilmelisiniz.<\/p>\n<h2>Envanter Dosyas\u0131 Olu\u015fturma<\/h2>\n<p>Envanter dosyas\u0131, Ansible&#8217;\u0131n hangi sunucular\u0131 y\u00f6netece\u011fini ve bu sunucular\u0131n hangi gruplara ait oldu\u011funu bildi\u011fi yerdir. Bu dosya genellikle <code>hosts<\/code> olarak adland\u0131r\u0131l\u0131r ve Ansible&#8217;\u0131n varsay\u0131lan olarak arad\u0131\u011f\u0131 yer <code>\/etc\/ansible\/hosts<\/code> konumudur, ancak kendi \u00e7al\u0131\u015fma dizininizde de tan\u0131mlayabilirsiniz.<\/p>\n<p>Envanter dosyalar\u0131 INI veya YAML format\u0131nda olabilir. INI format\u0131 daha yayg\u0131n ve basittir:<\/p>\n<pre><code class=\"language-ini\"># hosts dosyas\u0131 \u00f6rne\u011fi\n\n[webservers]\nweb1.example.com\nweb2.example.com ansible_host=192.168.1.101\n\n[databases]\ndb1.example.com\n\n[all:vars]\nansible_user=ubuntu\nansible_ssh_private_key_file=~\/.ssh\/id_rsa<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n*   <code>[webservers]<\/code> ve <code>[databases]<\/code> sunucu gruplar\u0131n\u0131 tan\u0131mlar.<br \/>\n*   <code>web1.example.com<\/code> ve <code>db1.example.com<\/code> sunucu ana bilgisayar adlar\u0131d\u0131r.<br \/>\n*   <code>ansible_host<\/code> de\u011fi\u015fkeni, e\u011fer ana bilgisayar ad\u0131 DNS taraf\u0131ndan \u00e7\u00f6z\u00fclemiyorsa veya farkl\u0131 bir IP kullanmak istiyorsan\u0131z, belirli bir IP adresini belirtmenizi sa\u011flar.<br \/>\n*   <code>[all:vars]<\/code> t\u00fcm ana bilgisayarlar i\u00e7in ge\u00e7erli olan genel de\u011fi\u015fkenleri tan\u0131mlar. Burada <code>ansible_user<\/code> (SSH ba\u011flant\u0131s\u0131 i\u00e7in kullan\u0131lacak kullan\u0131c\u0131) ve <code>ansible_ssh_private_key_file<\/code> (SSH anahtar\u0131n\u0131n yolu) tan\u0131mlanm\u0131\u015ft\u0131r.<\/p>\n<p><strong>Ba\u011flant\u0131y\u0131 Test Etme:<\/strong> Envanter dosyan\u0131z\u0131 olu\u015fturduktan sonra, Ansible&#8217;\u0131n sunucular\u0131n\u0131za ula\u015f\u0131p ula\u015famad\u0131\u011f\u0131n\u0131 test etmek iyi bir uygulamad\u0131r:<\/p>\n<pre><code class=\"language-bash\">ansible all -i hosts -m ping<\/code><\/pre>\n<p>Bu komut, envanter dosyas\u0131ndaki t\u00fcm ana bilgisayarlara <code>ping<\/code> mod\u00fcl\u00fcn\u00fc \u00e7al\u0131\u015ft\u0131r\u0131r. Ba\u015far\u0131l\u0131 olursa, her ana bilgisayar i\u00e7in <code>SUCCESS<\/code> ve <code>pong<\/code> yan\u0131t\u0131n\u0131 g\u00f6r\u00fcrs\u00fcn\u00fcz.<\/p>\n<h2>\u0130lk Ansible Playbook&#8217;unuzu Yazma<\/h2>\n<p>Bir playbook, Ansible&#8217;\u0131n y\u00f6netilen d\u00fc\u011f\u00fcmlerde ger\u00e7ekle\u015ftirece\u011fi g\u00f6revlerin s\u0131ras\u0131n\u0131 tan\u0131mlayan bir YAML dosyas\u0131d\u0131r. \u015eimdi, basit bir web sunucusu (Nginx) kurulumu ve yap\u0131land\u0131rmas\u0131 i\u00e7in bir playbook yazal\u0131m.<\/p>\n<h3>Playbook Yap\u0131s\u0131<\/h3>\n<p>Bir playbook genellikle \u015fu temel unsurlar\u0131 i\u00e7erir:<br \/>\n*   <code>---<\/code>: YAML dosyas\u0131n\u0131n ba\u015flang\u0131c\u0131n\u0131 belirtir.<br \/>\n*   <code>- name:<\/code>: Playbook&#8217;un veya g\u00f6revin a\u00e7\u0131klay\u0131c\u0131 ad\u0131.<br \/>\n*   <code>hosts:<\/code>: G\u00f6revlerin hangi ana bilgisayar grubunda veya ana bilgisayarda \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <code>become: yes<\/code>: G\u00f6revlerin sudo yetkileriyle \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar (root yetkisi gerektiren i\u015flemler i\u00e7in).<br \/>\n*   <code>tasks:<\/code>: \u00c7al\u0131\u015ft\u0131r\u0131lacak g\u00f6revlerin bir listesi. Her g\u00f6rev bir mod\u00fcl \u00e7a\u011fr\u0131s\u0131d\u0131r.<\/p>\n<h3>Basit Bir Nginx Kurulum Playbook&#8217;u<\/h3>\n<p><code>nginx_setup.yml<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Nginx Kurulumu ve Yap\u0131land\u0131rmas\u0131\n  hosts: webservers\n  become: yes # G\u00f6revleri root yetkileriyle \u00e7al\u0131\u015ft\u0131r\n  \n  tasks:\n    - name: APT \u00f6nbelle\u011fini g\u00fcncelle\n      apt:\n        update_cache: yes\n        cache_valid_time: 3600 # \u00d6nbelle\u011fi 1 saat ge\u00e7erli tut\n\n    - name: Nginx paketini kur\n      apt:\n        name: nginx\n        state: present # Paketin kurulu olmas\u0131n\u0131 sa\u011flar\n\n    - name: Nginx servisini ba\u015flat ve ba\u015flang\u0131\u00e7ta etkinle\u015ftir\n      service:\n        name: nginx\n        state: started # Servisin \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 sa\u011flar\n        enabled: yes   # Servisin sistem ba\u015flang\u0131c\u0131nda otomatik ba\u015flamas\u0131n\u0131 sa\u011flar\n\n    - name: Nginx varsay\u0131lan index.html dosyas\u0131n\u0131 kald\u0131r\n      file:\n        path: \/var\/www\/html\/index.nginx-debian.html\n        state: absent # Dosyan\u0131n kald\u0131r\u0131lmas\u0131n\u0131 sa\u011flar\n\n    - name: \u00d6zel index.html dosyas\u0131n\u0131 kopyala\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<p>Bu playbook, <code>webservers<\/code> grubundaki t\u00fcm sunucularda a\u015fa\u011f\u0131daki g\u00f6revleri ger\u00e7ekle\u015ftirir:<br \/>\n1.  APT paket \u00f6nbelle\u011fini g\u00fcnceller.<br \/>\n2.  Nginx paketini kurar (e\u011fer kurulu de\u011filse).<br \/>\n3.  Nginx hizmetini ba\u015flat\u0131r ve sistem a\u00e7\u0131l\u0131\u015f\u0131nda otomatik ba\u015flamas\u0131n\u0131 sa\u011flar.<br \/>\n4.  Nginx&#8217;in varsay\u0131lan <code>index.nginx-debian.html<\/code> dosyas\u0131n\u0131 kald\u0131r\u0131r.<br \/>\n5.  \u00d6zel bir <code>index.html<\/code> dosyas\u0131n\u0131 <code>\/var\/www\/html\/<\/code> dizinine kopyalar.<\/p>\n<h2>Playbook&#8217;u \u00c7al\u0131\u015ft\u0131rma<\/h2>\n<p>Playbook&#8217;unuzu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>ansible-playbook<\/code> komutunu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">ansible-playbook -i hosts nginx_setup.yml<\/code><\/pre>\n<p>*   <code>-i hosts<\/code>: Envanter dosyan\u0131z\u0131n yolunu belirtir. E\u011fer envanter dosyan\u0131z\u0131n ad\u0131 <code>hosts<\/code> ise ve ayn\u0131 dizindeyseniz, bu k\u0131sm\u0131 atlayabilirsiniz, ancak belirtmek daha iyi bir al\u0131\u015fkanl\u0131kt\u0131r.<\/p>\n<p>Komutu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Ansible her g\u00f6rev i\u00e7in durum bilgisini g\u00f6sterecektir. \u00c7\u0131kt\u0131da farkl\u0131 renkler g\u00f6receksiniz:<br \/>\n*   <strong>Ye\u015fil (Ok):<\/strong> G\u00f6rev ba\u015far\u0131yla tamamland\u0131 ve hedef sistemde herhangi bir de\u011fi\u015fiklik yap\u0131lmad\u0131 (yani, istenen durum zaten mevcuttu &#8211; Idempotency).<br \/>\n*   <strong>Sar\u0131 (Changed):<\/strong> G\u00f6rev ba\u015far\u0131yla tamamland\u0131 ve hedef sistemde bir de\u011fi\u015fiklik yap\u0131ld\u0131.<br \/>\n*   <strong>K\u0131rm\u0131z\u0131 (Failed):<\/strong> G\u00f6rev ba\u015far\u0131s\u0131z oldu.<\/p>\n<p><strong>Faydal\u0131 <code>ansible-playbook<\/code> se\u00e7enekleri:<\/strong><br \/>\n*   <code>--check<\/code> veya <code>-C<\/code>: Playbook&#8217;u &#8220;kuru \u00e7al\u0131\u015fma&#8221; (dry run) modunda \u00e7al\u0131\u015ft\u0131r\u0131r. Ger\u00e7ek de\u011fi\u015fiklik yapmaz, sadece ne olaca\u011f\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <code>--diff<\/code>: G\u00f6revlerin yapt\u0131\u011f\u0131 de\u011fi\u015fiklikleri g\u00f6sterir (\u00f6zellikle <code>copy<\/code>, <code>template<\/code> mod\u00fclleri i\u00e7in faydal\u0131d\u0131r).<br \/>\n*   <code>--syntax-check<\/code>: Playbook&#8217;un YAML s\u00f6zdizimini kontrol eder.<br \/>\n*   <code>--verbose<\/code> veya <code>-v<\/code>, <code>-vv<\/code>, <code>-vvv<\/code>, <code>-vvvv<\/code>: \u00c7\u0131kt\u0131n\u0131n ayr\u0131nt\u0131 seviyesini art\u0131r\u0131r. Sorun giderme i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h2>Geli\u015fmi\u015f Playbook \u00d6zellikleri<\/h2>\n<p>Ansible, daha karma\u015f\u0131k ve dinamik otomasyon senaryolar\u0131 i\u00e7in bir\u00e7ok geli\u015fmi\u015f \u00f6zellik sunar.<\/p>\n<h3>De\u011fi\u015fkenler (Variables)<\/h3>\n<p>De\u011fi\u015fkenler, playbook&#8217;lar\u0131n\u0131z\u0131 daha esnek ve yeniden kullan\u0131labilir hale getirir.<br \/>\n*   <strong>Envanter De\u011fi\u015fkenleri:<\/strong> Envanter dosyas\u0131nda tan\u0131mlanan de\u011fi\u015fkenlerdir (yukar\u0131daki <code>ansible_user<\/code> gibi).<br \/>\n*   <strong>Playbook De\u011fi\u015fkenleri:<\/strong> Playbook i\u00e7inde <code>vars:<\/code> b\u00f6l\u00fcm\u00fcnde tan\u0131mlan\u0131r.<\/p>\n<pre><code class=\"language-yaml\">- name: Uygulama Kurulumu\n      hosts: appservers\n      vars:\n        app_port: 8080\n        app_version: 1.2.0\n      tasks:\n        - name: Uygulama dizini olu\u015ftur\n          file:\n            path: \"\/opt\/{{ app_name }}\"\n            state: directory<\/code><\/pre>\n<p>*   <strong>Komut Sat\u0131r\u0131 De\u011fi\u015fkenleri:<\/strong> <code>-e<\/code> veya <code>--extra-vars<\/code> ile komut sat\u0131r\u0131ndan ge\u00e7irebilirsiniz.<\/p>\n<pre><code class=\"language-bash\">ansible-playbook -i hosts my_app.yml -e \"app_port=9000 app_version=1.3.0\"<\/code><\/pre>\n<p>*   <strong>Fact Gathering (Ger\u00e7ek Toplama):<\/strong> Ansible, her oyunun ba\u015f\u0131nda y\u00f6netilen d\u00fc\u011f\u00fcmler hakk\u0131nda bir\u00e7ok bilgi (IP adresi, i\u015fletim sistemi, bellek vb.) toplar. Bu bilgilere <code>ansible_facts<\/code> de\u011fi\u015fkeni \u00fczerinden eri\u015filebilir. \u00d6rne\u011fin, <code>{{ ansible_os_family }}<\/code> gibi.<\/p>\n<h3>\u015eablonlar (Templates)<\/h3>\n<p>Jinja2 \u015fablon motorunu kullanarak dinamik yap\u0131land\u0131rma dosyalar\u0131 olu\u015fturman\u0131za olanak tan\u0131r.<br \/>\n\u00d6rne\u011fin, Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 dinamik hale getirelim. <code>templates\/nginx.conf.j2<\/code> ad\u0131nda bir dosya olu\u015fturun:<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen {{ nginx_port | default(80) }};\n    server_name {{ ansible_fqdn }};\n\n    location \/ {\n        root \/var\/www\/html;\n        index index.html index.htm;\n    }\n}<\/code><\/pre>\n<p>Playbook&#8217;ta bu \u015fablonu kullanmak i\u00e7in <code>template<\/code> mod\u00fcl\u00fcn\u00fc kullan\u0131n:<\/p>\n<pre><code class=\"language-yaml\">- name: Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 \u015fablondan kopyala\n      template:\n        src: templates\/nginx.conf.j2\n        dest: \/etc\/nginx\/sites-available\/default\n      notify: Nginx'i yeniden ba\u015flat # Yap\u0131land\u0131rma de\u011fi\u015firse Nginx'i yeniden ba\u015flat<\/code><\/pre>\n<p><code>nginx_port<\/code> de\u011fi\u015fkenini playbook&#8217;ta veya envanterde tan\u0131mlayabilirsiniz. E\u011fer tan\u0131mlanmazsa, <code>default(80)<\/code> filtre fonksiyonu sayesinde 80 portunu kullanacakt\u0131r.<\/p>\n<h3>Ko\u015fullar (Conditionals)<\/h3>\n<p><code>when:<\/code> anahtar kelimesini kullanarak g\u00f6revleri belirli ko\u015fullara ba\u011fl\u0131 olarak \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<pre><code class=\"language-yaml\">- name: Apache'yi sadece Debian tabanl\u0131 sistemlerde kur\n      apt:\n        name: apache2\n        state: present\n      when: ansible_os_family == \"Debian\"\n\n    - name: Yum \u00f6nbelle\u011fini g\u00fcncelle (RedHat tabanl\u0131 sistemler i\u00e7in)\n      yum:\n        update_cache: yes\n      when: ansible_os_family == \"RedHat\"<\/code><\/pre>\n<h3>D\u00f6ng\u00fcler (Loops)<\/h3>\n<p>Bir g\u00f6revi birden \u00e7ok \u00f6\u011fe \u00fczerinde tekrarlamak i\u00e7in d\u00f6ng\u00fcler kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-yaml\">- name: Birden fazla paketi kur\n      apt:\n        name: \"{{ item }}\"\n        state: present\n      loop:\n        - git\n        - curl\n        - wget\n        - htop<\/code><\/pre>\n<h3>\u0130\u015fleyiciler (Handlers)<\/h3>\n<p>\u0130\u015fleyiciler, yaln\u0131zca bir g\u00f6revde de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda tetiklenen \u00f6zel g\u00f6revlerdir. Genellikle bir hizmeti yeniden ba\u015flatmak veya bir yap\u0131land\u0131rmay\u0131 yeniden y\u00fcklemek i\u00e7in kullan\u0131l\u0131rlar.<\/p>\n<p>Playbook&#8217;unuza <code>handlers:<\/code> b\u00f6l\u00fcm\u00fcn\u00fc ekleyin:<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Nginx Kurulumu ve Yap\u0131land\u0131rmas\u0131\n  hosts: webservers\n  become: yes\n  \n  tasks:\n    # ... (\u00f6nceki g\u00f6revler) ...\n\n    - name: Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 \u015fablondan kopyala\n      template:\n        src: templates\/nginx.conf.j2\n        dest: \/etc\/nginx\/sites-available\/default\n      notify: Nginx'i yeniden ba\u015flat # Bu g\u00f6revde de\u011fi\u015fiklik olursa i\u015fleyiciyi tetikle\n\n  handlers:\n    - name: Nginx'i yeniden ba\u015flat\n      service:\n        name: nginx\n        state: restarted<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>template<\/code> mod\u00fcl\u00fc Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 g\u00fcncellerse, <code>notify<\/code> anahtar kelimesi <code>Nginx'i yeniden ba\u015flat<\/code> adl\u0131 i\u015fleyiciyi tetikler. Bu, Nginx&#8217;in yaln\u0131zca yap\u0131land\u0131rmas\u0131 de\u011fi\u015fti\u011finde yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Roller ile Yap\u0131land\u0131rma Y\u00f6netimi<\/h2>\n<p>Ansible roller, karma\u015f\u0131k otomasyon projelerini d\u00fczenlemek ve y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizmad\u0131r. Roller, g\u00f6revler, de\u011fi\u015fkenler, \u015fablonlar, i\u015fleyiciler ve di\u011fer dosyalar\u0131 mant\u0131ksal bir dizin yap\u0131s\u0131 alt\u0131nda gruplayarak playbook&#8217;lar\u0131n\u0131z\u0131 daha mod\u00fcler, yeniden kullan\u0131labilir ve okunabilir hale getirir.<\/p>\n<h3>Neden Roller Kullanmal\u0131?<\/h3>\n<p>*   <strong>Mod\u00fclerlik:<\/strong> Her rol, belirli bir i\u015flevi (\u00f6rne\u011fin, bir web sunucusu veya veritaban\u0131 kurulumu) yerine getiren ba\u011f\u0131ms\u0131z bir birimdir.<br \/>\n*   <strong>Yeniden Kullan\u0131labilirlik:<\/strong> Bir kez yaz\u0131lan roller, farkl\u0131 projelerde veya farkl\u0131 ortamlarda kolayca yeniden kullan\u0131labilir.<br \/>\n*   <strong>Okunabilirlik:<\/strong> Standart bir dizin yap\u0131s\u0131, projenin farkl\u0131 bile\u015fenlerini bulmay\u0131 ve anlamay\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Topluluk Katk\u0131s\u0131:<\/strong> Ansible Galaxy gibi platformlarda bir\u00e7ok haz\u0131r rol bulunur, bu da geli\u015ftirme s\u00fcresini k\u0131salt\u0131r.<\/p>\n<h3>Rol Yap\u0131s\u0131<\/h3>\n<p>Bir rol, a\u015fa\u011f\u0131daki gibi standart bir dizin yap\u0131s\u0131na sahiptir:<\/p>\n<pre><code class=\"language-\">roles\/\n\u251c\u2500\u2500 webserver\/\n\u2502   \u251c\u2500\u2500 tasks\/\n\u2502   \u2502   \u2514\u2500\u2500 main.yml        # Rol\u00fcn ana g\u00f6revleri\n\u2502   \u251c\u2500\u2500 handlers\/\n\u2502   \u2502   \u2514\u2500\u2500 main.yml        # Rol\u00fcn i\u015fleyicileri\n\u2502   \u251c\u2500\u2500 templates\/\n\u2502   \u2502   \u2514\u2500\u2500 nginx.conf.j2   # Rol\u00fcn \u015fablon dosyalar\u0131\n\u2502   \u251c\u2500\u2500 files\/\n\u2502   \u2502   \u2514\u2500\u2500 index.html      # Rol\u00fcn statik dosyalar\u0131\n\u2502   \u251c\u2500\u2500 vars\/\n\u2502   \u2502   \u2514\u2500\u2500 main.yml        # Rol\u00fcn varsay\u0131lan olmayan de\u011fi\u015fkenleri\n\u2502   \u251c\u2500\u2500 defaults\/\n\u2502   \u2502   \u2514\u2500\u2500 main.yml        # Rol\u00fcn varsay\u0131lan de\u011fi\u015fkenleri (en d\u00fc\u015f\u00fck \u00f6ncelik)\n\u2502   \u251c\u2500\u2500 meta\/\n\u2502   \u2502   \u2514\u2500\u2500 main.yml        # Rol hakk\u0131nda meta bilgiler (ba\u011f\u0131ml\u0131l\u0131klar vb.)\n\u2502   \u2514\u2500\u2500 README.md\n\u251c\u2500\u2500 database\/\n\u2502   \u251c\u2500\u2500 tasks\/\n\u2502   \u2514\u2500\u2500 ...\n\u2514\u2500\u2500 common\/\n    \u251c\u2500\u2500 tasks\/\n    \u2514\u2500\u2500 ...<\/code><\/pre>\n<h3>Rol Olu\u015fturma ve Kullanma<\/h3>\n<p>Ansible Galaxy komutunu kullanarak yeni bir rol olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ansible-galaxy init webserver<\/code><\/pre>\n<p>Bu komut, <code>webserver<\/code> ad\u0131nda, yukar\u0131da belirtilen dizin yap\u0131s\u0131na sahip bir klas\u00f6r olu\u015fturacakt\u0131r.<br \/>\n\u015eimdi, Nginx kurulum playbook&#8217;umuzu bir role d\u00f6n\u00fc\u015ft\u00fcrelim:<\/p>\n<p>1.  <code>webserver\/tasks\/main.yml<\/code> i\u00e7ine Nginx ile ilgili t\u00fcm g\u00f6revleri ta\u015f\u0131y\u0131n.<br \/>\n2.  <code>webserver\/handlers\/main.yml<\/code> i\u00e7ine Nginx&#8217;i yeniden ba\u015flatma i\u015fleyicisini ta\u015f\u0131y\u0131n.<br \/>\n3.  <code>webserver\/templates\/nginx.conf.j2<\/code> i\u00e7ine Nginx \u015fablon dosyas\u0131n\u0131 ta\u015f\u0131y\u0131n.<br \/>\n4.  <code>webserver\/files\/index.html<\/code> i\u00e7ine statik <code>index.html<\/code> dosyas\u0131n\u0131 ta\u015f\u0131y\u0131n (e\u011fer <code>copy<\/code> mod\u00fcl\u00fc ile i\u00e7erik yerine dosya kopyalayacaksan\u0131z).<br \/>\n5.  Varsay\u0131lan port gibi de\u011fi\u015fkenleri <code>webserver\/defaults\/main.yml<\/code> i\u00e7ine ekleyin:<\/p>\n<pre><code class=\"language-yaml\"># roles\/webserver\/defaults\/main.yml\n    nginx_port: 80<\/code><\/pre>\n<p>Rol\u00fc kullanan bir playbook (<code>site.yml<\/code>) \u015f\u00f6yle g\u00f6r\u00fcn\u00fcr:<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Web Sunucular\u0131n\u0131 Yap\u0131land\u0131r\n  hosts: webservers\n  become: yes\n  roles:\n    - webserver<\/code><\/pre>\n<p>Bu kadar! Ansible, <code>webserver<\/code> rol\u00fcndeki t\u00fcm g\u00f6revleri s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131racakt\u0131r. Roller, b\u00fcy\u00fck ve karma\u015f\u0131k altyap\u0131lar\u0131n y\u00f6netimini inan\u0131lmaz derecede kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2>Best Practices ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>Ansible ile otomasyon yaparken verimlili\u011fi ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi art\u0131rmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir.<\/p>\n<h3>S\u00fcr\u00fcm Kontrol\u00fc (Version Control)<\/h3>\n<p>T\u00fcm playbook&#8217;lar\u0131n\u0131z\u0131, envanter dosyalar\u0131n\u0131z\u0131 ve rollerinizi Git gibi bir s\u00fcr\u00fcm kontrol sistemiyle y\u00f6netin. Bu, de\u011fi\u015fiklikleri izlemenizi, geri alman\u0131z\u0131 ve ekip i\u00e7inde i\u015fbirli\u011fi yapman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Idempotency (Tekrarlanabilirlik)<\/h3>\n<p>Ansible&#8217;\u0131n en \u00f6nemli prensiplerinden biridir. Bir playbook&#8217;u birden \u00e7ok kez \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, sistemin durumunda yaln\u0131zca gerekli de\u011fi\u015fiklikler yap\u0131lmal\u0131 ve her zaman ayn\u0131 nihai duruma ula\u015f\u0131lmal\u0131d\u0131r. Ansible mod\u00fcllerinin \u00e7o\u011fu zaten idempotenttir, ancak \u00f6zel betikler yazarken bunu g\u00f6z \u00f6n\u00fcnde bulundurun.<\/p>\n<h3>Vault Kullan\u0131m\u0131<\/h3>\n<p>Hassas verileri (parolalar, API anahtarlar\u0131, SSH \u00f6zel anahtarlar\u0131) do\u011frudan playbook&#8217;lar\u0131n\u0131zda veya envanterinizde saklamay\u0131n. Ansible Vault kullanarak bu verileri \u015fifreleyin.<br \/>\n*   <code>ansible-vault create secret.yml<\/code><br \/>\n*   <code>ansible-vault edit secret.yml<\/code><br \/>\n*   <code>ansible-playbook --ask-vault-pass site.yml<\/code><\/p>\n<h3>Test Etme<\/h3>\n<p>Playbook&#8217;lar\u0131n\u0131z\u0131 her zaman \u00fcretim ortam\u0131na uygulamadan \u00f6nce test edin. Sanal makineler (Vagrant, Docker) veya bulut ortamlar\u0131nda test \u00f6rnekleri kullan\u0131n. <code>--check<\/code> ve <code>--diff<\/code> se\u00e7enekleri de ilk kontroller i\u00e7in faydal\u0131d\u0131r.<\/p>\n<h3>Mod\u00fcler Olma<\/h3>\n<p>B\u00fcy\u00fck ve karma\u015f\u0131k playbook&#8217;lar yerine, k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f g\u00f6revler ve roller olu\u015fturun. Bu, okunabilirli\u011fi art\u0131r\u0131r ve hatalar\u0131 bulmay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Yorumlama<\/h3>\n<p>Playbook&#8217;lar\u0131n\u0131z\u0131 ve rollerinizi a\u00e7\u0131klay\u0131c\u0131 yorumlarla zenginle\u015ftirin. Gelecekteki siz veya ekip arkada\u015flar\u0131n\u0131z i\u00e7in neyin ne i\u015fe yarad\u0131\u011f\u0131n\u0131 anlamay\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Hata Y\u00f6netimi<\/h3>\n<p>G\u00f6revlerin ba\u015far\u0131s\u0131z olmas\u0131 durumunda ne olaca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcn. <code>ignore_errors: yes<\/code> veya <code>failed_when:<\/code> gibi direktiflerle hata davran\u0131\u015f\u0131n\u0131 kontrol edebilirsiniz.<\/p>\n<h3>Dinamik Envanter<\/h3>\n<p>Bulut ortamlar\u0131nda (AWS EC2, Azure VM&#8217;ler, Google Cloud) dinamik envanter betikleri kullan\u0131n. Bu betikler, mevcut bulut kaynaklar\u0131n\u0131z\u0131 otomatik olarak alg\u0131lar ve Ansible envanteri olarak sunar, b\u00f6ylece manuel olarak envanter g\u00fcncelleme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<h2>Yayg\u0131n Senaryolar ve \u00d6rnekler<\/h2>\n<p>Ansible, sunucu kurulumunu ve yap\u0131land\u0131rmas\u0131n\u0131 otomatikle\u015ftirmek i\u00e7in \u00e7ok \u00e7e\u015fitli senaryolarda kullan\u0131labilir:<\/p>\n<p>*   <strong>Web Sunucusu Kurulumu:<\/strong> Nginx veya Apache gibi bir web sunucusunu kurmak, yap\u0131land\u0131rma dosyalar\u0131n\u0131 ayarlamak, sanal ana bilgisayarlar\u0131 olu\u015fturmak ve SSL sertifikalar\u0131n\u0131 da\u011f\u0131tmak.<br \/>\n*   <strong>Veritaban\u0131 Kurulumu:<\/strong> PostgreSQL, MySQL veya MongoDB gibi bir veritaban\u0131 sunucusunu kurmak, kullan\u0131c\u0131lar\u0131 ve veritabanlar\u0131n\u0131 olu\u015fturmak, g\u00fcvenlik ayarlar\u0131n\u0131 yapmak.<br \/>\n*   <strong>Uygulama Da\u011f\u0131t\u0131m\u0131:<\/strong> Git deposundan uygulama kodunu \u00e7ekmek, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemek, uygulama sunucusunu (Gunicorn, PM2) yap\u0131land\u0131rmak ve ba\u015flatmak.<br \/>\n*   <strong>G\u00fcvenlik Yap\u0131land\u0131rmalar\u0131:<\/strong> G\u00fcvenlik duvar\u0131n\u0131 (UFW, Firewalld) yap\u0131land\u0131rmak, SSH ayarlar\u0131n\u0131 g\u00fc\u00e7lendirmek, kullan\u0131c\u0131 hesaplar\u0131n\u0131 ve izinlerini y\u00f6netmek.<br \/>\n*   <strong>\u0130zleme ve Log Y\u00f6netimi:<\/strong> Logrotate&#8217;i yap\u0131land\u0131rmak, rsyslog veya Filebeat gibi log toplay\u0131c\u0131lar\u0131 kurmak.<br \/>\n*   <strong>Sanal Ortam Kurulumu:<\/strong> Python sanal ortamlar\u0131n\u0131 veya Docker konteynerlerini yap\u0131land\u0131rmak.<\/p>\n<h2>Sorun Giderme ve Debugging<\/h2>\n<p>Ansible ile \u00e7al\u0131\u015f\u0131rken sorunlarla kar\u015f\u0131la\u015fmak do\u011fald\u0131r. \u0130\u015fte yayg\u0131n sorunlar ve sorun giderme ipu\u00e7lar\u0131:<\/p>\n<p>*   <strong>Ba\u011flant\u0131 Sorunlar\u0131:<\/strong><br \/>\n    *   <code>ansible all -m ping<\/code> ile ba\u011flant\u0131y\u0131 test edin.<br \/>\n    *   SSH anahtar\u0131n\u0131z\u0131n do\u011fru y\u00fcklendi\u011finden ve izinlerinin do\u011fru oldu\u011fundan emin olun (<code>chmod 400 ~\/.ssh\/id_rsa<\/code>).<br \/>\n    *   <code>ansible_user<\/code> ve <code>ansible_ssh_private_key_file<\/code> de\u011fi\u015fkenlerinin envanter dosyas\u0131nda do\u011fru oldu\u011fundan emin olun.<br \/>\n    *   Hedef sunucuda SSH hizmetinin \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve g\u00fcvenlik duvar\u0131n\u0131n SSH portunu (varsay\u0131lan 22) engellemedi\u011finden emin olun.<br \/>\n*   <strong>Yetkilendirme Hatalar\u0131:<\/strong><br \/>\n    *   <code>become: yes<\/code> kulland\u0131\u011f\u0131n\u0131zdan ve hedef sunucudaki <code>ansible_user<\/code> kullan\u0131c\u0131s\u0131n\u0131n <code>sudo<\/code> yetkisine sahip oldu\u011fundan emin olun.<br \/>\n    *   <code>sudo<\/code> komutunun parola gerektirip gerektirmedi\u011fini kontrol edin. E\u011fer gerekiyorsa, <code>ansible-playbook --ask-become-pass<\/code> kullanman\u0131z gerekebilir veya <code>\/etc\/sudoers<\/code> dosyas\u0131nda NOPASSWD yap\u0131land\u0131rmas\u0131 yapman\u0131z gerekebilir (dikkatli olun).<br \/>\n*   <strong>YAML S\u00f6zdizimi Hatalar\u0131:<\/strong> YAML, bo\u015fluklara (indentation) kar\u015f\u0131 hassast\u0131r. <code>ansible-playbook --syntax-check<\/code> komutunu kullanarak s\u00f6zdizimi hatalar\u0131n\u0131 kontrol edin.<br \/>\n*   <strong>Ayr\u0131nt\u0131l\u0131 \u00c7\u0131kt\u0131 (Verbosity):<\/strong> <code>ansible-playbook -vvv<\/code> veya <code>-vvvv<\/code> ile daha ayr\u0131nt\u0131l\u0131 \u00e7\u0131kt\u0131 alarak sorunun kayna\u011f\u0131n\u0131 belirleyebilirsiniz. Bu, \u00f6zellikle g\u00f6revlerin neden ba\u015far\u0131s\u0131z oldu\u011funu anlamak i\u00e7in \u00e7ok faydal\u0131d\u0131r.<br \/>\n*   <strong>Mod\u00fcl Hatalar\u0131:<\/strong> Bir mod\u00fcl\u00fcn bekledi\u011finiz gibi \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcyorsan\u0131z, Ansible dok\u00fcmantasyonunu kontrol edin veya mod\u00fcl\u00fcn gerektirdi\u011fi ba\u011f\u0131ml\u0131l\u0131klar\u0131n hedef sunucuda kurulu oldu\u011fundan emin olun.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Ansible, sunucu kurulumu ve yap\u0131land\u0131rma otomasyonunu basitle\u015ftiren g\u00fc\u00e7l\u00fc ve esnek bir ara\u00e7t\u0131r. Bu makalede, Ansible&#8217;\u0131n temel kavramlar\u0131ndan ba\u015flayarak, ilk playbook&#8217;unuzu nas\u0131l yazaca\u011f\u0131n\u0131z\u0131, geli\u015fmi\u015f \u00f6zelliklerini nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 ve rollerle karma\u015f\u0131k projeleri nas\u0131l y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frendik. Otomasyonun tutarl\u0131l\u0131k, h\u0131z, g\u00fcvenilirlik ve maliyet etkinli\u011fi gibi sundu\u011fu faydalar, g\u00fcn\u00fcm\u00fcz\u00fcn dinamik BT ortamlar\u0131nda vazge\u00e7ilmezdir.<\/p>\n<p>Ansible&#8217;\u0131 benimseyerek, tekrarlayan manuel g\u00f6revlerden kurtulabilir, altyap\u0131n\u0131z\u0131 &#8220;kod olarak&#8221; y\u00f6netebilir ve ekiplerinizin daha stratejik projelere odaklanmas\u0131n\u0131 sa\u011flayabilirsiniz. Unutmay\u0131n ki otomasyon bir yolculuktur ve s\u00fcrekli \u00f6\u011frenme ve iyile\u015ftirme gerektirir. Ansible toplulu\u011fu ve zengin dok\u00fcmantasyonu, bu yolculukta size rehberlik edecek de\u011ferli kaynaklard\u0131r. \u015eimdi \u00f6\u011frendiklerinizi uygulayarak sunucu kurulum s\u00fcre\u00e7lerinizi otomatikle\u015ftirmeye ba\u015flayabilir ve modern altyap\u0131 y\u00f6netiminin avantajlar\u0131ndan tam olarak yararlanabilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ansible Playbook&#8217;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber\nSunucu kurulumu ve yap\u0131land\u0131rmas\u0131, bilgi teknolojileri altyap","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-38169","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>Ansible Playbook&#039;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber - 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\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ansible Playbook&#039;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Ansible Playbook&#039;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber Sunucu kurulumu ve yap\u0131land\u0131rmas\u0131, bilgi teknolojileri altyap\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-24T18:40:53+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=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ansible Playbook&#8217;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2026-01-24T18:40:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/\"},\"wordCount\":3221,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/\",\"name\":\"Ansible Playbook'lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-24T18:40:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ansible Playbook&#8217;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber\"}]},{\"@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":"Ansible Playbook'lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber - 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\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Ansible Playbook'lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber","og_description":"Ansible Playbook'lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber Sunucu kurulumu ve yap\u0131land\u0131rmas\u0131, bilgi teknolojileri altyap","og_url":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-24T18:40:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ansible Playbook&#8217;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber","datePublished":"2026-01-24T18:40:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/"},"wordCount":3221,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/","name":"Ansible Playbook'lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-24T18:40:53+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklari-ile-sunucu-kurulumunu-otomatiklestirme-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ansible Playbook&#8217;lar\u0131 ile Sunucu Kurulumunu Otomatikle\u015ftirme: Kapsaml\u0131 Bir Rehber"}]},{"@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\/38169","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=38169"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38169\/revisions"}],"predecessor-version":[{"id":38170,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38169\/revisions\/38170"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}