{"id":35692,"date":"2025-12-02T20:01:07","date_gmt":"2025-12-02T17:01:07","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/"},"modified":"2025-12-02T20:01:07","modified_gmt":"2025-12-02T17:01:07","slug":"ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/","title":{"rendered":"Ansible ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi"},"content":{"rendered":"<p><body><\/p>\n<p>Web uygulamas\u0131 da\u011f\u0131t\u0131mlar\u0131, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in \u00e7o\u011fu zaman karma\u015f\u0131k, zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Peki ya bu s\u00fcre\u00e7, dakikalar i\u00e7inde, g\u00fcvenilir ve tekrarlanabilir bir \u015fekilde otomatize edilebilseydi? Bu makalede, g\u00fc\u00e7l\u00fc otomasyon arac\u0131 Ansible&#8217;\u0131 kullanarak bir web uygulamas\u0131n\u0131 nas\u0131l sadece 10 dakikada sorunsuz bir \u015fekilde da\u011f\u0131tabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Da\u011f\u0131t\u0131m kabuslar\u0131na veda etmeye haz\u0131r m\u0131s\u0131n\u0131z?<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, bir uygulaman\u0131n kodunu yazmak i\u015fin sadece yar\u0131s\u0131d\u0131r. Di\u011fer yar\u0131s\u0131, bu kodu son kullan\u0131c\u0131lara ula\u015ft\u0131racak \u015fekilde g\u00fcvenli, kararl\u0131 ve \u00f6l\u00e7eklenebilir bir ortamda da\u011f\u0131tmakt\u0131r. Geleneksel da\u011f\u0131t\u0131m y\u00f6ntemleri genellikle manuel ad\u0131mlar, SSH ile sunuculara tek tek ba\u011flanma, ba\u011f\u0131ml\u0131l\u0131klar\u0131 elle kurma ve yap\u0131land\u0131rma dosyalar\u0131n\u0131 kopyalama gibi s\u00fcre\u00e7lerden olu\u015fur. Bu y\u00f6ntemler, insan hatas\u0131na a\u00e7\u0131k olmas\u0131n\u0131n yan\u0131 s\u0131ra, \u00f6zellikle birden fazla sunucuya veya s\u0131k da\u011f\u0131t\u0131m yap\u0131lmas\u0131 gereken durumlarda korkun\u00e7 bir zaman kayb\u0131na neden olur.<\/p>\n<p>Her da\u011f\u0131t\u0131mda &#8220;Acaba bir ad\u0131m atlad\u0131m m\u0131?&#8221;, &#8220;\u00d6nceki sunucudaki yap\u0131land\u0131rma nas\u0131ld\u0131?&#8221; gibi sorularla cebelle\u015fmek, geli\u015ftiricilerin ve DevOps m\u00fchendislerinin enerjisini t\u00fcketen bir durumdur. \u00dcstelik bu tekrarlayan g\u00f6revler, yarat\u0131c\u0131l\u0131\u011f\u0131 ve yenilik\u00e7ili\u011fi k\u00f6relten monoton i\u015flerdir. \u0130\u015fte tam bu noktada, Ansible gibi otomasyon ara\u00e7lar\u0131 devreye girer ve bu kabusu bir r\u00fcyaya d\u00f6n\u00fc\u015ft\u00fcrme potansiyeli sunar.<\/p>\n<p>Ansible, basitli\u011fi, arac\u0131s\u0131z yap\u0131s\u0131 ve g\u00fc\u00e7l\u00fc otomasyon yetenekleri sayesinde DevOps d\u00fcnyas\u0131n\u0131n vazge\u00e7ilmez ara\u00e7lar\u0131ndan biri haline gelmi\u015ftir. Python ile yaz\u0131lm\u0131\u015f olmas\u0131, kolayca \u00f6\u011frenilebilir ve geni\u015fletilebilir olmas\u0131n\u0131 sa\u011flar. Sunuculara SSH \u00fczerinden ba\u011flanarak \u00e7al\u0131\u015f\u0131r, bu da ekstra bir arac\u0131 kurulumuna gerek duymadan an\u0131nda kullanmaya ba\u015flayabilece\u011finiz anlam\u0131na gelir. Bir kez yazd\u0131\u011f\u0131n\u0131z bir Ansible &#8220;playbook&#8221;u, uygulaman\u0131z\u0131 ister bir sunucuya, ister y\u00fczlerce sunucuya ayn\u0131 tutarl\u0131l\u0131kla da\u011f\u0131tmak i\u00e7in tekrar tekrar kullanabilirsiniz. Bu, sadece da\u011f\u0131t\u0131m s\u00fcrecini h\u0131zland\u0131rmakla kalmaz, ayn\u0131 zamanda farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) aras\u0131ndaki yap\u0131land\u0131rma tutars\u0131zl\u0131klar\u0131n\u0131 da ortadan kald\u0131r\u0131r. Bu sayede, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sendromuna da son verirsiniz. \u0130\u015fin \u00f6z\u00fc, Ansible ile manuel i\u015f y\u00fck\u00fcn\u00fc azalt\u0131r, hatalar\u0131 minimize eder ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi h\u0131zland\u0131rarak &#8220;10 dakikada da\u011f\u0131t\u0131m&#8221; hedefine ula\u015fman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Ansible&#8217;\u0131n Temel Ta\u015flar\u0131: Kontrol D\u00fc\u011f\u00fcm\u00fcnden Playbook&#8217;lara<\/h3>\n<p>Ansible&#8217;\u0131n g\u00fcc\u00fcn\u00fc anlamak ve onu etkili bir \u015fekilde kullanmak i\u00e7in, temel bile\u015fenlerini kavramak hayati \u00f6nem ta\u015f\u0131r. \u00d6ncelikle, Ansible&#8217;\u0131n bir &#8220;kontrol d\u00fc\u011f\u00fcm\u00fc&#8221; (control node) ve &#8220;y\u00f6netilen d\u00fc\u011f\u00fcmler&#8221; (managed nodes) kavramlar\u0131 etraf\u0131nda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 bilmeliyiz. Kontrol d\u00fc\u011f\u00fcm\u00fc, Ansible&#8217;\u0131n kurulu oldu\u011fu ve playbook&#8217;lar\u0131n \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 makinedir. Y\u00f6netilen d\u00fc\u011f\u00fcmler ise, kontrol d\u00fc\u011f\u00fcm\u00fcn\u00fcn SSH arac\u0131l\u0131\u011f\u0131yla ba\u011flan\u0131p yap\u0131land\u0131raca\u011f\u0131, uygulaman\u0131n da\u011f\u0131t\u0131laca\u011f\u0131 sunucular veya sanal makinelerdir.<\/p>\n<p>Ansible&#8217;\u0131n kalbi, bir veya daha fazla &#8220;oyun&#8221; (play) i\u00e7eren YAML format\u0131ndaki dosyalard\u0131r. Her oyun, belirli bir grup sunucuda (hosts) belirli g\u00f6revleri (tasks) yerine getirmeyi hedefler. Bu g\u00f6revler, Ansible&#8217;\u0131n sa\u011flad\u0131\u011f\u0131 y\u00fczlerce &#8220;mod\u00fcl&#8221; (modules) arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015ftirilir. \u00d6rne\u011fin, <code>apt<\/code> veya <code>yum<\/code> mod\u00fclleri paket kurulumu i\u00e7in, <code>service<\/code> mod\u00fcl\u00fc servis y\u00f6netimi i\u00e7in, <code>copy<\/code> mod\u00fcl\u00fc dosya kopyalamak i\u00e7in kullan\u0131l\u0131r. Playbook&#8217;lar, da\u011f\u0131t\u0131m s\u00fcrecinizin her ad\u0131m\u0131n\u0131 (paket kurulumu, dosya kopyalama, servis ba\u015flatma, veritaban\u0131 yap\u0131land\u0131rmas\u0131 vb.) insan taraf\u0131ndan okunabilir, deklaratif bir \u015fekilde tan\u0131mlaman\u0131z\u0131 sa\u011flar. Bu deklaratif yap\u0131, Ansible&#8217;\u0131n &#8220;idempotency&#8221; (tekrarlanabilirlik) \u00f6zelli\u011fini de beraberinde getirir. Yani, bir playbook&#8217;u ka\u00e7 kez \u00e7al\u0131\u015ft\u0131r\u0131rsan\u0131z \u00e7al\u0131\u015ft\u0131r\u0131n, sistem her zaman ayn\u0131 istenen duruma gelecektir; zaten kurulu olan bir paketi tekrar kurmaya \u00e7al\u0131\u015fmayacak, gereksiz i\u015flemleri atlayacakt\u0131r. Bu, hata durumunda tekrar \u00e7al\u0131\u015ft\u0131rman\u0131n g\u00fcvenli oldu\u011fu anlam\u0131na gelir.<\/p>\n<p>Bir di\u011fer \u00f6nemli bile\u015fen ise &#8220;envanter&#8221; (inventory) dosyas\u0131d\u0131r. Bu dosya, Ansible&#8217;\u0131n y\u00f6netece\u011fi t\u00fcm sunucular\u0131n listesini ve bu sunuculara ait \u00f6zel de\u011fi\u015fkenleri i\u00e7erir. Envanter, genellikle bir <code>hosts<\/code> dosyas\u0131 olarak adland\u0131r\u0131l\u0131r ve sunucular\u0131 gruplara ay\u0131rman\u0131za olanak tan\u0131r (\u00f6rne\u011fin, <code>[web_sunuculari]<\/code>, <code>[veritabani_sunuculari]<\/code>). Bu sayede, belirli g\u00f6revleri sadece belirli sunucu gruplar\u0131nda \u00e7al\u0131\u015ft\u0131rabilirsiniz. SSH anahtarlar\u0131 ve SSH-Agent kullanarak g\u00fcvenli ve parola gerektirmeyen ba\u011flant\u0131 kurmak, Ansible&#8217;\u0131n h\u0131z ve kullan\u0131m kolayl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan kritik bir ad\u0131md\u0131r. K\u0131sacas\u0131, Ansible; playbook&#8217;lar arac\u0131l\u0131\u011f\u0131yla ne yap\u0131laca\u011f\u0131n\u0131 tan\u0131mlad\u0131\u011f\u0131n\u0131z, envanter dosyas\u0131yla nerede yap\u0131laca\u011f\u0131n\u0131 belirtti\u011finiz ve mod\u00fcllerle de bu i\u015flemleri nas\u0131l yapaca\u011f\u0131n\u0131z\u0131 s\u00f6yledi\u011finiz bir sistemdir. Bu yap\u0131s\u0131yla karma\u015f\u0131k da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini basitle\u015ftirir ve &#8220;kod olarak altyap\u0131&#8221; (Infrastructure as Code) felsefesini destekler.<\/p>\n<h2>Ansible Ortam\u0131n\u0131z\u0131 H\u0131zl\u0131ca Kurulumu Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Ansible ile web uygulamas\u0131 da\u011f\u0131t\u0131m\u0131na ba\u015flamadan \u00f6nce, kontrol d\u00fc\u011f\u00fcm\u00fc olarak kullanaca\u011f\u0131n\u0131z makineye Ansible&#8217;\u0131 kurman\u0131z ve hedef sunucularla ba\u011flant\u0131 kurabilecek \u015fekilde yap\u0131land\u0131rman\u0131z gerekir. Bu kurulum s\u00fcreci olduk\u00e7a h\u0131zl\u0131 ve basittir, genellikle birka\u00e7 dakikan\u0131z\u0131 al\u0131r.<\/p>\n<p><strong>Ad\u0131m 1: Ansible Kurulumu<\/strong><\/p>\n<p>\u00c7o\u011fu Linux da\u011f\u0131t\u0131m\u0131nda Ansible, paket y\u00f6neticileri arac\u0131l\u0131\u011f\u0131yla kolayca kurulabilir. Ubuntu\/Debian tabanl\u0131 sistemler i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">\nsudo apt update\nsudo apt install ansible -y\n<\/pre>\n<p><\/code><\/p>\n<p>CentOS\/RHEL tabanl\u0131 sistemler i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">\nsudo yum install epel-release -y\nsudo yum install ansible -y\n<\/pre>\n<p><\/code><\/p>\n<p>E\u011fer macOS kullan\u0131yorsan\u0131z veya daha g\u00fcncel bir s\u00fcr\u00fcm isterseniz, Python'\u0131n paket y\u00f6neticisi <code>pip<\/code> arac\u0131l\u0131\u011f\u0131yla da kurabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\npip install ansible\n<\/pre>\n<p><\/code><\/p>\n<p>Kurulumun ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">\nansible --version\n<\/pre>\n<p><\/code><\/p>\n<p><strong>Ad\u0131m 2: SSH Anahtar\u0131 Yap\u0131land\u0131rmas\u0131<\/strong><\/p>\n<p>Ansible, y\u00f6netilen d\u00fc\u011f\u00fcmlere ba\u011flanmak i\u00e7in SSH kullan\u0131r. G\u00fcvenli ve parola gerektirmeyen ba\u011flant\u0131lar i\u00e7in SSH anahtar \u00e7ifti olu\u015fturman\u0131z ve ortak anahtar\u0131 hedef sunucular\u0131n\u0131za kopyalaman\u0131z \u015fartt\u0131r. E\u011fer zaten bir SSH anahtar\u0131n\u0131z yoksa:<\/p>\n<pre><code class=\"language-bash\">\nssh-keygen -t rsa -b 4096 -C \"your_email@example.com\"\n<\/pre>\n<p><\/code><\/p>\n<p>Olu\u015fturulan ortak anahtar\u0131 (genellikle <code>~\/.ssh\/id_rsa.pub<\/code>) hedef sunucudaki kullan\u0131c\u0131 hesab\u0131n\u0131n <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na kopyalay\u0131n. Bunu <code>ssh-copy-id<\/code> arac\u0131yla kolayca yapabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\nssh-copy-id username@your_remote_server_ip\n<\/pre>\n<p><\/code><\/p>\n<p><strong>Ad\u0131m 3: Envanter Dosyas\u0131 Olu\u015fturma<\/strong><\/p>\n<p>\u015eimdi Ansible'\u0131n hangi sunucular\u0131 y\u00f6netece\u011fini bilmesi gerekiyor. Bunun i\u00e7in bir envanter dosyas\u0131 (genellikle <code>hosts<\/code> ad\u0131nda) olu\u015fturaca\u011f\u0131z. \u00d6rne\u011fin, projenizin k\u00f6k dizininde <code>inventory\/hosts<\/code> ad\u0131nda bir dosya yarat\u0131n:<\/p>\n<pre><code class=\"language-ini\">\n[webservers]\nweb1 ansible_host=your_web_server_ip ansible_user=username\n\n[databases]\ndb1 ansible_host=your_database_server_ip ansible_user=username\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>[webservers]<\/code> ve <code>[databases]<\/code> gruplar olu\u015fturur. <code>web1<\/code> ve <code>db1<\/code>, sunucular\u0131n\u0131z\u0131n takma adlar\u0131d\u0131r. <code>ansible_host<\/code> ile sunucunun IP adresi veya hostname'i, <code>ansible_user<\/code> ile ise SSH ba\u011flant\u0131s\u0131 i\u00e7in kullan\u0131lacak kullan\u0131c\u0131 ad\u0131 belirtilir. E\u011fer \u00f6zel bir SSH anahtar dosyas\u0131 kullan\u0131yorsan\u0131z, <code>ansible_ssh_private_key_file=\/path\/to\/your\/key.pem<\/code> gibi ek de\u011fi\u015fkenler de tan\u0131mlayabilirsiniz.<\/p>\n<p><strong>Ad\u0131m 4: Ba\u011flant\u0131 Testi<\/strong><\/p>\n<p>Her \u015feyin do\u011fru kurulup kurulmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in basit bir ping mod\u00fcl\u00fc kullanabiliriz:<\/p>\n<pre><code class=\"language-bash\">\nansible all -i inventory\/hosts -m ping\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, envanter dosyas\u0131ndaki t\u00fcm sunuculara ping atacak ve ba\u015far\u0131l\u0131 olursa her sunucu i\u00e7in <code>\"pong\"<\/code> \u00e7\u0131kt\u0131s\u0131 verecektir. E\u011fer <code>\"SUCCESS\"<\/code> ve <code>\"pong\"<\/code> g\u00f6r\u00fcyorsan\u0131z, tebrikler! Ansible ortam\u0131n\u0131z web uygulamas\u0131 da\u011f\u0131t\u0131m\u0131 i\u00e7in haz\u0131r.<\/p>\n<h3>\u0130lk Playbook'unuzu Yaz\u0131n: Web Sunucusu Kurulumu Ad\u0131mlar\u0131<\/h3>\n<p>Ansible'\u0131n temel bile\u015fenlerini ve kurulumunu tamamlad\u0131\u011f\u0131m\u0131za g\u00f6re, art\u0131k ilk playbook'umuzu yazarak pratik bir ad\u0131m atabiliriz. Bu b\u00f6l\u00fcmde, basit bir Nginx web sunucusu kurulumu ve yap\u0131land\u0131rmas\u0131 i\u00e7in bir playbook olu\u015fturaca\u011f\u0131z. Bu, web uygulamas\u0131 da\u011f\u0131t\u0131m\u0131m\u0131z\u0131n temelini olu\u015fturacak \u00f6nemli bir ad\u0131md\u0131r.<\/p>\n<p>Playbook'lar YAML format\u0131nda yaz\u0131l\u0131r ve olduk\u00e7a okunabilirdir. Bir playbook genellikle \u015fu anahtar b\u00f6l\u00fcmlerden olu\u015fur:<\/p>\n<ul>\n<li><code>hosts<\/code>: Bu oyunun hangi sunucu gruplar\u0131nda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>become<\/code>: Y\u00fcksek yetkilerle (root gibi) komut \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r. Genellikle <code>yes<\/code> olarak ayarlan\u0131r.<\/li>\n<li><code>tasks<\/code>: As\u0131l yap\u0131lacak i\u015flerin listesidir. Her bir g\u00f6rev, bir Ansible mod\u00fcl\u00fc kullan\u0131larak tan\u0131mlan\u0131r.<\/li>\n<\/ul>\n<p>Haydi, <code>site.yml<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve i\u00e7ine a\u015fa\u011f\u0131daki Nginx kurulum playbook'unu yazal\u0131m:<\/p>\n<pre><code class=\"language-yaml\">\n---\n- name: Web Sunucusu (Nginx) Kurulumu ve Yap\u0131land\u0131rmas\u0131\n  hosts: webservers  # Envanter dosyam\u0131zdaki \"webservers\" grubunu hedefle\n  become: yes        # G\u00f6revleri sudo yetkisiyle \u00e7al\u0131\u015ft\u0131r\n\n  tasks:\n    - name: Apt paket listesini g\u00fcncelle\n      ansible.builtin.apt:\n        update_cache: yes\n\n    - name: Nginx paketini kur\n      ansible.builtin.apt:\n        name: nginx\n        state: present\n\n    - name: Nginx servisinin ba\u015flat\u0131ld\u0131\u011f\u0131ndan ve her \u00f6ny\u00fcklemede \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin ol\n      ansible.builtin.service:\n        name: nginx\n        state: started\n        enabled: yes\n\n    - name: Varsay\u0131lan Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 kald\u0131r (iste\u011fe ba\u011fl\u0131, yeni yap\u0131land\u0131rma i\u00e7in yer a\u00e7)\n      ansible.builtin.file:\n        path: \/etc\/nginx\/sites-enabled\/default\n        state: absent\n      notify: Reload Nginx\n\n    - name: Uygulama i\u00e7in \u00f6zel Nginx yap\u0131land\u0131rmas\u0131n\u0131 kopyala\n      ansible.builtin.template:\n        src: templates\/nginx.conf.j2  # \u015eablon dosyam\u0131z\n        dest: \/etc\/nginx\/sites-available\/myapp.conf\n        owner: root\n        group: root\n        mode: '0644'\n      notify: Restart Nginx\n\n    - name: Nginx yap\u0131land\u0131rmas\u0131n\u0131 etkinle\u015ftir\n      ansible.builtin.file:\n        src: \/etc\/nginx\/sites-available\/myapp.conf\n        dest: \/etc\/nginx\/sites-enabled\/myapp.conf\n        state: link\n      notify: Restart Nginx\n\n  handlers:\n    - name: Restart Nginx\n      ansible.builtin.service:\n        name: nginx\n        state: restarted\n\n    - name: Reload Nginx\n      ansible.builtin.service:\n        name: nginx\n        state: reloaded\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Playbook'lar\u0131n\u0131zda <code>notify<\/code> ve <code>handlers<\/code> kullanmak, yaln\u0131zca bir de\u011fi\u015fikli\u011fin gerekli oldu\u011fu durumlarda servisleri yeniden ba\u015flatarak veya yeniden y\u00fckleyerek performans\u0131 art\u0131r\u0131r ve gereksiz kesintileri \u00f6nler. Bu, idempotency'nin \u00f6nemli bir par\u00e7as\u0131d\u0131r.\n    <\/div>\n<p>Bu playbook'ta <code>template<\/code> mod\u00fcl\u00fc kulland\u0131k. Bu mod\u00fcl, Jinja2 \u015fablon motorunu kullanarak sunucuya \u00f6zel yap\u0131land\u0131rma dosyalar\u0131 olu\u015fturman\u0131za olanak tan\u0131r. Yani, <code>templates\/nginx.conf.j2<\/code> ad\u0131nda bir \u015fablon dosyas\u0131 olu\u015fturmal\u0131y\u0131z:<\/p>\n<pre><code class=\"language-nginx\">\n# templates\/nginx.conf.j2\nserver {\n    listen 80;\n    server_name {{ ansible_fqdn | default(ansible_host) }}; # Dinamik olarak host ad\u0131n\u0131 al\n\n    location \/ {\n        proxy_pass http:\/\/127.0.0.1:5000; # Uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 port\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fablon, Nginx'i <code>127.0.0.1:5000<\/code> adresinde \u00e7al\u0131\u015fan bir uygulamaya vekil sunucu olarak y\u00f6nlendirecek. <code>{{ ansible_fqdn }}<\/code> gibi ifadeler, Ansible'\u0131n toplad\u0131\u011f\u0131 \"ger\u00e7ekler\" (facts) ad\u0131 verilen sistem bilgilerini kullanarak dinamik de\u011ferler eklemenizi sa\u011flar.<\/p>\n<p>\u015eimdi playbook'u \u00e7al\u0131\u015ft\u0131rmak i\u00e7in komutu verelim:<\/p>\n<pre><code class=\"language-bash\">\nansible-playbook -i inventory\/hosts site.yml\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, envanter dosyas\u0131ndaki <code>webservers<\/code> grubundaki t\u00fcm sunuculara ba\u011flanacak, Nginx'i kuracak, yap\u0131land\u0131racak ve ba\u015flatacakt\u0131r. Bu ad\u0131mlar\u0131n tamamlanmas\u0131, sunucunuzun temel web sunucusu yap\u0131land\u0131rmas\u0131 i\u00e7in haz\u0131rd\u0131r.<\/p>\n<h2>10 Dakikada Web Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131: Ad\u0131m Ad\u0131m Senaryo<\/h2>\n<p>\u015eimdi en heyecan verici k\u0131sma geldik: basit bir web uygulamas\u0131n\u0131 Ansible ile sadece 10 dakikada da\u011f\u0131tma! Bu senaryoda, Python tabanl\u0131 Flask \u00e7er\u00e7evesini kullanan k\u00fc\u00e7\u00fck bir web uygulamas\u0131n\u0131 hedef sunucumuza da\u011f\u0131taca\u011f\u0131z. Uygulamam\u0131z\u0131n Nginx arkas\u0131nda, Gunicorn uygulama sunucusu ile \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve basit bir Python beti\u011fi oldu\u011funu varsayal\u0131m. Bu senaryo, genel web uygulamas\u0131 da\u011f\u0131t\u0131m ad\u0131mlar\u0131n\u0131 kapsad\u0131\u011f\u0131 i\u00e7in farkl\u0131 teknolojilere (Node.js, PHP vb.) kolayca uyarlanabilir.<\/p>\n<p><strong>Vaka Analizi: Basit Bir Flask Uygulamas\u0131n\u0131n Da\u011f\u0131t\u0131m\u0131<\/strong><\/p>\n<p>Uygulamam\u0131z\u0131n yap\u0131s\u0131 \u015f\u00f6yle olsun:<\/p>\n<ul>\n<li><code>app.py<\/code>: Flask uygulamam\u0131z\u0131n ana kodu.<\/li>\n<li><code>requirements.txt<\/code>: Python ba\u011f\u0131ml\u0131l\u0131klar\u0131 (Flask, Gunicorn).<\/li>\n<\/ul>\n<p>\u00d6rnek <code>app.py<\/code> i\u00e7eri\u011fi:<\/p>\n<pre><code class=\"language-python\">\n# app.py\nfrom flask import Flask\napp = Flask(__name__)\n\n@app.route('\/')\ndef hello():\n    return \"Hello, Ansible! Your app is deployed!\"\n\nif __name__ == '__main__':\n    app.run(host='0.0.0.0', port=5000)\n<\/pre>\n<p><\/code><\/p>\n<p>\u00d6rnek <code>requirements.txt<\/code> i\u00e7eri\u011fi:<\/p>\n<pre><code class=\"language-text\">\nFlask\ngunicorn\n<\/pre>\n<p><\/code><\/p>\n<p>Bu uygulama kodunu bir Git deposunda (\u00f6rne\u011fin GitHub veya GitLab) bar\u0131nd\u0131rd\u0131\u011f\u0131n\u0131z\u0131 varsay\u0131yoruz.<\/p>\n<p><strong>Yeni Playbook: Uygulama Da\u011f\u0131t\u0131m\u0131<\/strong><\/p>\n<p>\u00d6nceki <code>site.yml<\/code> playbook'umuza ek olarak veya yeni bir <code>deploy_app.yml<\/code> playbook'u olu\u015fturarak devam edebiliriz:<\/p>\n<pre><code class=\"language-yaml\">\n---\n- name: Flask Web Uygulamas\u0131n\u0131 Da\u011f\u0131t\n  hosts: webservers\n  become: yes\n\n  vars:\n    app_repo_url: \"https:\/\/github.com\/your-username\/your-flask-app.git\" # Git repo URL'niz\n    app_path: \"\/var\/www\/myapp\"\n    python_version: \"python3.8\" # Sunucudaki Python versiyonu\n\n  tasks:\n    - name: Gerekli Python ara\u00e7lar\u0131n\u0131 y\u00fckle (pip, venv)\n      ansible.builtin.apt:\n        name: \"{{ item }}\"\n        state: present\n      loop:\n        - \"{{ python_version }}-venv\"\n        - python3-pip\n\n    - name: Uygulama dizinini olu\u015ftur\n      ansible.builtin.file:\n        path: \"{{ app_path }}\"\n        state: directory\n        owner: www-data\n        group: www-data\n        mode: '0755'\n\n    - name: Git deposunu klonla veya g\u00fcncelle\n      ansible.builtin.git:\n        repo: \"{{ app_repo_url }}\"\n        dest: \"{{ app_path }}\"\n        version: master # Hangi branch'i klonlayaca\u011f\u0131n\u0131z\u0131 belirtin\n        force: yes # Kod de\u011fi\u015ftiyse zorla g\u00fcncelleme yap\n      become_user: www-data # Git klonlamas\u0131n\u0131 www-data kullan\u0131c\u0131s\u0131 ile yap\n\n    - name: Python sanal ortam\u0131 olu\u015ftur\n      ansible.builtin.command: \"{{ python_version }} -m venv {{ app_path }}\/venv\"\n      args:\n        creates: \"{{ app_path }}\/venv\/bin\/activate\" # Sadece ilk \u00e7al\u0131\u015ft\u0131rmada olu\u015ftur\n      become_user: www-data\n\n    - name: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 sanal ortama y\u00fckle\n      ansible.builtin.pip:\n        requirements: \"{{ app_path }}\/requirements.txt\"\n        virtualenv: \"{{ app_path }}\/venv\"\n        executable: \"{{ app_path }}\/venv\/bin\/pip\"\n      become_user: www-data\n\n    - name: Systemd servis dosyas\u0131 olu\u015ftur (Gunicorn i\u00e7in)\n      ansible.builtin.template:\n        src: templates\/myapp.service.j2\n        dest: \/etc\/systemd\/system\/myapp.service\n        owner: root\n        group: root\n        mode: '0644'\n      notify: Restart Gunicorn\n\n    - name: Gunicorn servisini etkinle\u015ftir ve ba\u015flat\n      ansible.builtin.systemd:\n        name: myapp\n        state: started\n        enabled: yes\n        daemon_reload: yes # Yeni systemd servis dosyas\u0131n\u0131 tan\u0131mas\u0131 i\u00e7in\n      notify: Restart Gunicorn # Handler'a y\u00f6nlendirerek servisin yeniden ba\u015flamas\u0131n\u0131 sa\u011fla\n\n  handlers:\n    - name: Restart Gunicorn\n      ansible.builtin.systemd:\n        name: myapp\n        state: restarted\n<\/pre>\n<p><\/code><\/p>\n<p>Bu playbook i\u00e7in bir <code>myapp.service.j2<\/code> \u015fablonuna ihtiyac\u0131m\u0131z var (<code>templates\/<\/code> dizini alt\u0131nda):<\/p>\n<pre><code class=\"language-ini\">\n# templates\/myapp.service.j2\n[Unit]\nDescription=Gunicorn instance for myapp\nAfter=network.target\n\n[Service]\nUser=www-data\nGroup=www-data\nWorkingDirectory={{ app_path }}\nExecStart={{ app_path }}\/venv\/bin\/gunicorn --workers 3 --bind 0.0.0.0:5000 app:app # app:app Flask uygulaman\u0131z\u0131n entrypoint'i\nRestart=always\nPrivateTmp=true\n\n[Install]\nWantedBy=multi-user.target\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>.service<\/code> dosyas\u0131, Gunicorn'u bir Systemd servisi olarak \u00e7al\u0131\u015ft\u0131racak ve uygulamam\u0131z\u0131n 5000 portunda dinlemesini sa\u011flayacak. Nginx yap\u0131land\u0131rmam\u0131z da bu porta y\u00f6nlendirme yapacakt\u0131.<\/p>\n<p><strong>Da\u011f\u0131t\u0131m\u0131 \u00c7al\u0131\u015ft\u0131rma<\/strong><\/p>\n<p>\u015eimdi her iki playbook'u bir master playbook alt\u0131nda birle\u015ftirebilir veya ayr\u0131 ayr\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz. En iyisi, t\u00fcm ad\u0131mlar\u0131 tek bir ak\u0131\u015fta birle\u015ftirmektir. \u00d6rne\u011fin, ana <code>deploy.yml<\/code> dosyan\u0131z:<\/p>\n<pre><code class=\"language-yaml\">\n---\n- import_playbook: site.yml # Nginx kurulumu ve yap\u0131land\u0131rmas\u0131\n- import_playbook: deploy_app.yml # Uygulama kodunun da\u011f\u0131t\u0131m\u0131 ve Gunicorn yap\u0131land\u0131rmas\u0131\n<\/pre>\n<p><\/code><\/p>\n<p>Ve \u015fimdi sihirli komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">\nansible-playbook -i inventory\/hosts deploy.yml\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, sunucunuzu s\u0131f\u0131rdan bir web uygulamas\u0131 da\u011f\u0131tacak hale getirecektir. \u0130nternet h\u0131z\u0131n\u0131za ve sunucunuzun performans\u0131na ba\u011fl\u0131 olarak, t\u00fcm bu ad\u0131mlar ger\u00e7ekten de 5-10 dakika i\u00e7inde tamamlanabilir. Playbook'un her ad\u0131m\u0131n\u0131 izleyebilir, ye\u015fil (de\u011fi\u015fiklik yok) ve sar\u0131 (de\u011fi\u015fiklik yap\u0131ld\u0131) \u00e7\u0131kt\u0131larla s\u00fcrecin sorunsuz ilerledi\u011fini g\u00f6rebilirsiniz.<\/p>\n<p>Bu senaryo, Ansible'\u0131n web uygulamas\u0131 da\u011f\u0131t\u0131m\u0131 i\u00e7in ne kadar g\u00fc\u00e7l\u00fc ve zaman kazand\u0131r\u0131c\u0131 olabilece\u011fini a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Uygulama kodunu g\u00fcncelledi\u011finizde, sadece <code>deploy_app.yml<\/code> playbook'unu tekrar \u00e7al\u0131\u015ft\u0131rarak yeni s\u00fcr\u00fcm\u00fc saniyeler i\u00e7inde da\u011f\u0131tabilirsiniz.<\/p>\n<h3>G\u00fcvenli ve Esnek Da\u011f\u0131t\u0131m i\u00e7in \u0130pu\u00e7lar\u0131: Ansible Vault ve Roller<\/h3>\n<p>Uygulaman\u0131z\u0131 ba\u015far\u0131yla da\u011f\u0131tt\u0131n\u0131z, peki ya g\u00fcvenlik ve daha karma\u015f\u0131k da\u011f\u0131t\u0131m senaryolar\u0131? Ansible, bu konularda da size yard\u0131mc\u0131 olacak g\u00fc\u00e7l\u00fc \u00f6zelliklere sahiptir: Ansible Vault ve Roller.<\/p>\n<p><strong>Ansible Vault: Hassas Verilerinizi Korumak<\/strong><\/p>\n<p>Her web uygulamas\u0131n\u0131n veritaban\u0131 \u015fifreleri, API anahtarlar\u0131, \u00f6zel anahtarlar gibi hassas bilgileri bulunur. Bu bilgileri do\u011frudan playbook'larda veya de\u011fi\u015fken dosyalar\u0131nda a\u00e7\u0131k metin olarak tutmak b\u00fcy\u00fck bir g\u00fcvenlik riskidir. \u0130\u015fte burada Ansible Vault devreye girer. Ansible Vault, hassas verileri \u015fifrelemenize ve bunlar\u0131 g\u00fcvenli bir \u015fekilde s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda tutman\u0131za olanak tan\u0131r. Bir kez \u015fifrelenen bir dosyay\u0131, Vault parolas\u0131 olmadan okuyamaz veya d\u00fczenleyemezsiniz.<\/p>\n<p>Vault ile \u015fifrelenmi\u015f bir dosya olu\u015fturmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">\nansible-vault create vars\/secret_vars.yml\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut sizden bir parola isteyecek ve \u015fifreleme i\u00e7in kullanacakt\u0131r. Ard\u0131ndan bir d\u00fczenleyici a\u00e7\u0131lacak ve buraya hassas verilerinizi YAML format\u0131nda yazabilirsiniz:<\/p>\n<pre><code class=\"language-yaml\">\n# vars\/secret_vars.yml (\u015eifrelenmi\u015f i\u00e7erik)\ndb_password: \"cok_gizli_veritabani_sifrem\"\napi_key: \"gizli_api_anahtarim_123\"\n<\/pre>\n<p><\/code><\/p>\n<p>Daha sonra bu \u015fifrelenmi\u015f de\u011fi\u015fkenleri playbook'lar\u0131n\u0131zda normal de\u011fi\u015fkenler gibi kullanabilirsiniz. Playbook'u \u00e7al\u0131\u015ft\u0131r\u0131rken Ansible'a Vault parolas\u0131n\u0131 sa\u011flaman\u0131z yeterlidir:<\/p>\n<pre><code class=\"language-bash\">\nansible-playbook -i inventory\/hosts deploy.yml --ask-vault-pass\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, kod taban\u0131n\u0131z\u0131 g\u00fcvende tutarken hassas bilgilerinizi koruman\u0131z\u0131 sa\u011flar.<\/p>\n<p><strong>Roller: Playbook'lar\u0131n\u0131z\u0131 Mod\u00fcler Hale Getirme<\/strong><\/p>\n<p>Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e veya birden fazla uygulama da\u011f\u0131tt\u0131k\u00e7a, tek bir b\u00fcy\u00fck playbook y\u00f6netilemez hale gelebilir. Ansible Rolleri, playbook'lar\u0131n\u0131z\u0131 mant\u0131ksal, yeniden kullan\u0131labilir ve iyi organize edilmi\u015f birimlere ay\u0131rman\u0131n en iyi yoludur. Bir rol, belirli bir i\u015flevi (\u00f6rne\u011fin, \"web sunucusu\", \"veritaban\u0131\", \"uygulama\") yerine getirmek i\u00e7in gereken t\u00fcm g\u00f6revleri, \u015fablonlar\u0131, dosya ve de\u011fi\u015fkenleri bir araya getirir.<\/p>\n<p>Bir rol yap\u0131s\u0131 genellikle \u015funa benzer:<\/p>\n<pre><code class=\"language-bash\">\nroles\/\n\u251c\u2500\u2500 webserver\/\n\u2502   \u251c\u2500\u2500 tasks\/\n\u2502   \u2502   \u2514\u2500\u2500 main.yml\n\u2502   \u251c\u2500\u2500 templates\/\n\u2502   \u2502   \u2514\u2500\u2500 nginx.conf.j2\n\u2502   \u251c\u2500\u2500 handlers\/\n\u2502   \u2502   \u2514\u2500\u2500 main.yml\n\u2502   \u2514\u2500\u2500 vars\/\n\u2502       \u2514\u2500\u2500 main.yml\n\u2514\u2500\u2500 app\/\n    \u251c\u2500\u2500 tasks\/\n    \u2502   \u2514\u2500\u2500 main.yml\n    \u251c\u2500\u2500 templates\/\n    \u2502   \u2514\u2500\u2500 myapp.service.j2\n    \u2514\u2500\u2500 vars\/\n        \u2514\u2500\u2500 main.yml\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte Nginx kurulumu ve uygulama da\u011f\u0131t\u0131m\u0131n\u0131 iki ayr\u0131 role b\u00f6lebiliriz. Ard\u0131ndan ana playbook'unuzda bu rolleri \u00e7a\u011f\u0131r\u0131rs\u0131n\u0131z:<\/p>\n<pre><code class=\"language-yaml\">\n---\n- name: Web Uygulamas\u0131n\u0131 Roller ile Da\u011f\u0131t\n  hosts: webservers\n  become: yes\n  vars_files:\n    - vars\/secret_vars.yml # \u015eifrelenmi\u015f de\u011fi\u015fkenleri dahil et\n\n  roles:\n    - role: webserver\n    - role: app\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Roller, \"Infrastructure as Code\" prensibini en iyi \u015fekilde uygulaman\u0131z\u0131 sa\u011flar. Farkl\u0131 projelerde ayn\u0131 role sahip sunuculara (\u00f6rn. t\u00fcm web sunucular\u0131na) ayn\u0131 yap\u0131land\u0131rmay\u0131 otomatik olarak uygulayabilirsiniz. Bu, tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcr\u00fcr.\n    <\/div>\n<p>Roller, karma\u015f\u0131k altyap\u0131lar\u0131n ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin y\u00f6netimini son derece basit ve anla\u015f\u0131l\u0131r hale getirir. Yeni bir sunucuya web sunucusu ve uygulamas\u0131n\u0131 kurmak i\u00e7in sadece <code>webserver<\/code> ve <code>app<\/code> rollerini ataman\u0131z yeterlidir. Bu, Ansible'\u0131n h\u0131zl\u0131 ve esnek da\u011f\u0131t\u0131m yeteneklerini daha da ileriye ta\u015f\u0131r.<\/p>\n<h2>Vaka Analizi: B\u00fcy\u00fck \u00d6l\u00e7ekli Bir Da\u011f\u0131t\u0131mda Ansible'\u0131n Rol\u00fc<\/h2>\n<p>K\u00fc\u00e7\u00fck bir Flask uygulamas\u0131n\u0131 10 dakikada da\u011f\u0131tmak etkileyici olsa da, Ansible'\u0131n ger\u00e7ek g\u00fcc\u00fc b\u00fcy\u00fck ve karma\u015f\u0131k altyap\u0131larda kendini g\u00f6sterir. Hayal edin ki, y\u00fczlerce sunucudan olu\u015fan, farkl\u0131 mikroservisleri bar\u0131nd\u0131ran, veritaban\u0131 k\u00fcmeleri, mesaj kuyruklar\u0131 ve \u00f6nbellek sistemleri i\u00e7eren bir \u00fcretim ortam\u0131n\u0131z var. Bu t\u00fcr bir ortamda manuel da\u011f\u0131t\u0131m, hata yapmaya davet \u00e7\u0131karmakla e\u015fde\u011ferdir. \u0130\u015fte burada, global bir e-ticaret \u015firketinin Ansible'\u0131 nas\u0131l kulland\u0131\u011f\u0131na dair kurgusal bir vaka analizini inceleyelim.<\/p>\n<p><strong>Senaryo: \"E-Ticaret Devrimi\" adl\u0131 \u015firketin Altyap\u0131 Otomasyonu<\/strong><\/p>\n<p>E-Ticaret Devrimi, milyonlarca kullan\u0131c\u0131ya hizmet veren, mikroservis mimarisi \u00fczerine kurulu bir platform i\u015fletiyor. \u00dcr\u00fcn katalo\u011fu, \u00f6deme a\u011f ge\u00e7idi, kullan\u0131c\u0131 profili y\u00f6netimi, sipari\u015f i\u015fleme gibi 20'den fazla ba\u011f\u0131ms\u0131z mikroservisleri ve bunlar\u0131n her birinin kendi veritaban\u0131, \u00f6nbellek ve mesajla\u015fma ba\u011f\u0131ml\u0131l\u0131klar\u0131 mevcut. Geli\u015ftirme ekipleri, her hafta birden fazla servise g\u00fcncelleme yay\u0131nl\u0131yor ve bu g\u00fcncellemelerin h\u0131zl\u0131, g\u00fcvenilir ve tutarl\u0131 bir \u015fekilde \u00fcretim ortam\u0131na da\u011f\u0131t\u0131lmas\u0131 gerekiyor.<\/p>\n<p><strong>Sorun:<\/strong> \u015eirket ba\u015flang\u0131\u00e7ta da\u011f\u0131t\u0131mlar\u0131 bash betikleri ve elle yap\u0131lan SSH komutlar\u0131 ile y\u00fcr\u00fct\u00fcyordu. Bu durum, s\u0131k s\u0131k hatalara, servis kesintilerine ve \u00f6zellikle yo\u011fun d\u00f6nemlerde (kara cuma gibi) ciddi aksakl\u0131klara yol a\u00e7\u0131yordu. Yeni bir sunucu haz\u0131rlamak g\u00fcnler, t\u00fcm mikroservisleri g\u00fcncellemek ise bazen bir haftay\u0131 bulabiliyordu. Tutars\u0131zl\u0131klar nedeniyle \"test ortam\u0131nda \u00e7al\u0131\u015f\u0131yor, \u00fcretimde neden \u00e7al\u0131\u015fm\u0131yor?\" \u015fikayetleri artm\u0131\u015ft\u0131.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm: Ansible Entegrasyonu<\/strong><\/p>\n<p>E-Ticaret Devrimi, bu kaosu sonland\u0131rmak i\u00e7in Ansible'\u0131 benimsemeye karar verdi. A\u015fa\u011f\u0131daki ad\u0131mlarla sistemlerini otomatikle\u015ftirdiler:<\/p>\n<ol>\n<li><strong>Altyap\u0131 Tan\u0131mlamas\u0131 (Infrastructure as Code):<\/strong> T\u00fcm sunucu yap\u0131land\u0131rmalar\u0131, servis kurulumlar\u0131 ve uygulama da\u011f\u0131t\u0131m ad\u0131mlar\u0131 Ansible playbook'lar\u0131na ve rollere d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc. Her mikroservis i\u00e7in ayr\u0131 bir rol (\u00f6rne\u011fin, <code>product_catalog_service<\/code>, <code>payment_gateway<\/code>) ve her ba\u011f\u0131ml\u0131l\u0131k (<code>nginx<\/code>, <code>postgresql<\/code>, <code>redis<\/code>, <code>rabbitmq<\/code>) i\u00e7in ayr\u0131 roller olu\u015fturuldu.<\/li>\n<li><strong>Envanter Y\u00f6netimi:<\/strong> Dinamik envanterler kullanarak AWS veya di\u011fer bulut sa\u011flay\u0131c\u0131lar\u0131ndan sunucu listelerini otomatik olarak \u00e7ektiler. Bu sayede, yeni bir sunucu a\u00e7\u0131ld\u0131\u011f\u0131nda veya kapat\u0131ld\u0131\u011f\u0131nda, Ansible envanteri her zaman g\u00fcncel kal\u0131yordu. Sunucular rollerine g\u00f6re grupland\u0131r\u0131ld\u0131 (<code>web_katmani<\/code>, <code>uygulama_katmani<\/code>, <code>veritabani_katmani<\/code>).<\/li>\n<li><strong>CI\/CD Entegrasyonu:<\/strong> GitHub Actions veya Jenkins gibi bir CI\/CD arac\u0131yla Ansible entegre edildi. Her kod de\u011fi\u015fikli\u011fi, otomatik testlerden ge\u00e7tikten sonra, ilgili mikroservisin Ansible playbook'unu tetikleyerek uygulaman\u0131n otomatik olarak da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011fl\u0131yordu. \u00d6rne\u011fin, <code>product_catalog<\/code> servisine bir PR birle\u015ftirildi\u011finde, ilgili Ansible rol\u00fc \u00e7al\u0131\u015ft\u0131r\u0131larak sadece bu servisin g\u00fcncellenmesi sa\u011flan\u0131yordu.<\/li>\n<li><strong>Ansible Vault Kullan\u0131m\u0131:<\/strong> T\u00fcm veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 ve di\u011fer hassas veriler Ansible Vault ile \u015fifrelendi ve bu dosyalar\u0131n \u015fifresi sadece CI\/CD ortam\u0131nda g\u00fcvenli bir \u015fekilde eri\u015filebilir k\u0131l\u0131nd\u0131.<\/li>\n<\/ol>\n<p><strong>Sonu\u00e7lar:<\/strong><\/p>\n<p>Ansible entegrasyonu sayesinde E-Ticaret Devrimi, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde devrim yaratt\u0131:<\/p>\n<ul>\n<li><strong>Da\u011f\u0131t\u0131m S\u00fcresi:<\/strong> Ortalama bir mikroservis da\u011f\u0131t\u0131m s\u00fcresi 1-2 saatten 5-10 dakikaya d\u00fc\u015ft\u00fc. Kritik g\u00fcncellemeler an\u0131nda \u00fcretim ortam\u0131na aktar\u0131labildi.<\/li>\n<li><strong>Hata Oran\u0131:<\/strong> Manuel hatalar neredeyse s\u0131f\u0131ra indi. Tutarl\u0131 ve tekrarlanabilir playbook'lar sayesinde \"benim makinemde \u00e7al\u0131\u015f\u0131yordu\" sorunlar\u0131 ortadan kalkt\u0131.<\/li>\n<li><strong>Kurtarma S\u00fcresi (MTTR):<\/strong> Bir sorun durumunda, \u00f6nceki kararl\u0131 s\u00fcr\u00fcme d\u00f6nmek (rollback) Ansible ile otomatik olarak yapabildi\u011finden, kurtarma s\u00fcreleri dramatik bir \u015fekilde azald\u0131.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Yeni sunucular\u0131n h\u0131zl\u0131ca provizyonlanmas\u0131 ve mevcut sunucular\u0131n g\u00fcncellenmesi i\u00e7in harcanan zaman \u00e7ok azald\u0131. Trafik art\u0131\u015flar\u0131nda an\u0131nda \u00f6l\u00e7eklendirme yapabilme yetene\u011fi kazand\u0131lar.<\/li>\n<li><strong>Ekip Verimlili\u011fi:<\/strong> Geli\u015ftiriciler ve operasyon ekipleri, tekrarlayan ve s\u0131k\u0131c\u0131 g\u00f6revlerden kurtulup daha stratejik i\u015flere odaklanabildiler.<\/li>\n<\/ul>\n<p>Bu vaka analizi, Ansible'\u0131n sadece k\u00fc\u00e7\u00fck uygulamalar i\u00e7in de\u011fil, ayn\u0131 zamanda en karma\u015f\u0131k ve b\u00fcy\u00fck \u00f6l\u00e7ekli kurumsal altyap\u0131lar i\u00e7in de vazge\u00e7ilmez bir otomasyon arac\u0131 oldu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Altyap\u0131lar\u0131n\u0131 kod olarak y\u00f6neterek, E-Ticaret Devrimi, operasyonel \u00e7evikli\u011fi art\u0131r\u0131rken maliyetleri d\u00fc\u015f\u00fcrd\u00fc ve m\u00fc\u015fteri memnuniyetini y\u00fckseltti.<\/p>\n<h2>Sonu\u00e7 ve Gelecek Ad\u0131mlar: Ansible ile Zaman Kazanmaya Ba\u015flay\u0131n<\/h2>\n<p>Bu makalede, Ansible'\u0131n ne oldu\u011funu, neden \u00f6nemli oldu\u011funu ve bir web uygulamas\u0131n\u0131 sadece 10 dakika i\u00e7inde nas\u0131l da\u011f\u0131tabilece\u011finizi detayl\u0131 bir \u015fekilde inceledik. Geleneksel, manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin getirdi\u011fi zorluklar\u0131 a\u015fmak i\u00e7in Ansible'\u0131n otomasyon g\u00fcc\u00fcnden yararland\u0131k. Kurulumundan temel playbook yaz\u0131m\u0131na, ger\u00e7ek bir web uygulamas\u0131 da\u011f\u0131t\u0131m senaryosundan ileri d\u00fczey konular olan Ansible Vault ve Rollerin kullan\u0131m\u0131na kadar geni\u015f bir yelpazede bilgi edindik. Son olarak, b\u00fcy\u00fck \u00f6l\u00e7ekli bir e-ticaret \u015firketinin Ansible ile nas\u0131l d\u00f6n\u00fc\u015f\u00fcm ya\u015fad\u0131\u011f\u0131n\u0131 bir vaka analiziyle peki\u015ftirdik.<\/p>\n<p>Ansible, \u00f6zellikle zaman k\u0131s\u0131tl\u0131 ve hata pay\u0131n\u0131n d\u00fc\u015f\u00fck olmas\u0131 gereken modern DevOps d\u00fcnyas\u0131nda paha bi\u00e7ilmez bir ara\u00e7t\u0131r. Altyap\u0131y\u0131 kod olarak y\u00f6netme (Infrastructure as Code) felsefesini benimseyerek, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi h\u0131zland\u0131rabilir, tutarl\u0131l\u0131\u011f\u0131 art\u0131rabilir ve insan hatas\u0131n\u0131 minimize edebilirsiniz. Ba\u015flang\u0131\u00e7ta 10 dakikal\u0131k da\u011f\u0131t\u0131m hedefi iddial\u0131 g\u00f6r\u00fcnse de, do\u011fru yap\u0131land\u0131r\u0131lm\u0131\u015f bir Ansible playbook'u ile bu hedefin ne kadar ger\u00e7ek\u00e7i oldu\u011funu g\u00f6rd\u00fck. Art\u0131k, s\u0131k\u0131c\u0131 ve tekrarlayan g\u00f6revlere elveda deme ve de\u011ferli zaman\u0131n\u0131z\u0131 daha yarat\u0131c\u0131 ve stratejik i\u015flere harcama zaman\u0131.<\/p>\n<p>Gelecek ad\u0131mlar\u0131n\u0131z i\u00e7in, Ansible belgelerini daha derinlemesine incelemenizi, farkl\u0131 mod\u00fclleri ke\u015ffetmenizi ve kendi projelerinizde denemeler yapman\u0131z\u0131 \u00f6neririm. Unutmay\u0131n, pratik yapmak en iyi \u00f6\u011frenme y\u00f6ntemidir. Ansible toplulu\u011fu olduk\u00e7a aktif ve geni\u015f, bu da tak\u0131ld\u0131\u011f\u0131n\u0131z her noktada yard\u0131m bulabilece\u011finiz anlam\u0131na geliyor. Da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizde otomasyon devrimini ba\u015flat\u0131n ve projelerinizi bir \u00fcst seviyeye ta\u015f\u0131y\u0131n!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>Ansible'\u0131n alternatifleri nelerdir?<\/dt>\n<dd>Ansible'\u0131n ba\u015fl\u0131ca alternatifleri aras\u0131nda Chef, Puppet, SaltStack ve Terraform (altyap\u0131 provizyonu i\u00e7in) bulunmaktad\u0131r. Her birinin farkl\u0131 felsefeleri ve kullan\u0131m senaryolar\u0131 vard\u0131r. Ansible, arac\u0131s\u0131z yap\u0131s\u0131 ve basit YAML tabanl\u0131 syntax'\u0131 nedeniyle genellikle ba\u015flang\u0131\u00e7 dostu olarak kabul edilir.<\/dd>\n<dt>Ansible'\u0131 \u00f6\u011frenmek zor mu?<\/dt>\n<dd>Hay\u0131r, Ansible \u00f6\u011frenmesi olduk\u00e7a kolay bir otomasyon arac\u0131d\u0131r. Di\u011fer baz\u0131 yap\u0131land\u0131rma y\u00f6netimi ara\u00e7lar\u0131na g\u00f6re daha az \"boilerplate\" kodu gerektirir ve Python bilginiz olmasa bile YAML'\u0131n basit yap\u0131s\u0131 sayesinde h\u0131zla playbook yazmaya ba\u015flayabilirsiniz. Temel Linux ve SSH bilgisi yeterlidir.<\/dd>\n<dt>Ansible ile sadece web uygulamalar\u0131 m\u0131 da\u011f\u0131t\u0131l\u0131r?<\/dt>\n<dd>Kesinlikle hay\u0131r. Ansible \u00e7ok y\u00f6nl\u00fcd\u00fcr ve web uygulamas\u0131 da\u011f\u0131t\u0131m\u0131n\u0131n \u00f6tesinde bir\u00e7ok farkl\u0131 g\u00f6revi otomatize etmek i\u00e7in kullan\u0131labilir. Sunucu provizyonu, i\u015fletim sistemi yap\u0131land\u0131rmas\u0131, veritaban\u0131 kurulumu, a\u011f cihaz\u0131 y\u00f6netimi, g\u00fcvenlik yamalar\u0131 uygulama ve bulut kaynaklar\u0131n\u0131 y\u00f6netme gibi bir\u00e7ok alanda etkilidir.<\/dd>\n<dt>10 dakika hedefi ger\u00e7ek\u00e7i mi?<\/dt>\n<dd>Evet, gayet ger\u00e7ek\u00e7idir. Tabii ki, bu s\u00fcre internet ba\u011flant\u0131 h\u0131z\u0131n\u0131za, sunucunuzun performans\u0131na ve uygulaman\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131na ba\u011fl\u0131 olarak de\u011fi\u015febilir. Ancak, bir kez playbook'lar\u0131n\u0131z\u0131 geli\u015ftirdikten ve optimize ettikten sonra, \u00e7o\u011fu k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli web uygulamas\u0131n\u0131 bu s\u00fcre i\u00e7inde veya daha k\u0131sa s\u00fcrede da\u011f\u0131tabilirsiniz.<\/dd>\n<dt>Ansible Vault ne zaman kullan\u0131lmal\u0131?<\/dt>\n<dd>Ansible Vault, veritaban\u0131 \u015fifreleri, API anahtarlar\u0131, SSH \u00f6zel anahtarlar\u0131, bulut kimlik bilgileri gibi t\u00fcm hassas verilerinizi saklaman\u0131z gerekti\u011finde kullan\u0131lmal\u0131d\u0131r. Bu verilerin a\u00e7\u0131k metin olarak kod taban\u0131n\u0131zda veya s\u00fcr\u00fcm kontrol sisteminizde bulunmas\u0131n\u0131 engeller, b\u00f6ylece g\u00fcvenlik risklerini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/dd>\n<\/dl>\n<div class=\"expert-tip\">\n        Mobil Uyumluluk \u0130pu\u00e7lar\u0131: Ansible, sunucu yap\u0131land\u0131rmas\u0131n\u0131 y\u00f6netirken, web uygulaman\u0131z\u0131n mobil uyumlu olmas\u0131n\u0131 do\u011frudan sa\u011flamaz. Ancak, Nginx yap\u0131land\u0131rma \u015fablonlar\u0131n\u0131 (<code>nginx.conf.j2<\/code>) kullanarak, \u00f6rne\u011fin, mobil cihazlara \u00f6zel \u00f6nbellekleme kurallar\u0131 ekleyebilir veya belirli kaynaklar\u0131n da\u011f\u0131t\u0131m\u0131n\u0131 optimize edebilirsiniz. Web uygulaman\u0131z\u0131n kendisi i\u00e7in mobil uyumlu tasar\u0131m, HTML ve CSS taraf\u0131nda (\u00f6rne\u011fin, a\u015fa\u011f\u0131daki gibi bir media query ile) ele al\u0131nmal\u0131d\u0131r:<\/p>\n<pre><code class=\"language-css\">\n\/* style.css veya inline stil *\/\n@media screen and (max-width: 768px) {\n    .container {\n        width: 100%;\n        padding: 10px;\n    }\n    .navigation {\n        flex-direction: column;\n    }\n}\n<\/pre>\n<p><\/code>\n    <\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Web uygulamas\u0131 da\u011f\u0131t\u0131mlar\u0131, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in \u00e7o\u011fu zaman karma\u015f\u0131k, zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7&hellip;","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-35692","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 ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi<\/title>\n<meta name=\"description\" content=\"Web uygulamas\u0131 da\u011f\u0131t\u0131mlar\u0131, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in \u00e7o\u011fu zaman karma\u015f\u0131k, zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Peki ya bu s\u00fcre\u00e7, dakikalar i\u00e7inde, g\u00fcvenilir ve tekrarlanabilir bir \u015fekilde otomatize edilebilseydi? Bu makalede, g\u00fc\u00e7l\u00fc otomasyon arac\u0131 Ansible&#039;\u0131 kullanarak bir web uygulamas\u0131n\u0131 nas\u0131l sadece 10 dakikada sorunsuz bir \u015fekilde da\u011f\u0131tabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Da\u011f\u0131t\u0131m kabuslar\u0131na veda etmeye haz\u0131r m\u0131s\u0131n\u0131z?\" \/>\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-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ansible ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Web uygulamas\u0131 da\u011f\u0131t\u0131mlar\u0131, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in \u00e7o\u011fu zaman karma\u015f\u0131k, zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Peki ya bu s\u00fcre\u00e7, dakikalar i\u00e7inde, g\u00fcvenilir ve tekrarlanabilir bir \u015fekilde otomatize edilebilseydi? Bu makalede, g\u00fc\u00e7l\u00fc otomasyon arac\u0131 Ansible&#039;\u0131 kullanarak bir web uygulamas\u0131n\u0131 nas\u0131l sadece 10 dakikada sorunsuz bir \u015fekilde da\u011f\u0131tabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Da\u011f\u0131t\u0131m kabuslar\u0131na veda etmeye haz\u0131r m\u0131s\u0131n\u0131z?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-02T17:01:07+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ansible ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi\",\"datePublished\":\"2025-12-02T17:01:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/\"},\"wordCount\":3844,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/\",\"name\":\"Ansible ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-02T17:01:07+00:00\",\"description\":\"Web uygulamas\u0131 da\u011f\u0131t\u0131mlar\u0131, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in \u00e7o\u011fu zaman karma\u015f\u0131k, zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Peki ya bu s\u00fcre\u00e7, dakikalar i\u00e7inde, g\u00fcvenilir ve tekrarlanabilir bir \u015fekilde otomatize edilebilseydi? Bu makalede, g\u00fc\u00e7l\u00fc otomasyon arac\u0131 Ansible'\u0131 kullanarak bir web uygulamas\u0131n\u0131 nas\u0131l sadece 10 dakikada sorunsuz bir \u015fekilde da\u011f\u0131tabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Da\u011f\u0131t\u0131m kabuslar\u0131na veda etmeye haz\u0131r m\u0131s\u0131n\u0131z?\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ansible ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi\"}]},{\"@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 ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi","description":"Web uygulamas\u0131 da\u011f\u0131t\u0131mlar\u0131, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in \u00e7o\u011fu zaman karma\u015f\u0131k, zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Peki ya bu s\u00fcre\u00e7, dakikalar i\u00e7inde, g\u00fcvenilir ve tekrarlanabilir bir \u015fekilde otomatize edilebilseydi? Bu makalede, g\u00fc\u00e7l\u00fc otomasyon arac\u0131 Ansible'\u0131 kullanarak bir web uygulamas\u0131n\u0131 nas\u0131l sadece 10 dakikada sorunsuz bir \u015fekilde da\u011f\u0131tabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Da\u011f\u0131t\u0131m kabuslar\u0131na veda etmeye haz\u0131r m\u0131s\u0131n\u0131z?","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-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Ansible ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi","og_description":"Web uygulamas\u0131 da\u011f\u0131t\u0131mlar\u0131, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in \u00e7o\u011fu zaman karma\u015f\u0131k, zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Peki ya bu s\u00fcre\u00e7, dakikalar i\u00e7inde, g\u00fcvenilir ve tekrarlanabilir bir \u015fekilde otomatize edilebilseydi? Bu makalede, g\u00fc\u00e7l\u00fc otomasyon arac\u0131 Ansible'\u0131 kullanarak bir web uygulamas\u0131n\u0131 nas\u0131l sadece 10 dakikada sorunsuz bir \u015fekilde da\u011f\u0131tabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Da\u011f\u0131t\u0131m kabuslar\u0131na veda etmeye haz\u0131r m\u0131s\u0131n\u0131z?","og_url":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-02T17:01:07+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ansible ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi","datePublished":"2025-12-02T17:01:07+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/"},"wordCount":3844,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/","name":"Ansible ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-02T17:01:07+00:00","description":"Web uygulamas\u0131 da\u011f\u0131t\u0131mlar\u0131, geli\u015ftiriciler ve operasyon ekipleri i\u00e7in \u00e7o\u011fu zaman karma\u015f\u0131k, zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7 olabilir. Peki ya bu s\u00fcre\u00e7, dakikalar i\u00e7inde, g\u00fcvenilir ve tekrarlanabilir bir \u015fekilde otomatize edilebilseydi? Bu makalede, g\u00fc\u00e7l\u00fc otomasyon arac\u0131 Ansible'\u0131 kullanarak bir web uygulamas\u0131n\u0131 nas\u0131l sadece 10 dakikada sorunsuz bir \u015fekilde da\u011f\u0131tabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Da\u011f\u0131t\u0131m kabuslar\u0131na veda etmeye haz\u0131r m\u0131s\u0131n\u0131z?","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-ile-web-uygulamasini-10-dakikada-dagitma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ansible ile Web Uygulamas\u0131n\u0131 10 Dakikada Da\u011f\u0131tma Rehberi"}]},{"@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\/35692","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=35692"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35692\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}