{"id":37088,"date":"2025-12-27T07:40:49","date_gmt":"2025-12-27T04:40:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37088"},"modified":"2025-12-27T07:40:49","modified_gmt":"2025-12-27T04:40:49","slug":"ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/","title":{"rendered":"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Otomasyon, modern IT altyap\u0131s\u0131n\u0131n temel ta\u015flar\u0131ndan biridir. Sistem y\u00f6neticileri ve DevOps m\u00fchendisleri, sunucular\u0131 yap\u0131land\u0131rmak, uygulamalar\u0131 da\u011f\u0131tmak ve karma\u015f\u0131k i\u015f ak\u0131\u015flar\u0131n\u0131 y\u00f6netmek i\u00e7in otomasyon ara\u00e7lar\u0131na ihtiya\u00e7 duyarlar. Bu ara\u00e7lar aras\u0131nda Ansible, basitli\u011fi, arac\u0131s\u0131z yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc \u00f6zellikleri sayesinde \u00f6ne \u00e7\u0131kmaktad\u0131r. Bu makalede, Ubuntu 18.04 i\u015fletim sistemi \u00fczerinde Ansible&#8217;\u0131n nas\u0131l kurulaca\u011f\u0131n\u0131 ve temel yap\u0131land\u0131rmalar\u0131n\u0131n nas\u0131l yap\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.<\/p>\n<h4>Ansible Nedir?<\/h4>\n<p>Ansible, Red Hat taraf\u0131ndan geli\u015ftirilen a\u00e7\u0131k kaynakl\u0131 bir otomasyon motorudur. Yap\u0131land\u0131rma y\u00f6netimi, uygulama da\u011f\u0131t\u0131m\u0131, g\u00f6rev otomasyonu ve s\u00fcrekli da\u011f\u0131t\u0131m (CD) gibi bir\u00e7ok alanda kullan\u0131labilir. Ansible&#8217;\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biri, hedef makinelerde herhangi bir arac\u0131 (agent) yaz\u0131l\u0131m\u0131na ihtiya\u00e7 duymamas\u0131d\u0131r. Bunun yerine, SSH protokol\u00fc \u00fczerinden hedef makinelere ba\u011flan\u0131r ve Python betiklerini \u00e7al\u0131\u015ft\u0131r\u0131r. Bu &#8220;arac\u0131s\u0131z&#8221; mimari, kurulum ve y\u00f6netim karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<h4>Neden Ansible Kullanmal\u0131y\u0131z?<\/h4>\n<p>Ansible&#8217;\u0131n tercih edilmesinin bir\u00e7ok nedeni vard\u0131r:<br \/>\n*   <strong>Arac\u0131s\u0131z Yap\u0131:<\/strong> Hedef sunucularda arac\u0131 kurma ve y\u00f6netme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. Sadece SSH ve Python gereklidir.<br \/>\n*   <strong>Basitlik ve Okunabilirlik:<\/strong> Playbook&#8217;lar (Ansible&#8217;\u0131n otomasyon betikleri) YAML format\u0131nda yaz\u0131l\u0131r. Bu, insan taraf\u0131ndan kolayca okunabilir ve anla\u015f\u0131labilir olmalar\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>G\u00fc\u00e7l\u00fc ve Esnek:<\/strong> Binlerce mod\u00fcl\u00fc sayesinde neredeyse her t\u00fcrl\u00fc g\u00f6revi otomatikle\u015ftirebilir. \u00d6zel mod\u00fcller yazma yetene\u011fi de sunar.<br \/>\n*   <strong>Idempotent (Tekrar \u00c7al\u0131\u015ft\u0131r\u0131labilir):<\/strong> Bir g\u00f6revi birden fazla kez \u00e7al\u0131\u015ft\u0131rmak, sistem \u00fczerinde yaln\u0131zca ilk \u00e7al\u0131\u015ft\u0131rman\u0131n etkisini yarat\u0131r. Yani, bir kaynak zaten istenen durumdaysa, Ansible herhangi bir de\u011fi\u015fiklik yapmaz.<br \/>\n*   <strong>B\u00fcy\u00fck Topluluk Deste\u011fi:<\/strong> Geni\u015f bir kullan\u0131c\u0131 ve geli\u015ftirici toplulu\u011funa sahiptir, bu da sorun giderme ve kaynak bulma konusunda yard\u0131mc\u0131 olur.<br \/>\n*   <strong>\u00dccretsiz ve A\u00e7\u0131k Kaynak:<\/strong> Lisans maliyeti yoktur ve kaynak kodu herkes taraf\u0131ndan eri\u015filebilir ve incelenebilir.<\/p>\n<p>Bu rehberde, bir kontrol makinesi (Ansible&#8217;\u0131n kurulu oldu\u011fu ve komutlar\u0131n \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 makine) olarak Ubuntu 18.04 kullanaca\u011f\u0131z ve ayn\u0131 zamanda hedef makine olarak da Ubuntu 18.04&#8217;\u00fc ele alaca\u011f\u0131z. Ancak Ansible, herhangi bir Linux\/Unix makineden Windows, a\u011f cihazlar\u0131 ve di\u011fer bir\u00e7ok sisteme da\u011f\u0131t\u0131m yapabilir.<\/p>\n<h3>\u00d6nko\u015fullar<\/h3>\n<p>Ansible kurulumuna ba\u015flamadan \u00f6nce, kontrol ve hedef makinelerinizde baz\u0131 \u00f6nko\u015fullar\u0131n yerine getirildi\u011finden emin olmal\u0131s\u0131n\u0131z.<\/p>\n<h4>Sistem G\u00fcncellemesi<\/h4>\n<p>Her iki makine i\u00e7in de g\u00fcncel paketlere sahip olmak iyi bir uygulamad\u0131r. A\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak sistemlerinizi g\u00fcncelleyin:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade -y<\/code><\/pre>\n<h4>Python ve PIP<\/h4>\n<p>Ansible, Python ile yaz\u0131lm\u0131\u015ft\u0131r ve hedef makinelerde Python&#8217;\u0131n kurulu olmas\u0131n\u0131 gerektirir. Ubuntu 18.04 varsay\u0131lan olarak Python 3 ile gelir, ancak baz\u0131 durumlarda Python 2 de bulunabilir. Ansible&#8217;\u0131n modern s\u00fcr\u00fcmleri Python 3&#8217;\u00fc tercih eder. PIP (Python Paket Y\u00f6neticisi), Ansible&#8217;\u0131 kurmak i\u00e7in kullan\u0131labilecek alternatif bir y\u00f6ntemdir ve baz\u0131 Ansible ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7in gerekli olabilir.<\/p>\n<p>Kontrol makinesi ve hedef makinelerde Python 3 ve pip&#8217;in kurulu oldu\u011fundan emin olun:<\/p>\n<pre><code class=\"language-bash\">sudo apt install python3 python3-pip -y<\/code><\/pre>\n<h4>SSH Anahtar \u00c7ifti Olu\u015fturma (Kontrol Makinesinde)<\/h4>\n<p>Ansible, hedef makinelere parolas\u0131z SSH ba\u011flant\u0131s\u0131 kurmak i\u00e7in SSH anahtar \u00e7iftlerini kullan\u0131r. Bu, otomasyonun sorunsuz \u00e7al\u0131\u015fmas\u0131 i\u00e7in kritik \u00f6neme sahiptir. Kontrol makinenizde bir SSH anahtar \u00e7iftiniz yoksa, a\u015fa\u011f\u0131daki komutla olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ssh-keygen<\/code><\/pre>\n<p>Bu komut size anahtar\u0131n kaydedilece\u011fi yer ve bir parola (passphrase) isteyecektir. Genellikle varsay\u0131lan konum (<code>~\/.ssh\/id_rsa<\/code>) ve parola olmadan devam etmek, otomasyon s\u00fcre\u00e7lerini kolayla\u015ft\u0131r\u0131r. Ancak g\u00fcvenlik a\u00e7\u0131s\u0131ndan bir parola kullanmak daha iyidir; bu durumda, Ansible&#8217;\u0131 \u00e7al\u0131\u015ft\u0131r\u0131rken bu parolay\u0131 sa\u011flaman\u0131z gerekecektir.<\/p>\n<h4>Hedef Makine \u0130\u00e7in SSH Eri\u015fimi<\/h4>\n<p>Kontrol makinesinden hedef makinelere parolas\u0131z SSH eri\u015fimi sa\u011flamak i\u00e7in, kontrol makinesinde olu\u015fturdu\u011funuz genel anahtar\u0131 (public key) hedef makinelere kopyalaman\u0131z gerekir.<\/p>\n<pre><code class=\"language-bash\">ssh-copy-id kullan\u0131c\u0131ad\u0131@hedef_makine_ip_adresi<\/code><\/pre>\n<p>\u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-bash\">ssh-copy-id ansibleuser@192.168.1.100<\/code><\/pre>\n<p>Bu komut, hedef makinenin parolas\u0131n\u0131 soracak ve genel anahtar\u0131n\u0131z\u0131 hedef makinedeki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na ekleyecektir. \u0130\u015flem tamamland\u0131ktan sonra, kontrol makinesinden hedef makineye parola sormadan SSH ba\u011flant\u0131s\u0131 kurabilmeniz gerekir:<\/p>\n<pre><code class=\"language-bash\">ssh ansibleuser@192.168.1.100<\/code><\/pre>\n<p>E\u011fer parola sormadan ba\u011flanabiliyorsan\u0131z, SSH eri\u015fimi do\u011fru \u015fekilde yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<h3>Ansible Kurulumu<\/h3>\n<p>Ansible&#8217;\u0131 Ubuntu 18.04&#8217;e kurman\u0131n iki ana yolu vard\u0131r: APT depolar\u0131 \u00fczerinden veya Python&#8217;\u0131n paket y\u00f6neticisi PIP ile. APT depolar\u0131 genellikle daha kararl\u0131 ve kolay y\u00f6netilebilir bir s\u00fcr\u00fcm sunarken, PIP daha g\u00fcncel s\u00fcr\u00fcmlere eri\u015fim sa\u011flayabilir.<\/p>\n<h4>APT Depolar\u0131 \u00dczerinden Kurulum<\/h4>\n<p>Ubuntu&#8217;nun varsay\u0131lan depolar\u0131nda Ansible mevcuttur. Kurulum i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyin:<\/p>\n<p>1.  <strong>Gerekli Depoyu Ekleme:<\/strong> Ansible, Ubuntu&#8217;nun &#8220;universe&#8221; deposunda bulunur. Bu depo genellikle varsay\u0131lan olarak etkindir, ancak emin olmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo apt install software-properties-common -y\n    sudo apt-add-repository --yes --update ppa:ansible\/ansible<\/code><\/pre>\n<p>    Bu komut, Ansible&#8217;\u0131n en g\u00fcncel kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc sa\u011flayan PPA (Personal Package Archive) deposunu ekler ve paket listelerinizi g\u00fcnceller.<\/p>\n<p>2.  <strong>Ansible&#8217;\u0131 Kurma:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt install ansible -y<\/code><\/pre>\n<h4>PIP ile Kurulum (Alternatif)<\/h4>\n<p>E\u011fer daha yeni bir Ansible s\u00fcr\u00fcm\u00fcne ihtiyac\u0131n\u0131z varsa veya sistem genelinde de\u011fil de sanal bir ortamda kurmak istiyorsan\u0131z, PIP&#8217;i kullanabilirsiniz.<\/p>\n<pre><code class=\"language-bash\">pip3 install ansible<\/code><\/pre>\n<p>E\u011fer belirli bir s\u00fcr\u00fcm\u00fc kurmak isterseniz:<\/p>\n<pre><code class=\"language-bash\">pip3 install ansible==2.9.27 # \u00d6rnek bir s\u00fcr\u00fcm<\/code><\/pre>\n<p>PIP ile kurulum yaparken, Ansible&#8217;\u0131n y\u00fcr\u00fct\u00fclebilir dosyas\u0131n\u0131n sistem PATH&#8217;inizde oldu\u011fundan emin olman\u0131z gerekebilir. Genellikle, <code>~\/.local\/bin<\/code> dizinine kurulur.<\/p>\n<h4>Kurulumu Do\u011frulama<\/h4>\n<p>Ansible&#8217;\u0131n do\u011fru bir \u015fekilde kuruldu\u011funu ve s\u00fcr\u00fcm\u00fcn\u00fc kontrol etmek i\u00e7in a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">ansible --version<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131, Ansible s\u00fcr\u00fcm\u00fcn\u00fc, yap\u0131land\u0131rma dosyas\u0131n\u0131n konumunu, Python s\u00fcr\u00fcm\u00fcn\u00fc ve di\u011fer detaylar\u0131 g\u00f6stermelidir. \u00d6rnek \u00e7\u0131kt\u0131:<\/p>\n<pre><code class=\"language-\">ansible 2.9.27\n  config file = \/etc\/ansible\/ansible.cfg\n  configured module search path = ['\/home\/ansibleuser\/.ansible\/plugins\/modules', '\/usr\/share\/ansible\/plugins\/modules']\n  ansible python module location = \/usr\/lib\/python3\/dist-packages\/ansible\n  executable location = \/usr\/bin\/ansible\n  python version = 3.8.10 (default, Jun  2 2021, 10:49:15) [GCC 9.4.0]<\/code><\/pre>\n<p>Bu \u00e7\u0131kt\u0131, Ansible&#8217;\u0131n ba\u015far\u0131yla kuruldu\u011funu ve kullan\u0131ma haz\u0131r oldu\u011funu g\u00f6sterir.<\/p>\n<h3>Ansible Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Ansible&#8217;\u0131n temel i\u015flevselli\u011fini kullanmak i\u00e7in iki ana yap\u0131land\u0131rma bile\u015feni vard\u0131r: genel yap\u0131land\u0131rma dosyas\u0131 (<code>ansible.cfg<\/code>) ve envanter dosyas\u0131 (<code>hosts<\/code>).<\/p>\n<h4>Ansible Yap\u0131land\u0131rma Dosyas\u0131 (<code>ansible.cfg<\/code>)<\/h4>\n<p><code>ansible.cfg<\/code> dosyas\u0131, Ansible&#8217;\u0131n \u00e7al\u0131\u015fma \u015feklini kontrol eden global ayarlar\u0131 i\u00e7erir. Bu dosya genellikle <code>\/etc\/ansible\/ansible.cfg<\/code> konumunda bulunur. Ancak, Ansible farkl\u0131 konumlarda da yap\u0131land\u0131rma dosyalar\u0131n\u0131 arar (\u00f6ncelik s\u0131ras\u0131na g\u00f6re):<br \/>\n1.  <code>ANSIBLE_CONFIG<\/code> ortam de\u011fi\u015fkeni ile belirtilen dosya.<br \/>\n2.  Ge\u00e7erli \u00e7al\u0131\u015fma dizinindeki <code>ansible.cfg<\/code>.<br \/>\n3.  Kullan\u0131c\u0131n\u0131n ana dizinindeki <code>~\/.ansible.cfg<\/code>.<br \/>\n4.  <code>\/etc\/ansible\/ansible.cfg<\/code>.<\/p>\n<p>Genellikle, <code>\/etc\/ansible\/ansible.cfg<\/code> dosyas\u0131n\u0131 d\u00fczenlemek veya projenizin k\u00f6k dizininde kendi <code>ansible.cfg<\/code> dosyan\u0131z\u0131 olu\u015fturmak iyi bir uygulamad\u0131r.<\/p>\n<p>Varsay\u0131lan <code>ansible.cfg<\/code> dosyas\u0131n\u0131 d\u00fczenlemek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/ansible\/ansible.cfg<\/code><\/pre>\n<p>Bu dosyada de\u011fi\u015ftirebilece\u011finiz baz\u0131 \u00f6nemli ayarlar \u015funlard\u0131r:<br \/>\n*   <strong><code>inventory<\/code><\/strong>: Varsay\u0131lan envanter dosyas\u0131n\u0131n yolunu belirtir. Genellikle <code>\/etc\/ansible\/hosts<\/code> olarak ayarlan\u0131r.<br \/>\n*   <strong><code>remote_user<\/code><\/strong>: Hedef makinelere ba\u011flanmak i\u00e7in kullan\u0131lacak varsay\u0131lan kullan\u0131c\u0131 ad\u0131.<br \/>\n*   <strong><code>ask_pass<\/code><\/strong>: Parola sorulup sorulmayaca\u011f\u0131n\u0131 belirler. SSH anahtar \u00e7ifti kullan\u0131yorsan\u0131z <code>False<\/code> olarak ayarlanabilir.<br \/>\n*   <strong><code>private_key_file<\/code><\/strong>: SSH anahtar dosyan\u0131z\u0131n yolu.<br \/>\n*   <strong><code>host_key_checking<\/code><\/strong>: Hedef makine anahtar\u0131n\u0131n kontrol edilip edilmeyece\u011fini belirler. \u0130lk kurulumda <code>False<\/code> olarak ayarlanabilir, ancak g\u00fcvenlik i\u00e7in <code>True<\/code> olmas\u0131 \u00f6nerilir.<br \/>\n*   <strong><code>forks<\/code><\/strong>: Paralel olarak \u00e7al\u0131\u015ft\u0131r\u0131lacak i\u015flem say\u0131s\u0131.<\/p>\n<p>\u00d6rnek bir <code>ansible.cfg<\/code> b\u00f6l\u00fcm\u00fc:<\/p>\n<pre><code class=\"language-ini\">[defaults]\ninventory      = \/etc\/ansible\/hosts\nremote_user    = ansibleuser\nask_pass       = False\n#private_key_file = ~\/.ssh\/id_rsa # E\u011fer varsay\u0131lan konumdaysa gerek yok\nhost_key_checking = False # \u0130lk kurulumda kolayl\u0131k i\u00e7in, sonra True yap\u0131n<\/code><\/pre>\n<p>De\u011fi\u015fiklikleri kaydettikten sonra dosyay\u0131 kapat\u0131n.<\/p>\n<h4>Envanter Dosyas\u0131 (<code>hosts<\/code>) Olu\u015fturma<\/h4>\n<p>Envanter dosyas\u0131, Ansible&#8217;\u0131n y\u00f6netece\u011fi t\u00fcm hedef makineleri ve bu makinelerle ilgili bilgileri (IP adresleri, kullan\u0131c\u0131 adlar\u0131, gruplar vb.) i\u00e7erir. Varsay\u0131lan olarak bu dosya <code>\/etc\/ansible\/hosts<\/code> konumunda bulunur.<\/p>\n<p>Dosyay\u0131 d\u00fczenlemek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/ansible\/hosts<\/code><\/pre>\n<p>Envanter dosyas\u0131, INI format\u0131nda veya YAML format\u0131nda olabilir. INI format\u0131 daha yayg\u0131n ve basittir.<\/p>\n<p><strong>INI Format\u0131nda \u00d6rnek Envanter Dosyas\u0131:<\/strong><\/p>\n<pre><code class=\"language-ini\">[webservers]\nweb1.example.com\nweb2.example.com\n192.168.1.101\n\n[dbservers]\ndb1.example.com\n192.168.1.102\n\n[all:vars]\nansible_python_interpreter=\/usr\/bin\/python3\nansible_user=ansibleuser<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n*   <code>[webservers]<\/code> ve <code>[dbservers]<\/code>, makineleri grupland\u0131rmak i\u00e7in kullan\u0131l\u0131r. Bu gruplara daha sonra playbook&#8217;larda veya komutlarda ba\u015fvurulabilir.<br \/>\n*   Makineler, DNS ad\u0131 veya IP adresi ile belirtilebilir.<br \/>\n*   <code>[all:vars]<\/code> b\u00f6l\u00fcm\u00fc, t\u00fcm envanterdeki makineler i\u00e7in ge\u00e7erli olacak genel de\u011fi\u015fkenleri tan\u0131mlar.<br \/>\n    *   <code>ansible_python_interpreter<\/code>: Hedef makinedeki Python yorumlay\u0131c\u0131s\u0131n\u0131n yolunu belirtir. Ubuntu 18.04&#8217;te genellikle <code>\/usr\/bin\/python3<\/code> veya <code>\/usr\/bin\/python<\/code> olabilir. Python 3 kullan\u0131l\u0131yorsa, bu de\u011fi\u015fkeni ayarlamak \u00f6nemlidir.<br \/>\n    *   <code>ansible_user<\/code>: Hedef makinelere ba\u011flanmak i\u00e7in kullan\u0131lacak kullan\u0131c\u0131 ad\u0131d\u0131r. Bu, <code>ansible.cfg<\/code> dosyas\u0131ndaki <code>remote_user<\/code> ayar\u0131n\u0131 ge\u00e7ersiz k\u0131lar veya tamamlar.<\/p>\n<p>De\u011fi\u015fiklikleri kaydedip dosyay\u0131 kapat\u0131n.<\/p>\n<h4>Parolas\u0131z SSH Eri\u015fimi Sa\u011flama (Hedef Makinelere)<\/h4>\n<p>Daha \u00f6nce bahsetti\u011fimiz gibi, <code>ssh-copy-id<\/code> komutu ile kontrol makinenizin genel SSH anahtar\u0131n\u0131 t\u00fcm hedef makinelerinize kopyalaman\u0131z gerekmektedir. Bu, Ansible&#8217;\u0131n parolas\u0131z olarak hedef makinelere ba\u011flanmas\u0131n\u0131 ve komutlar\u0131 y\u00fcr\u00fctmesini sa\u011flar.<\/p>\n<p>E\u011fer birden fazla hedef makineniz varsa, her biri i\u00e7in bu ad\u0131m\u0131 tekrarlaman\u0131z gerekecektir:<\/p>\n<pre><code class=\"language-bash\">ssh-copy-id ansibleuser@192.168.1.101\nssh-copy-id ansibleuser@192.168.1.102<\/code><\/pre>\n<p>Bu ad\u0131m\u0131 tamamlamak, Ansible ile sorunsuz bir otomasyon deneyimi i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>\u0130lk Ansible Komutlar\u0131 ve Test<\/h3>\n<p>Kurulum ve temel yap\u0131land\u0131rma tamamland\u0131ktan sonra, Ansible&#8217;\u0131n hedef makinelerle ileti\u015fim kurabildi\u011fini test edebiliriz.<\/p>\n<h4>Ping Mod\u00fcl\u00fc ile Ba\u011flant\u0131 Testi<\/h4>\n<p>Ansible&#8217;\u0131n en basit mod\u00fcllerinden biri olan <code>ping<\/code> mod\u00fcl\u00fc, hedef makinelerle SSH ba\u011flant\u0131s\u0131n\u0131n ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/p>\n<pre><code class=\"language-bash\">ansible all -m ping<\/code><\/pre>\n<p>*   <code>ansible<\/code>: Ansible komut sat\u0131r\u0131 arac\u0131.<br \/>\n*   <code>all<\/code>: Envanter dosyas\u0131ndaki t\u00fcm makineleri hedefler. Belirli bir grup i\u00e7in <code>webservers<\/code> veya tek bir makine i\u00e7in <code>192.168.1.101<\/code> gibi kullanabilirsiniz.<br \/>\n*   <code>-m ping<\/code>: Kullan\u0131lacak mod\u00fcl\u00fc belirtir.<\/p>\n<p>Ba\u015far\u0131l\u0131 bir ba\u011flant\u0131 durumunda, \u00e7\u0131kt\u0131 a\u015fa\u011f\u0131daki gibi olacakt\u0131r:<\/p>\n<pre><code class=\"language-\">192.168.1.101 | SUCCESS => {\n    \"ansible_facts\": {\n        \"discovered_interpreter_python\": \"\/usr\/bin\/python3\"\n    },\n    \"changed\": false,\n    \"ping\": \"pong\"\n}\n192.168.1.102 | SUCCESS => {\n    \"ansible_facts\": {\n        \"discovered_interpreter_python\": \"\/usr\/bin\/python3\"\n    },\n    \"changed\": false,\n    \"ping\": \"pong\"\n}<\/code><\/pre>\n<p>E\u011fer <code>UNREACHABLE<\/code> veya <code>FAILED<\/code> gibi bir mesaj al\u0131rsan\u0131z, SSH ba\u011flant\u0131s\u0131, kullan\u0131c\u0131 ad\u0131 veya Python yorumlay\u0131c\u0131 yolu gibi yap\u0131land\u0131rmalar\u0131n\u0131z\u0131 kontrol etmeniz gerekir.<\/p>\n<h4>Komut Mod\u00fcl\u00fc ile Uzak Komut \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p><code>command<\/code> veya <code>shell<\/code> mod\u00fclleri, hedef makinelerde rastgele komutlar \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r. <code>command<\/code> mod\u00fcl\u00fc daha g\u00fcvenlidir ve <code>shell<\/code> mod\u00fcl\u00fc kabuk \u00f6zelliklerini (pipe, redirect vb.) kullanman\u0131za izin verir.<\/p>\n<p>Hedef makinenin \u00e7al\u0131\u015fma zaman\u0131n\u0131 kontrol edelim:<\/p>\n<pre><code class=\"language-bash\">ansible webservers -a \"uptime\"<\/code><\/pre>\n<p>*   <code>-a \"uptime\"<\/code>: \u00c7al\u0131\u015ft\u0131r\u0131lacak arg\u00fcman\u0131 (komutu) belirtir.<\/p>\n<p>\u00c7\u0131kt\u0131:<\/p>\n<pre><code class=\"language-\">192.168.1.101 | SUCCESS | rc=0 >>\n 15:30:01 up 1 day, 2:30,  1 user,  load average: 0.00, 0.01, 0.05<\/code><\/pre>\n<h4>Faktlar\u0131 Toplama<\/h4>\n<p>Ansible, hedef makineler hakk\u0131nda sistem bilgileri (i\u015fletim sistemi, IP adresleri, bellek, CPU vb.) toplayabilir. Bu bilgilere &#8220;faktlar&#8221; denir ve playbook&#8217;larda ko\u015fullu i\u015flemler veya dinamik yap\u0131land\u0131rmalar i\u00e7in kullan\u0131labilir.<\/p>\n<pre><code class=\"language-bash\">ansible webservers -m setup<\/code><\/pre>\n<p>Bu komut, <code>webservers<\/code> grubundaki t\u00fcm makinelerden \u00e7ok say\u0131da sistem fakt\u0131n\u0131 JSON format\u0131nda d\u00f6nd\u00fcrecektir. Bu \u00e7\u0131kt\u0131 olduk\u00e7a uzun olabilir. Belirli bir fakt\u0131 aramak i\u00e7in <code>grep<\/code> ile filtreleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ansible webservers -m setup | grep ansible_distribution<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131:<\/p>\n<pre><code class=\"language-\">\"ansible_distribution\": \"Ubuntu\",\n        \"ansible_distribution_file_parsed\": true,\n        \"ansible_distribution_file_variety\": \"Debian\",\n        \"ansible_distribution_major_version\": \"18\",\n        \"ansible_distribution_release\": \"bionic\",\n        \"ansible_distribution_version\": \"18.04\",<\/code><\/pre>\n<h3>\u00d6rnek Playbook Olu\u015fturma ve \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>Ansible&#8217;\u0131n ger\u00e7ek g\u00fcc\u00fc playbook&#8217;larda yatar. Playbook&#8217;lar, otomasyon g\u00f6revlerini tan\u0131mlayan YAML dosyalar\u0131d\u0131r. Bir playbook, bir veya daha fazla &#8220;play&#8221; i\u00e7erir ve her play, belirli bir grup makine \u00fczerinde bir dizi &#8220;task&#8221; (g\u00f6rev) \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<p>\u015eimdi basit bir Nginx web sunucusu kurulumu playbook&#8217;u olu\u015ftural\u0131m.<\/p>\n<h4>Basit Bir Playbook Olu\u015fturma (\u00d6rn: Nginx Kurulumu)<\/h4>\n<p>Kontrol makinenizde bir dizin olu\u015fturun ve i\u00e7ine <code>nginx_install.yml<\/code> ad\u0131nda bir dosya olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">mkdir ~\/ansible_projects\ncd ~\/ansible_projects\nnano nginx_install.yml<\/code><\/pre>\n<p><code>nginx_install.yml<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fi \u015f\u00f6yle olsun:<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Nginx Web Sunucusu Kurulumu ve Yap\u0131land\u0131rmas\u0131\n  hosts: webservers\n  become: yes # Bu play'deki g\u00f6revleri root ayr\u0131cal\u0131klar\u0131yla \u00e7al\u0131\u015ft\u0131r\n  tasks:\n    - name: Nginx paketini g\u00fcncelle ve kur\n      apt:\n        name: nginx\n        state: latest\n        update_cache: yes\n\n    - name: Nginx servisinin \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve ba\u015flang\u0131\u00e7ta etkin oldu\u011fundan emin ol\n      service:\n        name: nginx\n        state: started\n        enabled: yes\n\n    - name: Varsay\u0131lan Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 yedekle\n      copy:\n        src: \/etc\/nginx\/sites-available\/default\n        dest: \/etc\/nginx\/sites-available\/default.bak\n        remote_src: yes\n\n    - name: Yeni bir varsay\u0131lan Nginx yap\u0131land\u0131rma dosyas\u0131 olu\u015ftur\n      copy:\n        content: |\n          server {\n              listen 80 default_server;\n              listen [::]:80 default_server;\n              root \/var\/www\/html;\n              index index.html index.htm index.nginx-debian.html;\n              server_name _;\n              location \/ {\n                  try_files $uri $uri\/ =404;\n              }\n          }\n        dest: \/etc\/nginx\/sites-available\/default\n        owner: root\n        group: root\n        mode: '0644'\n      notify: Reload Nginx\n\n    - name: Nginx yap\u0131land\u0131rmas\u0131n\u0131 kontrol et\n      command: nginx -t\n      register: nginx_config_test\n      failed_when: nginx_config_test.rc != 0\n      changed_when: false\n      notify: Reload Nginx\n\n  handlers:\n    - name: Reload Nginx\n      service:\n        name: nginx\n        state: reloaded<\/code><\/pre>\n<p>Bu playbook, <code>webservers<\/code> grubundaki t\u00fcm makinelere Nginx&#8217;i kuracak, ba\u015flatacak, varsay\u0131lan yap\u0131land\u0131rma dosyas\u0131n\u0131 yedekleyecek, yeni bir yap\u0131land\u0131rma olu\u015fturacak ve Nginx servisini yeniden y\u00fckleyecektir.<\/p>\n<h4>Playbook&#8217;u \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>Playbook&#8217;u \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>ansible-playbook<\/code> komutunu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">ansible-playbook nginx_install.yml<\/code><\/pre>\n<p>Komutu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Ansible ad\u0131mlar\u0131 s\u0131ras\u0131yla y\u00fcr\u00fctecek ve her g\u00f6revin durumunu g\u00f6sterecektir (changed, ok, failed).<\/p>\n<p>\u00c7\u0131kt\u0131da <code>changed<\/code> ifadesini g\u00f6rd\u00fc\u011f\u00fcn\u00fczde, Ansible&#8217;\u0131n hedef makinede bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131 anlars\u0131n\u0131z. <code>ok<\/code> ise, g\u00f6rev ba\u015far\u0131yla tamamlanm\u0131\u015f ancak herhangi bir de\u011fi\u015fiklik yap\u0131lmam\u0131\u015f demektir (\u00e7\u00fcnk\u00fc istenen durum zaten mevcuttu).<\/p>\n<p>Playbook ba\u015far\u0131yla tamamland\u0131ktan sonra, bir web taray\u0131c\u0131s\u0131ndan hedef makinenin IP adresine giderek Nginx&#8217;in \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz. Varsay\u0131lan Nginx kar\u015f\u0131lama sayfas\u0131 yerine, e\u011fer <code>index.html<\/code> olu\u015fturmad\u0131ysan\u0131z, 404 hatas\u0131 veya bo\u015f bir sayfa g\u00f6rebilirsiniz.<\/p>\n<h4>Playbook \u0130\u00e7eri\u011fini Anlama<\/h4>\n<p>*   <strong><code>---<\/code><\/strong>: YAML dosyas\u0131n\u0131n ba\u015flang\u0131c\u0131n\u0131 belirtir.<br \/>\n*   <strong><code>- name: ...<\/code><\/strong>: Play veya g\u00f6revin a\u00e7\u0131klay\u0131c\u0131 ad\u0131d\u0131r.<br \/>\n*   <strong><code>hosts: webservers<\/code><\/strong>: Bu play&#8217;in hangi hedef makinelerde \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir. Envanter dosyas\u0131ndaki bir grup ad\u0131d\u0131r.<br \/>\n*   <strong><code>become: yes<\/code><\/strong>: Bu play&#8217;deki t\u00fcm g\u00f6revlerin <code>sudo<\/code> ayr\u0131cal\u0131klar\u0131yla (root olarak) \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong><code>tasks:<\/code><\/strong>: Bu play&#8217;de \u00e7al\u0131\u015ft\u0131r\u0131lacak g\u00f6revlerin listesidir.<br \/>\n*   <strong><code>apt:<\/code><\/strong>: Bir Ansible mod\u00fcl\u00fcd\u00fcr. Bu \u00f6rnekte, <code>apt<\/code> mod\u00fcl\u00fc Debian\/Ubuntu tabanl\u0131 sistemlerde paket y\u00f6netimi i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>name: nginx<\/code>: Kurulacak paketin ad\u0131.<br \/>\n    *   <code>state: latest<\/code>: Paketin en son s\u00fcr\u00fcmde olmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <code>update_cache: yes<\/code>: Paketi kurmadan \u00f6nce <code>apt<\/code> \u00f6nbelle\u011fini g\u00fcnceller.<br \/>\n*   <strong><code>service:<\/code><\/strong>: Bir servisi y\u00f6netmek i\u00e7in kullan\u0131lan mod\u00fcld\u00fcr (ba\u015flatma, durdurma, yeniden ba\u015flatma, etkinle\u015ftirme).<br \/>\n    *   <code>state: started<\/code>: Servisin \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <code>enabled: yes<\/code>: Servisin sistem ba\u015flang\u0131c\u0131nda otomatik olarak ba\u015flamas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong><code>copy:<\/code><\/strong>: Dosyalar\u0131 kontrol makinesinden hedef makineye kopyalamak veya do\u011frudan i\u00e7erik olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>src<\/code>: Kontrol makinesindeki kaynak dosya.<br \/>\n    *   <code>dest<\/code>: Hedef makinedeki var\u0131\u015f yolu.<br \/>\n    *   <code>content<\/code>: Do\u011frudan dosya i\u00e7eri\u011fini tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>owner<\/code>, <code>group<\/code>, <code>mode<\/code>: Olu\u015fturulan dosyan\u0131n izinlerini ve sahipli\u011fini ayarlar.<br \/>\n*   <strong><code>command: nginx -t<\/code><\/strong>: Hedef makinede bir komut \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n*   <strong><code>register: nginx_config_test<\/code><\/strong>: \u00c7al\u0131\u015ft\u0131r\u0131lan komutun \u00e7\u0131kt\u0131s\u0131n\u0131 bir de\u011fi\u015fkene kaydeder.<br \/>\n*   <strong><code>failed_when: nginx_config_test.rc != 0<\/code><\/strong>: Komutun d\u00f6n\u00fc\u015f kodu (rc) s\u0131f\u0131r de\u011filse g\u00f6revin ba\u015far\u0131s\u0131z oldu\u011funu belirtir.<br \/>\n*   <strong><code>changed_when: false<\/code><\/strong>: Bu g\u00f6revin her zaman &#8220;ok&#8221; olarak i\u015faretlenmesini sa\u011flar, \u00e7\u00fcnk\u00fc bir test komutu sistemde de\u011fi\u015fiklik yapmaz.<br \/>\n*   <strong><code>notify: Reload Nginx<\/code><\/strong>: Bir g\u00f6revde de\u011fi\u015fiklik yap\u0131ld\u0131\u011f\u0131nda (\u00f6rne\u011fin, bir yap\u0131land\u0131rma dosyas\u0131 de\u011fi\u015fti\u011finde), belirtilen &#8220;handler&#8221;\u0131 tetikler.<br \/>\n*   <strong><code>handlers:<\/code><\/strong>: Bir veya daha fazla g\u00f6rev taraf\u0131ndan tetiklenen eylemlerdir. Genellikle servisleri yeniden ba\u015flatmak veya yeniden y\u00fcklemek i\u00e7in kullan\u0131l\u0131r. Handler&#8217;lar yaln\u0131zca bir kez, play&#8217;deki t\u00fcm g\u00f6revler tamamland\u0131ktan sonra \u00e7al\u0131\u015f\u0131r.<\/p>\n<h3>Yayg\u0131n Ansible Kavramlar\u0131<\/h3>\n<p>Ansible&#8217;\u0131 etkin bir \u015fekilde kullanmak i\u00e7in baz\u0131 temel kavramlar\u0131 anlamak \u00f6nemlidir.<\/p>\n<h4>Mod\u00fcller<\/h4>\n<p>Mod\u00fcller, Ansible&#8217;\u0131n &#8220;i\u015f birimleridir&#8221;. Bir mod\u00fcl, belirli bir g\u00f6revi ger\u00e7ekle\u015ftiren (\u00f6rne\u011fin, paket y\u00fckleme, servis y\u00f6netimi, dosya kopyalama) ba\u011f\u0131ms\u0131z bir kod par\u00e7as\u0131d\u0131r. Ansible, binlerce yerle\u015fik mod\u00fcl ile gelir ve topluluk taraf\u0131ndan geli\u015ftirilen bir\u00e7ok mod\u00fcl de mevcuttur. Playbook&#8217;larda <code>apt<\/code>, <code>service<\/code>, <code>copy<\/code>, <code>user<\/code>, <code>file<\/code> gibi mod\u00fclleri kullanarak g\u00f6revleri tan\u0131mlars\u0131n\u0131z.<\/p>\n<h4>Envanterler<\/h4>\n<p>Envanter, Ansible&#8217;\u0131n y\u00f6nete\u011fi makinelerin listesidir. Statik (INI veya YAML dosyalar\u0131) veya dinamik (bulut sa\u011flay\u0131c\u0131lar\u0131ndan veya CMDB&#8217;den bilgi \u00e7eken betikler) olabilirler. Envanter, makineleri gruplara ay\u0131rman\u0131za olanak tan\u0131r, b\u00f6ylece belirli bir grup \u00fczerinde g\u00f6revler \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<h4>Playbook&#8217;lar<\/h4>\n<p>Playbook&#8217;lar, Ansible&#8217;\u0131n otomasyon betikleridir. YAML format\u0131nda yaz\u0131l\u0131rlar ve bir veya daha fazla &#8220;play&#8221; i\u00e7erirler. Her play, belirli bir ana bilgisayar grubunu hedefler ve bu ana bilgisayarlarda bir dizi &#8220;g\u00f6rev&#8221; \u00e7al\u0131\u015ft\u0131r\u0131r. Playbook&#8217;lar, karma\u015f\u0131k \u00e7ok ad\u0131ml\u0131 i\u015f ak\u0131\u015flar\u0131n\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h4>Roller<\/h4>\n<p>Roller, Ansible playbook&#8217;lar\u0131n\u0131 yeniden kullan\u0131labilir ve d\u00fczenli bir \u015fekilde organize etmek i\u00e7in kullan\u0131lan bir yap\u0131d\u0131r. Bir rol, belirli bir i\u015flevi yerine getirmek i\u00e7in gereken t\u00fcm dosyalar\u0131 (g\u00f6revler, \u015fablonlar, dosyalar, de\u011fi\u015fkenler, handler&#8217;lar) standart bir dizin yap\u0131s\u0131 i\u00e7inde grupland\u0131r\u0131r. \u00d6rne\u011fin, bir &#8220;webserver&#8221; rol\u00fc, Nginx&#8217;i kurmak, yap\u0131land\u0131rmak ve ba\u015flatmak i\u00e7in gereken her \u015feyi i\u00e7erebilir.<\/p>\n<h4>Faktlar<\/h4>\n<p>Faktlar, Ansible&#8217;\u0131n hedef makinelerden toplad\u0131\u011f\u0131 sistem bilgileridir. \u0130\u015fletim sistemi, a\u011f aray\u00fczleri, bellek, CPU gibi bilgiler faktlar aras\u0131nda yer al\u0131r. Bu faktlar, playbook&#8217;larda ko\u015fullu mant\u0131k veya dinamik de\u011fi\u015fkenler olu\u015fturmak i\u00e7in kullan\u0131labilir. <code>setup<\/code> mod\u00fcl\u00fc ile faktlar toplan\u0131r.<\/p>\n<h4>De\u011fi\u015fkenler<\/h4>\n<p>De\u011fi\u015fkenler, Ansible&#8217;da dinamik de\u011ferleri depolamak i\u00e7in kullan\u0131l\u0131r. Envanterde, playbook&#8217;larda, rollerde veya harici dosyalarda tan\u0131mlanabilirler. De\u011fi\u015fkenler, playbook&#8217;lar\u0131 daha esnek ve yeniden kullan\u0131labilir hale getirir. \u00d6rne\u011fin, bir web sunucusu playbook&#8217;unda port numaras\u0131 veya web k\u00f6k dizini gibi de\u011ferleri de\u011fi\u015fken olarak tan\u0131mlayabilirsiniz.<\/p>\n<h3>Ansible Vault Kullan\u0131m\u0131<\/h3>\n<p>Ansible Vault, hassas verileri (parolalar, API anahtarlar\u0131, SSH \u00f6zel anahtarlar\u0131 vb.) \u015fifrelemek ve y\u00f6netmek i\u00e7in kullan\u0131lan bir \u00f6zelliktir. \u015eifrelenmi\u015f veriler, git gibi s\u00fcr\u00fcm kontrol sistemlerinde g\u00fcvenli bir \u015fekilde saklanabilir ve sadece do\u011fru Vault parolas\u0131yla eri\u015filebilir.<\/p>\n<h4>Vault Nedir ve Neden Kullan\u0131l\u0131r?<\/h4>\n<p>Otomasyon betiklerinde hassas bilgileri d\u00fcz metin olarak saklamak b\u00fcy\u00fck bir g\u00fcvenlik riskidir. Ansible Vault, bu t\u00fcr verileri AES256 \u015fifrelemesi kullanarak korur. Bir Vault dosyas\u0131 olu\u015fturdu\u011funuzda, bu dosya \u015fifrelenir ve i\u00e7eri\u011fini g\u00f6rmek veya d\u00fczenlemek i\u00e7in Vault parolas\u0131n\u0131 sa\u011flaman\u0131z gerekir.<\/p>\n<h4>Vault Dosyas\u0131 Olu\u015fturma<\/h4>\n<p>Yeni bir Vault dosyas\u0131 olu\u015fturmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">ansible-vault create secret_vars.yml<\/code><\/pre>\n<p>Bu komut sizden yeni bir Vault parolas\u0131 girmenizi isteyecektir. Dosya olu\u015fturulduktan sonra, i\u00e7eri\u011fini \u015fifreli bir \u015fekilde d\u00fczenleyebilirsiniz. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-yaml\">db_password: \"supersecretpassword\"\napi_key: \"some_long_api_key_string\"<\/code><\/pre>\n<p>Kaydedip \u00e7\u0131kt\u0131\u011f\u0131n\u0131zda, dosya \u015fifrelenmi\u015f olacakt\u0131r. Dosyan\u0131n i\u00e7eri\u011fini g\u00f6r\u00fcnt\u00fclemek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">ansible-vault view secret_vars.yml<\/code><\/pre>\n<p>Dosyay\u0131 d\u00fczenlemek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">ansible-vault edit secret_vars.yml<\/code><\/pre>\n<h4>Vault ile Playbook \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>Bir playbook&#8217;ta \u015fifrelenmi\u015f de\u011fi\u015fkenleri kullanmak i\u00e7in, playbook&#8217;unuzda Vault dosyas\u0131n\u0131 i\u00e7e aktarman\u0131z ve playbook&#8217;u \u00e7al\u0131\u015ft\u0131r\u0131rken Vault parolas\u0131n\u0131 sa\u011flaman\u0131z gerekir.<\/p>\n<p>\u00d6rne\u011fin, <code>secret_vars.yml<\/code> dosyas\u0131n\u0131 <code>playbook.yml<\/code> i\u00e7inde kullanmak i\u00e7in:<\/p>\n<pre><code class=\"language-yaml\">---\n- name: Uygulama Kurulumu\n  hosts: webservers\n  become: yes\n  vars_files:\n    - secret_vars.yml # Vault dosyas\u0131n\u0131 i\u00e7e aktar\n\n  tasks:\n    - name: Veritaban\u0131 ba\u011flant\u0131 bilgilerini yap\u0131land\u0131r\n      template:\n        src: templates\/config.j2\n        dest: \/etc\/app\/config.ini\n      vars:\n        db_pass: \"{{ db_password }}\" # Vault'tan gelen de\u011fi\u015fkeni kullan<\/code><\/pre>\n<p>Playbook&#8217;u \u00e7al\u0131\u015ft\u0131r\u0131rken Vault parolas\u0131n\u0131 sa\u011flaman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">ansible-playbook playbook.yml --ask-vault-pass<\/code><\/pre>\n<p>Veya bir dosya i\u00e7inde saklanan parolay\u0131 kullanabilirsiniz (bu da g\u00fcvenlik riskleri ta\u015f\u0131r, ancak otomasyon i\u00e7in bazen gereklidir):<\/p>\n<pre><code class=\"language-bash\">ansible-playbook playbook.yml --vault-password-file ~\/.vault_pass.txt<\/code><\/pre>\n<p><code>~\/.vault_pass.txt<\/code> dosyas\u0131 sadece Vault parolas\u0131n\u0131 i\u00e7eren tek sat\u0131rl\u0131k bir dosya olmal\u0131d\u0131r ve izinleri <code>0600<\/code> olarak ayarlanmal\u0131d\u0131r.<\/p>\n<h3>Sorun Giderme \u0130pu\u00e7lar\u0131<\/h3>\n<p>Ansible kullan\u0131rken kar\u015f\u0131la\u015fabilece\u011finiz yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcm ipu\u00e7lar\u0131:<\/p>\n<h4>SSH Ba\u011flant\u0131 Hatalar\u0131<\/h4>\n<p>*   <strong>&#8220;UNREACHABLE!&#8221; hatas\u0131:<\/strong><br \/>\n    *   Hedef makinenin IP adresini veya ana bilgisayar ad\u0131n\u0131 kontrol edin.<br \/>\n    *   Hedef makinenin a\u011f ba\u011flant\u0131s\u0131n\u0131 ve g\u00fcvenlik duvar\u0131 ayarlar\u0131n\u0131 kontrol edin (SSH portu 22 a\u00e7\u0131k m\u0131?).<br \/>\n    *   Kontrol makinesinden hedef makineye <code>ssh kullan\u0131c\u0131ad\u0131@ip_adresi<\/code> ile manuel olarak ba\u011flanmay\u0131 deneyin.<br \/>\n*   <strong>&#8220;Authentication failed.&#8221; hatas\u0131:<\/strong><br \/>\n    *   SSH anahtar \u00e7iftinin do\u011fru kopyaland\u0131\u011f\u0131ndan emin olun (<code>ssh-copy-id<\/code>).<br \/>\n    *   <code>ansible_user<\/code> veya <code>remote_user<\/code> ayarlar\u0131ndaki kullan\u0131c\u0131 ad\u0131n\u0131 kontrol edin.<br \/>\n    *   Kontrol makinesindeki \u00f6zel anahtar dosyas\u0131n\u0131n (<code>~\/.ssh\/id_rsa<\/code>) izinlerinin do\u011fru oldu\u011fundan emin olun (<code>chmod 600 ~\/.ssh\/id_rsa<\/code>).<\/p>\n<h4>Yetkilendirme Sorunlar\u0131 (<code>sudo<\/code>)<\/h4>\n<p>*   <strong>&#8220;sudo: a password is required&#8221; hatas\u0131:<\/strong><br \/>\n    *   Hedef makinedeki kullan\u0131c\u0131n\u0131n <code>sudo<\/code> ayr\u0131cal\u0131klar\u0131 oldu\u011fundan ve parola sormadan <code>sudo<\/code> kullanabildi\u011finden emin olun (\u00f6rne\u011fin, <code>\/etc\/sudoers<\/code> dosyas\u0131nda <code>NOPASSWD<\/code> ayar\u0131).<br \/>\n    *   E\u011fer parola gerekiyorsa, playbook&#8217;u \u00e7al\u0131\u015ft\u0131r\u0131rken <code>--ask-become-pass<\/code> parametresini kullan\u0131n.<\/p>\n<h4>Mod\u00fcl Bulunamad\u0131 Hatalar\u0131<\/h4>\n<p>*   <strong>&#8220;module &#8216;ansible.builtin.apt&#8217; not found&#8221; veya benzeri:<\/strong><br \/>\n    *   Ansible&#8217;\u0131n do\u011fru \u015fekilde kuruldu\u011funu ve PATH&#8217;inizde oldu\u011funu kontrol edin (<code>ansible --version<\/code>).<br \/>\n    *   PIP ile kurduysan\u0131z, <code>~\/.local\/bin<\/code> dizininin PATH&#8217;inizde oldu\u011fundan emin olun.<br \/>\n    *   Python ve PIP&#8217;in hedef makinede kurulu oldu\u011fundan emin olun (<code>ansible_python_interpreter<\/code> ayar\u0131n\u0131 kontrol edin).<\/p>\n<h4>Verbose Mod Kullan\u0131m\u0131<\/h4>\n<p>Sorunlar\u0131 te\u015fhis etmek i\u00e7in Ansible&#8217;\u0131 <code>verbose<\/code> modda \u00e7al\u0131\u015ft\u0131rmak \u00e7ok faydal\u0131d\u0131r. <code>-v<\/code>, <code>-vv<\/code>, <code>-vvv<\/code>, <code>-vvvv<\/code> gibi parametrelerle \u00e7\u0131kt\u0131n\u0131n detay seviyesini art\u0131rabilirsiniz.<\/p>\n<pre><code class=\"language-bash\">ansible all -m ping -vvv\nansible-playbook nginx_install.yml -vvvv<\/code><\/pre>\n<p>Daha y\u00fcksek <code>v<\/code> say\u0131s\u0131, daha fazla hata ay\u0131klama bilgisi sa\u011flar, bu da sorunlar\u0131n k\u00f6k nedenini bulman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu kapsaml\u0131 rehberde, Ubuntu 18.04 i\u015fletim sistemi \u00fczerinde Ansible&#8217;\u0131n nas\u0131l kurulaca\u011f\u0131n\u0131 ve yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frendiniz. Ansible&#8217;\u0131n arac\u0131s\u0131z mimarisi, YAML tabanl\u0131 playbook&#8217;lar\u0131 ve zengin mod\u00fcl ekosistemi sayesinde altyap\u0131 otomasyonu, uygulama da\u011f\u0131t\u0131m\u0131 ve yap\u0131land\u0131rma y\u00f6netimi gibi bir\u00e7ok g\u00f6revi kolayca otomatikle\u015ftirebilirsiniz.<\/p>\n<p>Temel kurulum, SSH anahtar y\u00f6netimi, envanter ve yap\u0131land\u0131rma dosyalar\u0131n\u0131n olu\u015fturulmas\u0131, ilk komutlar\u0131n ve bir \u00f6rnek playbook&#8217;un \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gibi konular\u0131 ele ald\u0131k. Ayr\u0131ca, Ansible Vault kullanarak hassas verileri nas\u0131l g\u00fcvence alt\u0131na alaca\u011f\u0131n\u0131z\u0131 ve yayg\u0131n sorunlar\u0131 nas\u0131l giderece\u011finizi de \u00f6\u011frendiniz.<\/p>\n<p>Ansible, DevOps s\u00fcre\u00e7lerinizi h\u0131zland\u0131rmak ve IT operasyonlar\u0131n\u0131z\u0131n verimlili\u011fini art\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Bu rehberdeki bilgileri temel alarak, kendi otomasyon senaryolar\u0131n\u0131z\u0131 geli\u015ftirmeye ba\u015flayabilir ve altyap\u0131n\u0131z\u0131 daha y\u00f6netilebilir hale getirebilirsiniz. Unutmay\u0131n, pratik yapmak ve farkl\u0131 mod\u00fclleri ke\u015ffetmek, Ansible becerilerinizi geli\u015ftirmenin en iyi yoludur. \u0130leri d\u00fczey konular aras\u0131nda roller, dinamik envanterler, CI\/CD entegrasyonlar\u0131 ve Ansible Tower\/AWX gibi ara\u00e7lar bulunmaktad\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber\nGiri\u015f\nOtomasyon, modern IT altyap\u0131s\u0131n\u0131n temel ta\u015flar\u0131ndan bir","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":[1468],"tags":[],"class_list":{"0":"post-37088","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","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>Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: 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\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber Giri\u015f Otomasyon, modern IT altyap\u0131s\u0131n\u0131n temel ta\u015flar\u0131ndan bir\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-27T04:40:49+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-12-27T04:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/\"},\"wordCount\":3387,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/\",\"name\":\"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-27T04:40:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: 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":"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: 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\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber","og_description":"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber Giri\u015f Otomasyon, modern IT altyap\u0131s\u0131n\u0131n temel ta\u015flar\u0131ndan bir","og_url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-27T04:40:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber","datePublished":"2025-12-27T04:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/"},"wordCount":3387,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/","name":"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-27T04:40:49+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-18-04-uzerine-ansible-kurulumu-ve-yapilandirmasi-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ubuntu 18.04 \u00dczerine Ansible Kurulumu ve Yap\u0131land\u0131rmas\u0131: 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\/37088","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=37088"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37088\/revisions"}],"predecessor-version":[{"id":37089,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37088\/revisions\/37089"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}