{"id":33369,"date":"2025-11-02T03:40:53","date_gmt":"2025-11-02T00:40:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33369"},"modified":"2025-11-02T03:40:53","modified_gmt":"2025-11-02T00:40:53","slug":"ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/","title":{"rendered":"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma"},"content":{"rendered":"<p><body><\/p>\n<h2>Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 geli\u015fen yaz\u0131l\u0131m d\u00fcnyas\u0131nda, uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve tekrarlanabilir bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik \u00f6neme sahiptir. Manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leri zaman al\u0131c\u0131, hataya a\u00e7\u0131k ve tutars\u0131z sonu\u00e7lar do\u011furabilirken, otomasyon ara\u00e7lar\u0131 bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler sunar. Bu teknik makale, a\u00e7\u0131k kaynakl\u0131 bir otomasyon motoru olan Ansible&#8217;\u0131 kullanarak temel bir PHP uygulamas\u0131n\u0131 Ubuntu 14.04 i\u015fletim sistemi y\u00fckl\u00fc bir sunucuya nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m a\u00e7\u0131klamaktad\u0131r.<\/p>\n<p>Ansible, SSH \u00fczerinden \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in arac\u0131 (agent) gerektirmeyen, basit ve g\u00fc\u00e7l\u00fc bir otomasyon arac\u0131d\u0131r. Yap\u0131land\u0131rma y\u00f6netimi, uygulama da\u011f\u0131t\u0131m\u0131, s\u00fcrekli da\u011f\u0131t\u0131m (CD) ve di\u011fer IT otomasyon g\u00f6revleri i\u00e7in kullan\u0131l\u0131r. Ubuntu 14.04, uzun s\u00fcredir desteklenen (LTS) bir s\u00fcr\u00fcm olup, bir\u00e7ok eski sistemde hala aktif olarak kullan\u0131lmaktad\u0131r. Bu makale, \u00f6zellikle bu eski ancak yayg\u0131n ortamda da\u011f\u0131t\u0131m yapma ihtiyac\u0131 olan geli\u015ftiriciler ve sistem y\u00f6neticileri i\u00e7in kapsaml\u0131 bir rehber niteli\u011findedir.<\/p>\n<p>Bu rehberde, bir kontrol makinesi (Ansible kurulu olan makine) ve bir veya daha fazla hedef makine (PHP uygulamas\u0131n\u0131n da\u011f\u0131t\u0131laca\u011f\u0131 Ubuntu 14.04 sunucular\u0131) kullanaca\u011f\u0131z. Amac\u0131m\u0131z, Nginx web sunucusu, PHP-FPM (FastCGI Process Manager) ve temel bir PHP uygulamas\u0131n\u0131 Ansible playbook&#8217;lar\u0131 ve rolleri arac\u0131l\u0131\u011f\u0131yla otomatik olarak kurmak ve yap\u0131land\u0131rmakt\u0131r. Makale boyunca, Ansible&#8217;\u0131n temel kavramlar\u0131n\u0131, proje yap\u0131s\u0131n\u0131, envanter y\u00f6netimini, playbook&#8217;lar\u0131, rolleri ve mod\u00fclleri detayl\u0131 bir \u015fekilde ele alaca\u011f\u0131z.<\/p>\n<h2>\u00d6n Gereksinimler<\/h2>\n<p>Bu da\u011f\u0131t\u0131m s\u00fcrecine ba\u015flamadan \u00f6nce belirli \u00f6n ko\u015fullar\u0131n yerine getirilmesi gerekmektedir. Bu gereksinimler, kontrol makinesi (Ansible&#8217;\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 makine) ve hedef makine (uygulaman\u0131n da\u011f\u0131t\u0131laca\u011f\u0131 sunucu) i\u00e7in ayr\u0131 ayr\u0131 ele al\u0131nm\u0131\u015ft\u0131r.<\/p>\n<h3>Kontrol Makinesi (Ansible Controller)<\/h3>\n<p>*   <strong>\u0130\u015fletim Sistemi:<\/strong> Tercihen Ubuntu (14.04 veya daha yeni bir s\u00fcr\u00fcm, zira Ansible kurulumu daha yeni s\u00fcr\u00fcmlerde daha kolayd\u0131r), macOS veya herhangi bir Linux da\u011f\u0131t\u0131m\u0131. Bu makale i\u00e7in Ubuntu baz al\u0131nacakt\u0131r.<br \/>\n*   <strong>Python:<\/strong> Ansible Python ile yaz\u0131ld\u0131\u011f\u0131 i\u00e7in sisteminizde Python 2.7 veya Python 3.x kurulu olmal\u0131d\u0131r. Ubuntu 14.04 varsay\u0131lan olarak Python 2.7 ile gelir.<br \/>\n*   <strong>Ansible:<\/strong> Kontrol makinesinde Ansible kurulu olmal\u0131d\u0131r. Kurulum ad\u0131mlar\u0131 sonraki b\u00f6l\u00fcmde detayland\u0131r\u0131lacakt\u0131r.<br \/>\n*   <strong>SSH Anahtar\u0131:<\/strong> Hedef makineye \u015fifresiz SSH eri\u015fimi sa\u011flamak i\u00e7in bir SSH anahtar \u00e7ifti (public\/private key) olu\u015fturulmu\u015f ve hedef makineye public key kopyalanm\u0131\u015f olmal\u0131d\u0131r. Bu, Ansible&#8217;\u0131n parola sormadan hedef makineye ba\u011flanabilmesi i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Hedef Makine (Target Host)<\/h3>\n<p>*   <strong>\u0130\u015fletim Sistemi:<\/strong> Ubuntu 14.04 sunucusu. Makineye SSH ile eri\u015filebilir olmal\u0131d\u0131r.<br \/>\n*   <strong>SSH Eri\u015fimi:<\/strong> Kontrol makinesinden hedef makineye SSH ile ba\u011flanabilmelisiniz.<br \/>\n*   <strong>Sudo Yetkileri:<\/strong> Ansible&#8217;\u0131n hedef makinede paket kurulumu ve sistem yap\u0131land\u0131rmas\u0131 gibi g\u00f6revleri ger\u00e7ekle\u015ftirebilmesi i\u00e7in, SSH ile ba\u011fland\u0131\u011f\u0131n\u0131z kullan\u0131c\u0131n\u0131n <code>sudo<\/code> yetkilerine sahip olmas\u0131 gerekmektedir.<br \/>\n*   <strong>Python:<\/strong> Ubuntu 14.04 varsay\u0131lan olarak Python 2.7 ile gelir. Ansible mod\u00fcllerinin \u00e7al\u0131\u015fmas\u0131 i\u00e7in bu gereklidir.<\/p>\n<h3>Temel PHP Uygulamas\u0131<\/h3>\n<p>Da\u011f\u0131t\u0131m\u0131 test etmek i\u00e7in basit bir PHP uygulamas\u0131na ihtiyac\u0131m\u0131z olacak. Bu makale i\u00e7in a\u015fa\u011f\u0131daki gibi bir yap\u0131ya sahip, <code>phpinfo()<\/code> \u00e7\u0131kt\u0131s\u0131 veren veya basit bir &#8220;Hello World&#8221; mesaj\u0131 g\u00f6steren bir uygulama kullanaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-\">app\/\n\u251c\u2500\u2500 public\/\n\u2502   \u2514\u2500\u2500 index.php\n\u2514\u2500\u2500 composer.json (iste\u011fe ba\u011fl\u0131)<\/code><\/pre>\n<p><strong><code>app\/public\/index.php<\/code>:<\/strong><\/p>\n<pre><code class=\"language-php\"><?php\necho \"\";\necho \"<p>Merhaba D\u00fcnya! Bu, Ubuntu 14.04 \u00fczerinde \u00e7al\u0131\u015fan basit bir PHP uygulamas\u0131d\u0131r.<\/p>\";\nphpinfo();\n?><\/code><\/pre>\n<p>Bu \u00f6n gereksinimler tamamland\u0131\u011f\u0131nda, Ansible kurulumuna ve da\u011f\u0131t\u0131m s\u00fcrecinin di\u011fer ad\u0131mlar\u0131na ge\u00e7meye haz\u0131r\u0131z.<\/p>\n<h2>Ansible Kurulumu ve SSH Yap\u0131land\u0131rmas\u0131<\/h2>\n<p>Ansible&#8217;\u0131 kontrol makinesine kurmak ve hedef makine ile g\u00fcvenli bir ileti\u015fim kurmak, da\u011f\u0131t\u0131m s\u00fcrecinin ilk ve en \u00f6nemli ad\u0131m\u0131d\u0131r.<\/p>\n<h3>Kontrol Makinesinde Ansible Kurulumu<\/h3>\n<p>Ubuntu 14.04 \u00fczerinde Ansible kurmak i\u00e7in genellikle PPA (Personal Package Archive) kullan\u0131l\u0131r.<\/p>\n<p>1.  <strong>Sistem Paket Listesini G\u00fcncelleme:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt-get update<\/code><\/pre>\n<p>2.  <strong>Yaz\u0131l\u0131m \u00d6zellikleri Ortak Paketini Kurma (Gerekliyse):<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt-get install software-properties-common<\/code><\/pre>\n<p>3.  <strong>Ansible PPA&#8217;s\u0131n\u0131 Ekleme:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt-add-repository ppa:ansible\/ansible<\/code><\/pre>\n<p>    Bu komut, Ansible paketlerinin bulundu\u011fu depoyu sisteminize ekler.<\/p>\n<p>4.  <strong>Paket Listesini Tekrar G\u00fcncelleme:<\/strong><br \/>\n    Yeni depo eklendikten sonra paket listesini tekrar g\u00fcncellemek \u00f6nemlidir.<\/p>\n<pre><code class=\"language-bash\">sudo apt-get update<\/code><\/pre>\n<p>5.  <strong>Ansible Kurulumu:<\/strong><br \/>\n    \u015eimdi Ansible&#8217;\u0131 kurabiliriz:<\/p>\n<pre><code class=\"language-bash\">sudo apt-get install ansible<\/code><\/pre>\n<p>6.  <strong>Kurulumu Do\u011frulama:<\/strong><br \/>\n    Kurulumun ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in Ansible versiyonunu sorgulayabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ansible --version<\/code><\/pre>\n<p>    \u00c7\u0131kt\u0131da Ansible versiyonu, Python versiyonu ve di\u011fer detaylar g\u00f6r\u00fcnmelidir.<\/p>\n<h3>SSH Anahtar \u00c7ifti Olu\u015fturma ve Hedef Makineye Kopyalama<\/h3>\n<p>Ansible, hedef makinelere SSH \u00fczerinden ba\u011flan\u0131r. G\u00fcvenli ve otomatik bir ba\u011flant\u0131 i\u00e7in parola yerine SSH anahtarlar\u0131 kullanmak en iyi y\u00f6ntemdir.<\/p>\n<p>1.  <strong>SSH Anahtar \u00c7ifti Olu\u015fturma (Kontrol Makinesinde):<\/strong><br \/>\n    E\u011fer hen\u00fcz bir SSH anahtar \u00e7iftiniz yoksa, a\u015fa\u011f\u0131daki komutla olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ssh-keygen -t rsa -b 4096<\/code><\/pre>\n<p>    Komut sizden anahtarlar\u0131 kaydedece\u011fi yeri ve bir parola (passphrase) isteyecektir. Genellikle varsay\u0131lan konum (<code>~\/.ssh\/id_rsa<\/code>) kabul edilir ve parola bo\u015f b\u0131rak\u0131labilir (otomatik ba\u011flant\u0131 i\u00e7in).<\/p>\n<p>2.  <strong>Public Anahtar\u0131 Hedef Makineye Kopyalama:<\/strong><br \/>\n    Olu\u015fturdu\u011funuz public anahtar\u0131 (<code>~\/.ssh\/id_rsa.pub<\/code>), <code>ssh-copy-id<\/code> arac\u0131yla hedef makineye kopyalayabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">ssh-copy-id kullan\u0131c\u0131_ad\u0131@hedef_ip_adresi<\/code><\/pre>\n<p>    \u00d6rne\u011fin: <code>ssh-copy-id deployuser@192.168.1.100<\/code><br \/>\n    Bu komut sizden hedef makinenin parolas\u0131n\u0131 isteyecek ve public anahtar\u0131n\u0131z\u0131 hedef makinedeki <code>~\/.ssh\/authorized_keys<\/code> dosyas\u0131na ekleyecektir.<\/p>\n<p>3.  <strong>SSH Ba\u011flant\u0131s\u0131n\u0131 Test Etme:<\/strong><br \/>\n    Public anahtar kopyaland\u0131ktan sonra, parola sormadan hedef makineye ba\u011flan\u0131p ba\u011flanamad\u0131\u011f\u0131n\u0131z\u0131 test edin:<\/p>\n<pre><code class=\"language-bash\">ssh kullan\u0131c\u0131_ad\u0131@hedef_ip_adresi<\/code><\/pre>\n<p>    E\u011fer parola sormadan do\u011frudan ba\u011flanabiliyorsan\u0131z, SSH yap\u0131land\u0131rmas\u0131 ba\u015far\u0131yla tamamlanm\u0131\u015ft\u0131r.<\/p>\n<h2>Proje Yap\u0131s\u0131 Olu\u015fturma<\/h2>\n<p>\u0130yi organize edilmi\u015f bir Ansible projesi, y\u00f6netilebilirli\u011fi ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131r. A\u015fa\u011f\u0131daki dizin yap\u0131s\u0131n\u0131 kontrol makinenizde olu\u015fturaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-\">ansible-php-deployment\/\n\u251c\u2500\u2500 ansible.cfg              # Ansible yap\u0131land\u0131rma dosyas\u0131\n\u251c\u2500\u2500 inventory.ini            # Hedef sunucular\u0131n listesi\n\u251c\u2500\u2500 playbook.yml             # Ana Ansible playbook\n\u251c\u2500\u2500 app\/                     # Da\u011f\u0131t\u0131lacak PHP uygulama dosyalar\u0131\n\u2502   \u2514\u2500\u2500 public\/\n\u2502       \u2514\u2500\u2500 index.php\n\u2514\u2500\u2500 roles\/                   # Ansible rolleri\n    \u251c\u2500\u2500 webserver\/           # Nginx kurulumu ve yap\u0131land\u0131rmas\u0131\n    \u2502   \u251c\u2500\u2500 tasks\/\n    \u2502   \u2502   \u2514\u2500\u2500 main.yml\n    \u2502   \u251c\u2500\u2500 handlers\/\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   \u2514\u2500\u2500 vars\/\n    \u2502       \u2514\u2500\u2500 main.yml\n    \u2514\u2500\u2500 php-app\/             # PHP ve PHP-FPM kurulumu, uygulama da\u011f\u0131t\u0131m\u0131\n        \u251c\u2500\u2500 tasks\/\n        \u2502   \u2514\u2500\u2500 main.yml\n        \u251c\u2500\u2500 handlers\/\n        \u2502   \u2514\u2500\u2500 main.yml\n        \u251c\u2500\u2500 templates\/\n        \u251c\u2500\u2500 files\/\n        \u2514\u2500\u2500 vars\/\n            \u2514\u2500\u2500 main.yml<\/code><\/pre>\n<p>Bu yap\u0131, her bir bile\u015fenin (web sunucusu, PHP uygulamas\u0131) kendi sorumluluklar\u0131n\u0131 ayr\u0131 rollerde tutarak mod\u00fclerli\u011fi sa\u011flar.<\/p>\n<h2>Ansible Yap\u0131land\u0131rma Dosyalar\u0131<\/h2>\n<p>Ansible&#8217;\u0131n nas\u0131l davranaca\u011f\u0131n\u0131 belirleyen baz\u0131 temel yap\u0131land\u0131rma dosyalar\u0131 vard\u0131r.<\/p>\n<h3><code>ansible.cfg<\/code><\/h3>\n<p>Bu dosya, Ansible&#8217;\u0131n \u00e7al\u0131\u015fma zaman\u0131 davran\u0131\u015f\u0131n\u0131 kontrol eder. Proje k\u00f6k dizinine yerle\u015ftirilmesi, bu proje i\u00e7in \u00f6zel ayarlar tan\u0131mlaman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-ini\"># ansible-php-deployment\/ansible.cfg\n[defaults]\ninventory = inventory.ini       # Envanter dosyam\u0131z\u0131n ad\u0131\nremote_user = deployuser        # Hedef makineye ba\u011flanmak i\u00e7in kullan\u0131lacak SSH kullan\u0131c\u0131s\u0131\nask_become_pass = False         # Sudo parolas\u0131 sormay\u0131 kapat (e\u011fer sudoers ayarl\u0131ysa)\nhost_key_checking = False       # \u0130lk ba\u011flant\u0131da SSH anahtar kontrol\u00fcn\u00fc devre d\u0131\u015f\u0131 b\u0131rak (g\u00fcvenlik nedeniyle \u00fcretimde 'True' olmal\u0131)\nroles_path = .\/roles            # Rollerin nerede oldu\u011funu belirtir<\/code><\/pre>\n<p><code>remote_user<\/code> yerine kendi SSH kullan\u0131c\u0131 ad\u0131n\u0131z\u0131 yaz\u0131n. <code>ask_become_pass = False<\/code> ayar\u0131, e\u011fer <code>deployuser<\/code> kullan\u0131c\u0131s\u0131 <code>sudo NOPASSWD<\/code> ayar\u0131na sahipse parolay\u0131 sormay\u0131 engeller. G\u00fcvenlik nedeniyle <code>host_key_checking = False<\/code> ayar\u0131 sadece test ortamlar\u0131nda kullan\u0131lmal\u0131, \u00fcretimde <code>True<\/code> olarak b\u0131rak\u0131lmal\u0131 veya SSH <code>known_hosts<\/code> dosyas\u0131 d\u00fczg\u00fcn y\u00f6netilmelidir.<\/p>\n<h3><code>inventory.ini<\/code><\/h3>\n<p>Envanter dosyas\u0131, Ansible&#8217;\u0131n y\u00f6nete\u011fi hedef makineleri ve gruplar\u0131 tan\u0131mlar.<\/p>\n<pre><code class=\"language-ini\"># ansible-php-deployment\/inventory.ini\n[webservers]\nhedef_sunucu_ip_adresi ansible_host=hedef_sunucu_ip_adresi\n\n[all:vars]\nansible_python_interpreter=\/usr\/bin\/python<\/code><\/pre>\n<p><code>hedef_sunucu_ip_adresi<\/code> yerine ger\u00e7ek IP adresinizi veya hostname&#8217;inizi yaz\u0131n. \u00d6rne\u011fin: <code>192.168.1.100 ansible_host=192.168.1.100<\/code>.<br \/>\n<code>[all:vars]<\/code> alt\u0131ndaki <code>ansible_python_interpreter<\/code> de\u011fi\u015fkeni \u00e7ok \u00f6nemlidir. Ubuntu 14.04 varsay\u0131lan olarak <code>\/usr\/bin\/python<\/code> (Python 2.7) kullan\u0131r ve baz\u0131 Ansible mod\u00fclleri i\u00e7in bu yorumlay\u0131c\u0131n\u0131n do\u011fru bir \u015fekilde belirtilmesi gerekebilir.<\/p>\n<h2>Ansible Roller Olu\u015fturma<\/h2>\n<p>Roller, Ansible&#8217;da g\u00f6revleri, de\u011fi\u015fkenleri, \u015fablonlar\u0131 ve i\u015fleyicileri d\u00fczenli bir \u015fekilde gruplamak i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir yap\u0131d\u0131r. Her rol, belirli bir amaca hizmet eder.<\/p>\n<h3><code>webserver<\/code> Rol\u00fc<\/h3>\n<p>Bu rol Nginx web sunucusunu kuracak ve yap\u0131land\u0131racakt\u0131r.<\/p>\n<h4><code>roles\/webserver\/tasks\/main.yml<\/code><\/h4>\n<pre><code class=\"language-yaml\"># roles\/webserver\/tasks\/main.yml\n---\n- name: Sistem paketlerini g\u00fcncelle\n  apt:\n    update_cache: yes\n    force_apt_get: yes # Ubuntu 14.04'te apt mod\u00fcl\u00fc i\u00e7in gerekli olabilir\n  become: yes\n\n- name: Nginx paketini kur\n  apt:\n    name: nginx\n    state: present\n  become: yes\n\n- name: Nginx varsay\u0131lan yap\u0131land\u0131rma dosyas\u0131n\u0131 kopyala\n  template:\n    src: nginx.conf.j2\n    dest: \/etc\/nginx\/sites-available\/default\n    owner: root\n    group: root\n    mode: '0644'\n  become: yes\n  notify: restart nginx\n\n- name: Nginx sites-enabled dizininde sembolik link olu\u015ftur\n  file:\n    src: \/etc\/nginx\/sites-available\/default\n    dest: \/etc\/nginx\/sites-enabled\/default\n    state: link\n  become: yes\n  notify: restart nginx\n\n- name: UFW firewall'da Nginx HTTP trafi\u011fine izin ver\n  ufw:\n    rule: allow\n    name: 'Nginx HTTP'\n  become: yes\n  ignore_errors: yes # UFW kurulu olmayabilir, hata vermesin<\/code><\/pre>\n<h4><code>roles\/webserver\/templates\/nginx.conf.j2<\/code><\/h4>\n<p>Bu \u015fablon, Nginx&#8217;in PHP-FPM ile nas\u0131l etkile\u015fime girece\u011fini belirler. Uygulama k\u00f6k dizini i\u00e7in <code>app_root<\/code> ve <code>app_name<\/code> de\u011fi\u015fkenlerini kullanaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-nginx\"># roles\/webserver\/templates\/nginx.conf.j2\nserver {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n\n    root {{ app_root }}\/{{ app_name }}\/public;\n    index index.php index.html index.htm;\n\n    server_name _; # Sunucu IP'si veya domain ad\u0131 buraya gelebilir\n\n    location \/ {\n        try_files $uri $uri\/ \/index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        include snippets\/fastcgi-php.conf;\n        fastcgi_pass unix:\/var\/run\/php5-fpm.sock;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        include fastcgi_params;\n    }\n\n    # Deny access to .htaccess files, if Apache's document root\n    # concurs with nginx's one\n    location ~ \/\\.ht {\n        deny all;\n    }\n}<\/code><\/pre>\n<h4><code>roles\/webserver\/handlers\/main.yml<\/code><\/h4>\n<p>\u0130\u015fleyiciler (handlers), bir g\u00f6rev taraf\u0131ndan tetiklenen eylemlerdir (\u00f6rne\u011fin, bir yap\u0131land\u0131rma dosyas\u0131 de\u011fi\u015fti\u011finde bir servisi yeniden ba\u015flatmak).<\/p>\n<pre><code class=\"language-yaml\"># roles\/webserver\/handlers\/main.yml\n---\n- name: restart nginx\n  service:\n    name: nginx\n    state: restarted\n  become: yes<\/code><\/pre>\n<h3><code>php-app<\/code> Rol\u00fc<\/h3>\n<p>Bu rol PHP ve PHP-FPM&#8217;i kuracak, uygulama dosyalar\u0131n\u0131 hedef makineye kopyalayacak ve PHP-FPM&#8217;i yap\u0131land\u0131racakt\u0131r.<\/p>\n<h4><code>roles\/php-app\/tasks\/main.yml<\/code><\/h4>\n<pre><code class=\"language-yaml\"># roles\/php-app\/tasks\/main.yml\n---\n- name: PHP ve gerekli mod\u00fclleri kur\n  apt:\n    name: \"{{ item }}\"\n    state: present\n  become: yes\n  loop:\n    - php5-fpm\n    - php5-cli\n    - php5-mysql\n    - php5-gd\n    - php5-curl\n    - php5-json # Modern uygulamalar i\u00e7in \u00f6nemlidir\n  notify: restart php5-fpm\n\n- name: Uygulama k\u00f6k dizinini olu\u015ftur\n  file:\n    path: \"{{ app_root }}\/{{ app_name }}\"\n    state: directory\n    owner: www-data\n    group: www-data\n    mode: '0755'\n  become: yes\n\n- name: Uygulama dosyalar\u0131n\u0131 kopyala\n  copy:\n    src: ..\/..\/app\/\n    dest: \"{{ app_root }}\/{{ app_name }}\"\n    owner: www-data\n    group: www-data\n    mode: '0755'\n  become: yes\n\n- name: PHP-FPM yap\u0131land\u0131rmas\u0131n\u0131 ayarla (iste\u011fe ba\u011fl\u0131, performans i\u00e7in)\n  lineinfile:\n    path: \/etc\/php5\/fpm\/php.ini\n    regexp: '^;cgi.fix_pathinfo='\n    line: 'cgi.fix_pathinfo=0'\n    state: present\n  become: yes\n  notify: restart php5-fpm\n\n- name: PHP-FPM pool yap\u0131land\u0131rmas\u0131n\u0131 ayarla (varsay\u0131lan)\n  lineinfile:\n    path: \/etc\/php5\/fpm\/pool.d\/www.conf\n    regexp: '^listen ='\n    line: 'listen = \/var\/run\/php5-fpm.sock'\n    state: present\n  become: yes\n  notify: restart php5-fpm<\/code><\/pre>\n<h4><code>roles\/php-app\/handlers\/main.yml<\/code><\/h4>\n<pre><code class=\"language-yaml\"># roles\/php-app\/handlers\/main.yml\n---\n- name: restart php5-fpm\n  service:\n    name: php5-fpm\n    state: restarted\n  become: yes<\/code><\/pre>\n<h4><code>roles\/php-app\/vars\/main.yml<\/code> (iste\u011fe ba\u011fl\u0131, playbook&#8217;tan da verilebilir)<\/h4>\n<pre><code class=\"language-yaml\"># roles\/php-app\/vars\/main.yml\n---\n<h2>app_name: my_php_app<\/h2>\n<h2>app_root: \/var\/www\/html<\/code><\/pre>\n<\/h2>\n<p>Bu de\u011fi\u015fkenleri ana playbook&#8217;ta tan\u0131mlamak daha merkezi bir y\u00f6netim sa\u011flar.<\/p>\n<h2>Ana Playbook Olu\u015fturma<\/h2>\n<p><code>playbook.yml<\/code> dosyas\u0131, tan\u0131mlad\u0131\u011f\u0131m\u0131z rolleri bir araya getirerek da\u011f\u0131t\u0131m s\u00fcrecini y\u00f6netir.<\/p>\n<pre><code class=\"language-yaml\"># ansible-php-deployment\/playbook.yml\n---\n- name: Temel PHP Uygulamas\u0131n\u0131 Da\u011f\u0131t\n  hosts: webservers # inventory.ini dosyas\u0131ndaki grup ad\u0131\n  become: yes       # T\u00fcm g\u00f6revleri sudo ile \u00e7al\u0131\u015ft\u0131r\n\n  vars:\n    app_name: my_php_app # Uygulama ad\u0131\n    app_root: \/var\/www\/html # Uygulaman\u0131n sunucudaki k\u00f6k dizini\n\n  pre_tasks:\n    - name: Sistem genelinde apt \u00f6nbelle\u011fini g\u00fcncelle\n      apt:\n        update_cache: yes\n        force_apt_get: yes\n      become: yes\n\n  roles:\n    - role: webserver\n    - role: php-app<\/code><\/pre>\n<p><code>pre_tasks<\/code> b\u00f6l\u00fcm\u00fc, roller \u00e7al\u0131\u015fmadan \u00f6nce genel sistem g\u00fcncellemesi gibi g\u00f6revleri \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. <code>vars<\/code> b\u00f6l\u00fcm\u00fcnde tan\u0131mlanan <code>app_name<\/code> ve <code>app_root<\/code> de\u011fi\u015fkenleri, Nginx ve PHP-App rolleri taraf\u0131ndan kullan\u0131lacakt\u0131r.<\/p>\n<h2>Temel PHP Uygulamas\u0131<\/h2>\n<p>Daha \u00f6nce bahsetti\u011fimiz gibi, <code>app\/public\/index.php<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fi:<\/p>\n<pre><code class=\"language-php\"><?php\necho \"\";\necho \"<p>Merhaba D\u00fcnya! Bu, Ubuntu 14.04 \u00fczerinde \u00e7al\u0131\u015fan basit bir PHP uygulamas\u0131d\u0131r.<\/p>\";\nphpinfo();\n?><\/code><\/pre>\n<p>Bu dosyay\u0131 <code>ansible-php-deployment\/app\/public\/<\/code> dizinine yerle\u015ftirdi\u011finizden emin olun.<\/p>\n<h2>Da\u011f\u0131t\u0131m \u0130\u015flemi<\/h2>\n<p>T\u00fcm dosyalar\u0131 olu\u015fturduktan ve d\u00fczenledikten sonra, da\u011f\u0131t\u0131m i\u015flemini ba\u015flatmaya haz\u0131r\u0131z. Kontrol makinenizin terminalinde, <code>ansible-php-deployment<\/code> dizinine gidin ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">ansible-playbook -i inventory.ini playbook.yml<\/code><\/pre>\n<p>*   <code>-i inventory.ini<\/code>: Ansible&#8217;a hangi envanter dosyas\u0131n\u0131 kullanaca\u011f\u0131n\u0131 s\u00f6yler.<br \/>\n*   <code>playbook.yml<\/code>: \u00c7al\u0131\u015ft\u0131r\u0131lacak ana playbook dosyas\u0131n\u0131 belirtir.<\/p>\n<p>Komut \u00e7al\u0131\u015fmaya ba\u015flad\u0131\u011f\u0131nda, Ansible hedef makineye SSH \u00fczerinden ba\u011flanacak, <code>webserver<\/code> rol\u00fcndeki g\u00f6revleri \u00e7al\u0131\u015ft\u0131racak (Nginx kurulumu, yap\u0131land\u0131rma), ard\u0131ndan <code>php-app<\/code> rol\u00fcndeki g\u00f6revleri \u00e7al\u0131\u015ft\u0131racak (PHP\/PHP-FPM kurulumu, uygulama dosyalar\u0131n\u0131 kopyalama). G\u00f6revler tamamland\u0131\u011f\u0131nda, Nginx ve PHP-FPM servisleri yeniden ba\u015flat\u0131lacak ve uygulama haz\u0131r hale gelecektir.<\/p>\n<p><strong>\u00c7\u0131kt\u0131 Kontrol\u00fc:<\/strong><br \/>\nAnsible playbook&#8217;u \u00e7al\u0131\u015f\u0131rken, her bir g\u00f6revin durumunu g\u00f6steren renkli \u00e7\u0131kt\u0131lar g\u00f6receksiniz.<br \/>\n*   <code>ok=X<\/code>: Ba\u015far\u0131yla tamamlanan g\u00f6rev say\u0131s\u0131.<br \/>\n*   <code>changed=Y<\/code>: Hedef makinede de\u011fi\u015fiklik yapan g\u00f6rev say\u0131s\u0131.<br \/>\n*   <code>unreachable=Z<\/code>: Ula\u015f\u0131lamayan hedef makine say\u0131s\u0131.<br \/>\n*   <code>failed=W<\/code>: Ba\u015far\u0131s\u0131z olan g\u00f6rev say\u0131s\u0131.<\/p>\n<p>E\u011fer \u00e7\u0131kt\u0131 <code>failed=0<\/code> ve <code>unreachable=0<\/code> g\u00f6steriyorsa, da\u011f\u0131t\u0131m\u0131n\u0131z b\u00fcy\u00fck olas\u0131l\u0131kla ba\u015far\u0131l\u0131 olmu\u015ftur.<\/p>\n<p><strong>Da\u011f\u0131t\u0131m\u0131 Do\u011frulama:<\/strong><br \/>\nDa\u011f\u0131t\u0131m tamamland\u0131ktan sonra, bir web taray\u0131c\u0131s\u0131 a\u00e7\u0131n ve hedef sunucunun IP adresini (veya alan ad\u0131n\u0131) girin:<\/p>\n<p><code>http:\/\/hedef_sunucu_ip_adresi<\/code><\/p>\n<p>E\u011fer her \u015fey do\u011fru yap\u0131land\u0131r\u0131ld\u0131ysa, <code>index.php<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fini, yani &#8220;Ansible ile Da\u011f\u0131t\u0131lan PHP Uygulamas\u0131&#8221; ba\u015fl\u0131\u011f\u0131n\u0131 ve <code>phpinfo()<\/code> \u00e7\u0131kt\u0131s\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h2>Ek Konular ve \u0130yile\u015ftirmeler<\/h2>\n<p>Bu temel da\u011f\u0131t\u0131m, Ansible ile PHP uygulamas\u0131 da\u011f\u0131t\u0131m\u0131n\u0131n sadece ba\u015flang\u0131c\u0131d\u0131r. Ger\u00e7ek d\u00fcnya senaryolar\u0131 i\u00e7in bir\u00e7ok iyile\u015ftirme ve ek konu bulunmaktad\u0131r.<\/p>\n<h3>Veritaban\u0131 Entegrasyonu<\/h3>\n<p>\u00c7o\u011fu PHP uygulamas\u0131 bir veritaban\u0131na ihtiya\u00e7 duyar (MySQL, PostgreSQL vb.). Ansible ile veritaban\u0131 sunucusunu kurabilir, veritaban\u0131 olu\u015fturabilir, kullan\u0131c\u0131lar\u0131 yap\u0131land\u0131rabilir ve uygulama i\u00e7in gerekli \u015femalar\u0131 da\u011f\u0131tabilirsiniz. Bu, ayr\u0131 bir Ansible rol\u00fc olarak ele al\u0131nabilir. \u00d6rne\u011fin, <code>mysql<\/code> rol\u00fc, MySQL sunucusunu kurar ve yap\u0131land\u0131r\u0131r; <code>database<\/code> rol\u00fc, belirli bir uygulama i\u00e7in veritaban\u0131 ve kullan\u0131c\u0131 olu\u015fturur.<\/p>\n<h3>G\u00fcvenlik<\/h3>\n<p>*   <strong>Firewall Kurulumu:<\/strong> UFW (Uncomplicated Firewall) veya iptables gibi bir g\u00fcvenlik duvar\u0131 kullanarak yaln\u0131zca gerekli portlara (HTTP\/HTTPS, SSH) eri\u015fime izin vermek \u00f6nemlidir. <code>ufw<\/code> mod\u00fcl\u00fc ile bu kolayca yap\u0131labilir.<br \/>\n*   <strong>SSH Anahtarlar\u0131:<\/strong> SSH anahtarlar\u0131n\u0131z\u0131 g\u00fcvenli bir \u015fekilde saklay\u0131n ve parola kullanmaktan ka\u00e7\u0131n\u0131n.<br \/>\n*   <strong>Sudoers Yap\u0131land\u0131rmas\u0131:<\/strong> <code>deployuser<\/code> gibi Ansible&#8217;\u0131n kulland\u0131\u011f\u0131 kullan\u0131c\u0131n\u0131n sadece belirli komutlar\u0131 <code>sudo<\/code> ile \u00e7al\u0131\u015ft\u0131rabilmesini sa\u011flamak, g\u00fcvenlik risklerini azalt\u0131r.<br \/>\n*   <strong>PHP G\u00fcvenli\u011fi:<\/strong> <code>php.ini<\/code> ayarlar\u0131n\u0131 g\u00fcvenlik en iyi uygulamalar\u0131na g\u00f6re yap\u0131land\u0131rmak (\u00f6rne\u011fin, <code>display_errors<\/code> kapatmak, <code>upload_max_filesize<\/code> s\u0131n\u0131rlamak).<\/p>\n<h3>Versiyon Kontrol\u00fc ve Uygulama Kaynak Kodunun \u00c7ekilmesi<\/h3>\n<p>Uygulama kaynak kodunu manuel olarak <code>copy<\/code> mod\u00fcl\u00fc ile kopyalamak yerine, <code>git<\/code> mod\u00fcl\u00fcn\u00fc kullanarak bir Git deposundan \u00e7ekmek daha iyi bir yakla\u015f\u0131md\u0131r. Bu, s\u00fcrekli entegrasyon\/s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) boru hatlar\u0131 i\u00e7in temel bir ad\u0131md\u0131r.<\/p>\n<pre><code class=\"language-yaml\">- name: Uygulama kaynak kodunu Git deposundan \u00e7ek\n  git:\n    repo: 'https:\/\/github.com\/kullanici\/php-app.git'\n    dest: \"{{ app_root }}\/{{ app_name }}\"\n    version: master # veya belirli bir branch\/tag\n    accept_hostkey: yes\n  become: yes<\/code><\/pre>\n<h3>Ortam De\u011fi\u015fkenleri ve Hassas Veri Y\u00f6netimi<\/h3>\n<p>Veritaban\u0131 kimlik bilgileri, API anahtarlar\u0131 gibi hassas veriler asla a\u00e7\u0131k metin olarak playbook&#8217;larda veya de\u011fi\u015fken dosyalar\u0131nda tutulmamal\u0131d\u0131r. Ansible Vault, bu t\u00fcr verileri \u015fifrelemek ve g\u00fcvenli bir \u015fekilde y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Uygulamalar i\u00e7in ortam de\u011fi\u015fkenlerini ayarlamak veya <code>.env<\/code> dosyalar\u0131 olu\u015fturmak i\u00e7in <code>template<\/code> veya <code>lineinfile<\/code> mod\u00fclleri kullan\u0131labilir.<\/p>\n<h3>Composer Ba\u011f\u0131ml\u0131l\u0131klar\u0131<\/h3>\n<p>E\u011fer PHP uygulaman\u0131z Composer kullan\u0131yorsa, uygulama dosyalar\u0131n\u0131 kopyalad\u0131ktan sonra <code>composer install<\/code> komutunu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>command<\/code> veya <code>shell<\/code> mod\u00fcllerini kullanman\u0131z gerekir:<\/p>\n<pre><code class=\"language-yaml\">- name: Composer ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckle\n  shell: composer install --no-dev --optimize-autoloader -d \"{{ app_root }}\/{{ app_name }}\"\n  args:\n    chdir: \"{{ app_root }}\/{{ app_name }}\"\n  become: yes\n  environment:\n    COMPOSER_ALLOW_SUPERUSER: \"1\" # E\u011fer www-data veya root ile \u00e7al\u0131\u015f\u0131yorsa gerekebilir<\/code><\/pre>\n<h3>CI\/CD Entegrasyonu<\/h3>\n<p>Ansible playbook&#8217;lar\u0131, Jenkins, GitLab CI, GitHub Actions gibi CI\/CD ara\u00e7lar\u0131yla entegre edilerek otomatik da\u011f\u0131t\u0131m boru hatlar\u0131 olu\u015fturman\u0131n temelini olu\u015fturur. Kodunuz bir depoya push edildi\u011finde, otomatik testler \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r ve ba\u015far\u0131l\u0131 olursa Ansible playbook&#8217;u otomatik olarak uygulamay\u0131 da\u011f\u0131t\u0131r.<\/p>\n<h3>Hata Ay\u0131klama<\/h3>\n<p>Ansible playbook&#8217;lar\u0131 \u00e7al\u0131\u015f\u0131rken sorunlarla kar\u015f\u0131la\u015f\u0131rsan\u0131z, <code>ansible-playbook -vvv playbook.yml<\/code> komutunu kullanarak daha detayl\u0131 \u00e7\u0131kt\u0131 alabilir ve sorunun kayna\u011f\u0131n\u0131 belirleyebilirsiniz. <code>debug<\/code> mod\u00fcl\u00fc de de\u011fi\u015fkenlerin veya komut \u00e7\u0131kt\u0131lar\u0131n\u0131n de\u011ferlerini g\u00f6rmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h3>\u0130dempotence (Tekrar \u00c7al\u0131\u015fabilirlik)<\/h3>\n<p>Ansible&#8217;\u0131n en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri idempotence&#8217;tir. Bu, bir playbook&#8217;u ka\u00e7 kez \u00e7al\u0131\u015ft\u0131r\u0131rsan\u0131z \u00e7al\u0131\u015ft\u0131r\u0131n, sistemin her zaman ayn\u0131 nihai duruma ula\u015faca\u011f\u0131 anlam\u0131na gelir. E\u011fer bir kaynak zaten istenen durumdaysa, Ansible herhangi bir de\u011fi\u015fiklik yapmaz. Bu, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin g\u00fcvenilirli\u011fini ve tutarl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<h3>Ubuntu 14.04 S\u0131n\u0131rlamalar\u0131<\/h3>\n<p>Ubuntu 14.04, PHP 5.x serisini kullan\u0131r ve modern PHP uygulamalar\u0131n\u0131n gerektirdi\u011fi baz\u0131 yeni \u00f6zelliklerden (PHP 7.x ve sonras\u0131) yoksundur. Ayr\u0131ca, paket depolar\u0131ndaki yaz\u0131l\u0131m versiyonlar\u0131 da eski olabilir. Bu nedenle, yeni projeler i\u00e7in daha g\u00fcncel bir i\u015fletim sistemi s\u00fcr\u00fcm\u00fcn\u00fc (\u00f6rne\u011fin Ubuntu 20.04 veya 22.04) tercih etmek, daha modern PHP versiyonlar\u0131na ve g\u00fcncel paketlere eri\u015fim sa\u011flamak a\u00e7\u0131s\u0131ndan daha avantajl\u0131 olacakt\u0131r. Ancak mevcut 14.04 ortamlar\u0131nda \u00e7al\u0131\u015fmak zorunda olanlar i\u00e7in bu makale, da\u011f\u0131t\u0131m otomasyonunu nas\u0131l yapacaklar\u0131n\u0131 g\u00f6stermektedir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, Ansible kullanarak temel bir PHP uygulamas\u0131n\u0131 Ubuntu 14.04 sunucusu \u00fczerine nas\u0131l otomatik olarak da\u011f\u0131tabilece\u011finizi ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceledik. Ansible&#8217;\u0131n kurulumundan, proje yap\u0131s\u0131n\u0131n olu\u015fturulmas\u0131na, envanter ve yap\u0131land\u0131rma dosyalar\u0131n\u0131n haz\u0131rlanmas\u0131na, Nginx ve PHP-FPM kurulumunu i\u00e7eren \u00f6zel rollerin geli\u015ftirilmesine ve son olarak uygulaman\u0131n da\u011f\u0131t\u0131m\u0131na kadar t\u00fcm ad\u0131mlar\u0131 ele ald\u0131k.<\/p>\n<p>Ansible, manuel ve hataya a\u00e7\u0131k da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini otomatikle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir ara\u00e7t\u0131r. Rollerin ve playbook&#8217;lar\u0131n mod\u00fcler yap\u0131s\u0131 sayesinde, karma\u015f\u0131k altyap\u0131lar\u0131n bile tutarl\u0131 ve tekrarlanabilir bir \u015fekilde y\u00f6netilmesi m\u00fcmk\u00fcn hale gelir. Bu rehber, Ansible&#8217;\u0131n temel yeteneklerini ve bir PHP uygulamas\u0131n\u0131 da\u011f\u0131tmak i\u00e7in nas\u0131l kullan\u0131labilece\u011fini g\u00f6stermekle birlikte, daha karma\u015f\u0131k ve \u00fcretim ortamlar\u0131na y\u00f6nelik da\u011f\u0131t\u0131mlar i\u00e7in ek konular ve iyile\u015ftirmeler i\u00e7in bir ba\u015flang\u0131\u00e7 noktas\u0131 sunmaktad\u0131r.<\/p>\n<p>Uygulama da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi otomatikle\u015ftirmek, geli\u015ftirme d\u00f6ng\u00fclerinizi h\u0131zland\u0131racak, hata oranlar\u0131n\u0131 d\u00fc\u015f\u00fcrecek ve operasyonel verimlili\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. Ansible, bu hedeflere ula\u015fmak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Bu makaledeki bilgileri kullanarak kendi da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi in\u015fa edebilir ve otomasyonun avantajlar\u0131ndan yararlanmaya ba\u015flayabilirsiniz.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma\nGiri\u015f\nG\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 geli\u015fen yaz\u0131l\u0131m d\u00fcnyas\u0131nda, uygula","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-33369","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>Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma\" \/>\n<meta property=\"og:description\" content=\"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 geli\u015fen yaz\u0131l\u0131m d\u00fcnyas\u0131nda, uygula\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-02T00:40:53+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma\",\"datePublished\":\"2025-11-02T00:40:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/\"},\"wordCount\":2472,\"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\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/\",\"name\":\"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-02T00:40:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma\"}]},{\"@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 Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/","og_locale":"tr_TR","og_type":"article","og_title":"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma","og_description":"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 geli\u015fen yaz\u0131l\u0131m d\u00fcnyas\u0131nda, uygula","og_url":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-02T00:40:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma","datePublished":"2025-11-02T00:40:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/"},"wordCount":2472,"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\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/","url":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/","name":"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-02T00:40:53+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-kullanarak-temel-bir-php-uygulamasini-ubuntu-14-04-uzerine-dagitma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ansible Kullanarak Temel Bir PHP Uygulamas\u0131n\u0131 Ubuntu 14.04 \u00dczerine Da\u011f\u0131tma"}]},{"@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\/33369","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=33369"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33369\/revisions"}],"predecessor-version":[{"id":33370,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33369\/revisions\/33370"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}