{"id":38394,"date":"2026-01-30T12:41:05","date_gmt":"2026-01-30T09:41:05","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38394"},"modified":"2026-01-30T12:41:05","modified_gmt":"2026-01-30T09:41:05","slug":"fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/","title":{"rendered":"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek"},"content":{"rendered":"<p><body><\/p>\n<h2>Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek<\/h2>\n<h3>Giri\u015f: Otomasyonun Y\u00fckseli\u015fi ve Fabric&#8217;in Rol\u00fc<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempolu yaz\u0131l\u0131m geli\u015ftirme ve operasyon d\u00fcnyas\u0131nda, manuel g\u00f6revler zaman kayb\u0131na, insan hatas\u0131na ve tutars\u0131zl\u0131\u011fa yol a\u00e7abilmektedir. Sunucu yap\u0131land\u0131rmas\u0131ndan uygulama da\u011f\u0131t\u0131m\u0131na, g\u00fcnl\u00fck bak\u0131m i\u015flemlerinden acil durum m\u00fcdahalelerine kadar bir\u00e7ok alanda otomasyon, modern IT altyap\u0131lar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir. Otomasyon, s\u00fcre\u00e7leri h\u0131zland\u0131r\u0131r, tekrarlanabilirli\u011fi art\u0131r\u0131r, hatalar\u0131 minimize eder ve ekiplerin daha stratejik g\u00f6revlere odaklanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu ba\u011flamda, Python tabanl\u0131 bir otomasyon arac\u0131 olan Fabric, \u00f6zellikle SSH (Secure Shell) protokol\u00fc \u00fczerinden uzak sunucularda komut \u00e7al\u0131\u015ft\u0131rma ve dosya transferi gibi i\u015flemleri basitle\u015ftirerek \u00f6ne \u00e7\u0131kmaktad\u0131r. Fabric, geli\u015ftiricilerin ve sistem y\u00f6neticilerinin karma\u015f\u0131k y\u00f6netim g\u00f6revlerini ve uygulama da\u011f\u0131t\u0131mlar\u0131n\u0131 Python kodlar\u0131 arac\u0131l\u0131\u011f\u0131yla otomatikle\u015ftirmelerine olanak tan\u0131r. Basitli\u011fi, esnekli\u011fi ve Python&#8217;\u0131n g\u00fcc\u00fcn\u00fc birle\u015ftirmesi sayesinde, Fabric, k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projelerden daha b\u00fcy\u00fck altyap\u0131lara kadar geni\u015f bir kullan\u0131m alan\u0131na sahiptir. Bu makalede, Fabric&#8217;in ne oldu\u011funu, nas\u0131l kuruldu\u011funu, temel kavramlar\u0131n\u0131, y\u00f6netim g\u00f6revlerini ve uygulama da\u011f\u0131t\u0131mlar\u0131n\u0131 otomatikle\u015ftirmek i\u00e7in nas\u0131l kullan\u0131labilece\u011fini detayl\u0131 \u00f6rneklerle inceleyece\u011fiz. Ayr\u0131ca, ileri d\u00fczey kullan\u0131m senaryolar\u0131na, en iyi uygulamalara ve alternatif ara\u00e7larla kar\u015f\u0131la\u015ft\u0131rmas\u0131na da de\u011finece\u011fiz.<\/p>\n<h3>Fabric Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h3>\n<p>Fabric, uzak sunucularda SSH \u00fczerinden komut \u00e7al\u0131\u015ft\u0131rmak ve dosya transferi yapmak i\u00e7in tasarlanm\u0131\u015f, Python tabanl\u0131 bir k\u00fct\u00fcphanedir. Temel amac\u0131, sistem y\u00f6netimini ve uygulama da\u011f\u0131t\u0131m\u0131n\u0131 otomatikle\u015ftirmektir. Fabric&#8217;i di\u011fer otomasyon ara\u00e7lar\u0131ndan ay\u0131ran en \u00f6nemli \u00f6zelliklerden biri, tamamen Python ile yaz\u0131lm\u0131\u015f olmas\u0131 ve otomasyon g\u00f6revlerinin de Python kodlar\u0131 \u015feklinde tan\u0131mlanmas\u0131d\u0131r. Bu durum, Python ekosistemine a\u015fina olan geli\u015ftiriciler ve sistem y\u00f6neticileri i\u00e7in Fabric&#8217;i \u00f6\u011frenmeyi ve kullanmay\u0131 olduk\u00e7a kolayla\u015ft\u0131r\u0131r.<\/p>\n<p><strong>Fabric&#8217;in Temel \u00d6zellikleri:<\/strong><br \/>\n*   <strong>Python Tabanl\u0131:<\/strong> G\u00f6revler, standart Python fonksiyonlar\u0131 olarak tan\u0131mlan\u0131r. Bu, Python&#8217;\u0131n zengin k\u00fct\u00fcphane ekosisteminden faydalanma, karma\u015f\u0131k mant\u0131klar olu\u015fturma ve mevcut Python projeleriyle kolay entegrasyon imkan\u0131 sunar.<br \/>\n*   <strong>SSH Odakl\u0131:<\/strong> T\u00fcm ileti\u015fim SSH \u00fczerinden ger\u00e7ekle\u015fir. Bu, g\u00fcvenli ve \u015fifreli bir ba\u011flant\u0131 sa\u011flayarak uzak sunucu y\u00f6netimini g\u00fcvenli hale getirir.<br \/>\n*   <strong>Basit ve Esnek:<\/strong> Fabric&#8217;in API&#8217;si olduk\u00e7a sezgiseldir. <code>run()<\/code> ile uzak komut \u00e7al\u0131\u015ft\u0131rma, <code>put()<\/code> ile dosya y\u00fckleme gibi temel i\u015flemler birka\u00e7 sat\u0131r kodla ger\u00e7ekle\u015ftirilebilir. Esnek yap\u0131s\u0131 sayesinde, \u00f6zel ihtiya\u00e7lara g\u00f6re uyarlanabilir ve geni\u015fletilebilir.<br \/>\n*   <strong>Paralel Y\u00fcr\u00fctme:<\/strong> Birden fazla sunucuda ayn\u0131 anda g\u00f6revleri \u00e7al\u0131\u015ft\u0131rma yetene\u011fi, b\u00fcy\u00fck \u00f6l\u00e7ekli altyap\u0131larda zaman tasarrufu sa\u011flar.<br \/>\n*   <strong>Ortam Y\u00f6netimi:<\/strong> Farkl\u0131 sunucu gruplar\u0131 (geli\u015ftirme, test, \u00fcretim) i\u00e7in ayr\u0131 yap\u0131land\u0131rmalar tan\u0131mlama imkan\u0131 sunar.<\/p>\n<p><strong>Neden Fabric Kullanmal\u0131y\u0131z?<\/strong><br \/>\n1.  <strong>Tutarl\u0131l\u0131k ve Tekrarlanabilirlik:<\/strong> Manuel i\u015flemler hataya a\u00e7\u0131kt\u0131r. Fabric ile tan\u0131mlanan g\u00f6revler her zaman ayn\u0131 ad\u0131mlar\u0131 izler, bu da tutarl\u0131 sonu\u00e7lar ve tekrarlanabilir da\u011f\u0131t\u0131mlar sa\u011flar.<br \/>\n2.  <strong>H\u0131z:<\/strong> Onlarca sunucuda ayn\u0131 i\u015flemi manuel olarak yapmak saatler alabilirken, Fabric ile bu i\u015flem dakikalar i\u00e7inde tamamlanabilir.<br \/>\n3.  <strong>Hata Azaltma:<\/strong> \u0130nsan hatalar\u0131n\u0131 ortadan kald\u0131r\u0131r. Otomatikle\u015ftirilmi\u015f betikler, \u00f6nceden tan\u0131mlanm\u0131\u015f mant\u0131\u011fa g\u00f6re \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in unutulan ad\u0131mlar veya yanl\u0131\u015f girilen komutlar gibi sorunlar ya\u015fanmaz.<br \/>\n4.  <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Yeni sunucular\u0131n eklenmesi veya mevcut sunucularda de\u011fi\u015fiklik yap\u0131lmas\u0131 gerekti\u011finde, Fabric betikleri kolayca uyarlanabilir ve binlerce sunucuda \u00e7al\u0131\u015ft\u0131r\u0131labilir.<br \/>\n5.  <strong>Dok\u00fcmantasyon:<\/strong> Otomasyon betikleri, ayn\u0131 zamanda birer canl\u0131 dok\u00fcmand\u0131r. Bir projenin da\u011f\u0131t\u0131m veya sunucu yap\u0131land\u0131rma ad\u0131mlar\u0131, <code>fabfile.py<\/code> dosyas\u0131nda a\u00e7\u0131k\u00e7a g\u00f6r\u00fclebilir.<br \/>\n6.  <strong>Python Ekosistemiyle Entegrasyon:<\/strong> Python&#8217;\u0131n zengin k\u00fct\u00fcphane ve ara\u00e7 setiyle kolayca entegre olabilir. \u00d6rne\u011fin, bir veritaban\u0131 yede\u011fi al\u0131rken <code>psycopg2<\/code> veya <code>pymysql<\/code> gibi k\u00fct\u00fcphanelerle etkile\u015fim kurabilir, veya yap\u0131land\u0131rma dosyalar\u0131n\u0131 olu\u015fturmak i\u00e7in <code>Jinja2<\/code> gibi \u015fablon motorlar\u0131n\u0131 kullanabilirsiniz.<\/p>\n<h3>Kurulum ve \u0130lk Ad\u0131mlar<\/h3>\n<p>Fabric&#8217;i kullanmaya ba\u015flamak olduk\u00e7a basittir. Python&#8217;\u0131n paket y\u00f6neticisi <code>pip<\/code> arac\u0131l\u0131\u011f\u0131yla kolayca kurulabilir.<\/p>\n<p><strong>Kurulum:<\/strong><br \/>\n\u00d6ncelikle sisteminizde Python ve <code>pip<\/code> kurulu oldu\u011fundan emin olun. Ard\u0131ndan a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak Fabric&#8217;i kurabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">pip install fabric<\/code><\/pre>\n<p>Bu komut Fabric&#8217;in en son kararl\u0131 s\u00fcr\u00fcm\u00fcn\u00fc (Fabric 2.x) kuracakt\u0131r. Fabric 1.x ve 2.x aras\u0131nda \u00f6nemli API farkl\u0131l\u0131klar\u0131 bulunmaktad\u0131r. Bu makaledeki \u00f6rnekler Fabric 2.x&#8217;e g\u00f6re haz\u0131rlanm\u0131\u015ft\u0131r.<\/p>\n<p><strong>\u0130lk Fabric Dosyas\u0131: <code>fabfile.py<\/code><\/strong><br \/>\nFabric, otomasyon g\u00f6revlerini <code>fabfile.py<\/code> ad\u0131n\u0131 verdi\u011fimiz bir Python dosyas\u0131nda tan\u0131mlar. Bu dosya, Fabric&#8217;in \u00e7al\u0131\u015ft\u0131raca\u011f\u0131 t\u00fcm g\u00f6revleri ve yap\u0131land\u0131rmalar\u0131 i\u00e7erir.<br \/>\n\u015eimdi basit bir &#8220;Merhaba D\u00fcnya&#8221; g\u00f6revi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-python\"># fabfile.py\nfrom fabric import Connection, task\n\n@task\ndef hello(c):\n    \"\"\"\n    Uzak sunucuda 'Merhaba D\u00fcnya' yazd\u0131r\u0131r.\n    \"\"\"\n    c.run(\"echo 'Merhaba D\u00fcnya, Fabric!'\")\n    c.local(\"echo 'Bu yerel makinede \u00e7al\u0131\u015ft\u0131.'\")\n\n@task\ndef uptime(c):\n    \"\"\"\n    Uzak sunucunun \u00e7al\u0131\u015fma s\u00fcresini kontrol eder.\n    \"\"\"\n    c.run(\"uptime\")<\/code><\/pre>\n<p><strong>G\u00f6revi \u00c7al\u0131\u015ft\u0131rma:<\/strong><br \/>\n<code>fabfile.py<\/code> dosyas\u0131n\u0131 olu\u015fturduktan sonra, terminalinizde Fabric g\u00f6revlerini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>fab<\/code> komutunu kullanabilirsiniz.<\/p>\n<pre><code class=\"language-bash\"># Sadece yerel hello g\u00f6revini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in\nfab hello\n\n<h2>Uzak bir sunucuda hello g\u00f6revini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in<\/h2>\n<h2>-H parametresi ile ba\u011flan\u0131lacak sunucuyu belirtiriz.<\/h2>\n<h2>Kullan\u0131c\u0131 ad\u0131 ve \u015fifre veya SSH anahtar\u0131 ile kimlik do\u011frulamas\u0131 yap\u0131l\u0131r.<\/h2>\nfab -H user@your_remote_host hello\n\n<h2>uptime g\u00f6revini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in<\/h2>\nfab -H user@your_remote_host uptime<\/code><\/pre>\n<p><code>fab -H user@your_remote_host<\/code> komutu, <code>user<\/code> kullan\u0131c\u0131s\u0131yla <code>your_remote_host<\/code> adresine SSH ba\u011flant\u0131s\u0131 kurmaya \u00e7al\u0131\u015facakt\u0131r. E\u011fer SSH anahtarlar\u0131n\u0131z do\u011fru yap\u0131land\u0131r\u0131lm\u0131\u015fsa do\u011frudan ba\u011flan\u0131r, aksi takdirde \u015fifre sorabilir.<\/p>\n<h3>Temel Fabric Kavramlar\u0131 ve Komutlar\u0131<\/h3>\n<p>Fabric&#8217;in g\u00fcc\u00fc, uzak sunucularla etkile\u015fim kurmak i\u00e7in sa\u011flad\u0131\u011f\u0131 temel komut ve kavram setinde yatar.<\/p>\n<p><strong>1. Ba\u011flant\u0131 Y\u00f6netimi:<\/strong><br \/>\nFabric 2.x&#8217;te ba\u011flant\u0131lar <code>fabric.Connection<\/code> nesneleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir. Her g\u00f6reve otomatik olarak bir <code>Connection<\/code> nesnesi (<code>c<\/code>) parametre olarak iletilir. Bu nesne, uzak sunucuyla etkile\u015fim kurmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\">from fabric import Connection, task\n\n@task\ndef deploy(c):\n    # Ba\u011flant\u0131 parametreleri do\u011frudan fab komutuyla veya fabfile i\u00e7inde ayarlanabilir.\n    # \u00d6rne\u011fin: fab -H user@host -p password deploy\n    print(f\"Ba\u011flan\u0131lan sunucu: {c.host}, Kullan\u0131c\u0131: {c.user}\")\n    c.run(\"ls -la\")<\/code><\/pre>\n<p><code>fab<\/code> komutuyla <code>-H<\/code> (host), <code>-u<\/code> (user), <code>-p<\/code> (password) veya <code>-i<\/code> (identity file\/SSH anahtar\u0131) gibi parametreler kullanarak ba\u011flant\u0131 bilgilerini sa\u011flayabilirsiniz.<\/p>\n<p><strong>2. Komut \u00c7al\u0131\u015ft\u0131rma:<\/strong><br \/>\n<em>   <strong><code>c.run(command, <\/strong>kwargs)<\/code>:<\/em>* Uzak sunucuda bir komut \u00e7al\u0131\u015ft\u0131r\u0131r. Komutun \u00e7\u0131kt\u0131s\u0131 ve d\u00f6n\u00fc\u015f kodu yakalan\u0131r.<\/p>\n<pre><code class=\"language-python\">@task\n    def check_disk(c):\n        result = c.run(\"df -h\", hide=True) # hide=True \u00e7\u0131kt\u0131y\u0131 gizler, sadece result nesnesine kaydeder\n        print(f\"Disk kullan\u0131m\u0131: \\n{result.stdout}\")\n        if \"No space left on device\" in result.stderr:\n            print(\"UYARI: Disk alan\u0131 t\u00fckenmek \u00fczere!\")<\/code><\/pre>\n<p><em>   <strong><code>c.sudo(command, <\/strong>kwargs)<\/code>:<\/em>* Uzak sunucuda bir komutu <code>sudo<\/code> yetkisiyle \u00e7al\u0131\u015ft\u0131r\u0131r. Genellikle sistem d\u00fczeyindeki de\u011fi\u015fiklikler i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\">@task\n    def install_nginx(c):\n        c.sudo(\"apt update\")\n        c.sudo(\"apt install -y nginx\")\n        c.sudo(\"systemctl start nginx\")\n        c.sudo(\"systemctl enable nginx\")\n        print(\"Nginx ba\u015far\u0131yla kuruldu ve ba\u015flat\u0131ld\u0131.\")<\/code><\/pre>\n<p><em>   <strong><code>c.local(command, <\/strong>kwargs)<\/code>:<\/em>* Fabric&#8217;i \u00e7al\u0131\u015ft\u0131ran yerel makinede bir komut \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-python\">@task\n    def local_check(c):\n        c.local(\"echo 'Yerel dizin:'\")\n        c.local(\"pwd\")<\/code><\/pre>\n<p><strong>3. Dosya Transferi:<\/strong><br \/>\n<em>   <strong><code>c.put(local_path, remote_path, <\/strong>kwargs)<\/code>:<\/em>* Yerel makineden uzak sunucuya dosya y\u00fckler.<\/p>\n<pre><code class=\"language-python\">@task\n    def upload_config(c):\n        local_file = \"nginx.conf\"\n        remote_path = \"\/etc\/nginx\/sites-available\/default\"\n        c.put(local_file, remote_path)\n        c.sudo(\"systemctl reload nginx\")\n        print(f\"{local_file} dosyas\u0131 uzak sunucuya y\u00fcklendi ve Nginx yeniden y\u00fcklendi.\")<\/code><\/pre>\n<p><em>   <strong><code>c.get(remote_path, local_path, <\/strong>kwargs)<\/code>:<\/em>* Uzak sunucudan yerel makineye dosya indirir.<\/p>\n<pre><code class=\"language-python\">@task\n    def download_logs(c):\n        remote_log = \"\/var\/log\/nginx\/access.log\"\n        local_target = \"access.log\"\n        c.get(remote_log, local_target)\n        print(f\"{remote_log} dosyas\u0131 yerel olarak {local_target} adresine indirildi.\")<\/code><\/pre>\n<p><strong>4. Ortam Y\u00f6netimi:<\/strong><br \/>\n*   <strong><code>c.cd(path)<\/code>:<\/strong> Bu bir context manager&#8217;d\u0131r. Belirtilen dizine ge\u00e7ici olarak ge\u00e7i\u015f yapar ve <code>cd<\/code> blo\u011fu bitti\u011finde eski dizine d\u00f6ner.<\/p>\n<pre><code class=\"language-python\">@task\n    def deploy_app(c):\n        app_dir = \"\/var\/www\/my_app\"\n        with c.cd(app_dir):\n            c.run(\"git pull origin main\")\n            c.run(\"pip install -r requirements.txt\")\n            c.run(\"python manage.py migrate\")\n        c.sudo(\"systemctl restart my_app_service\")\n        print(f\"Uygulama {app_dir} dizininde g\u00fcncellendi ve yeniden ba\u015flat\u0131ld\u0131.\")<\/code><\/pre>\n<p>*   <strong><code>fabric.context_managers.settings()<\/code> (Fabric 1.x) veya do\u011frudan <code>Connection<\/code> nesnesinin parametreleri (Fabric 2.x):<\/strong> Fabric 2.x&#8217;te <code>Connection<\/code> nesnesi daha esnek bir yap\u0131 sunar. <code>warn_only=True<\/code> gibi ayarlar do\u011frudan <code>run<\/code> veya <code>sudo<\/code> metodlar\u0131na iletilir.<\/p>\n<pre><code class=\"language-python\">@task\n    def robust_command(c):\n        # Hata durumunda bile devam et\n        c.run(\"non_existent_command\", warn=True)\n        print(\"\u0130lk komut ba\u015far\u0131s\u0131z olsa bile bu sat\u0131r \u00e7al\u0131\u015ft\u0131.\")\n        # Hata durumunda dur\n        try:\n            c.run(\"another_critical_command\")\n        except Exception as e:\n            print(f\"Kritik komut hatas\u0131: {e}\")\n            # \u0130\u015flemi durdurmak i\u00e7in\n            # from invoke import Exit\n            # raise Exit(code=1)<\/code><\/pre>\n<p><strong>5. G\u00f6rev Tan\u0131mlama:<\/strong><br \/>\n<code>@task<\/code> dekorat\u00f6r\u00fc, bir Python fonksiyonunu Fabric g\u00f6revi olarak i\u015faretler. Bu fonksiyonlar <code>fab<\/code> komutuyla do\u011frudan \u00e7a\u011fr\u0131labilir. G\u00f6revler birbirini de \u00e7a\u011f\u0131rabilir.<\/p>\n<pre><code class=\"language-python\">from fabric import task\n\n@task\ndef install_dependencies(c):\n    c.sudo(\"apt install -y python3-pip\")\n    c.sudo(\"pip3 install virtualenv\")\n\n@task\ndef setup_project(c):\n    c.run(\"mkdir -p \/var\/www\/my_project\")\n    with c.cd(\"\/var\/www\/my_project\"):\n        c.run(\"virtualenv venv\")\n        c.run(\"source venv\/bin\/activate && pip install Flask\")\n\n@task\ndef full_setup(c):\n    install_dependencies(c) # Bir g\u00f6revi ba\u015fka bir g\u00f6revden \u00e7a\u011f\u0131rma\n    setup_project(c)\n    print(\"Proje kurulumu tamamland\u0131!\")<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>full_setup<\/code> g\u00f6revini \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, \u00f6nce <code>install_dependencies<\/code> ve ard\u0131ndan <code>setup_project<\/code> g\u00f6revleri s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131lacakt\u0131r.<\/p>\n<h3>Y\u00f6netim G\u00f6revlerinin Otomasyonu<\/h3>\n<p>Fabric, sunucu y\u00f6netimindeki bir\u00e7ok s\u0131k\u0131c\u0131 ve tekrarlayan g\u00f6revi otomatikle\u015ftirmek i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r.<\/p>\n<p><strong>1. Sunucu Sa\u011flama ve Yap\u0131land\u0131rma:<\/strong><br \/>\nYeni bir sunucuyu s\u0131f\u0131rdan kurmak veya mevcut bir sunucunun temel yap\u0131land\u0131rmas\u0131n\u0131 yapmak Fabric ile kolayla\u015f\u0131r.<\/p>\n<pre><code class=\"language-python\"># fabfile.py\nfrom fabric import Connection, task\n\n@task\ndef update_system(c):\n    \"\"\"Sistemi g\u00fcnceller.\"\"\"\n    c.sudo(\"apt update && apt upgrade -y\")\n    c.sudo(\"apt autoremove -y\")\n    print(\"Sistem g\u00fcncellendi.\")\n\n@task\ndef install_common_packages(c):\n    \"\"\"Temel paketleri (Git, Nginx, Docker) kurar.\"\"\"\n    packages = [\"git\", \"nginx\", \"docker.io\", \"docker-compose\"]\n    for pkg in packages:\n        c.sudo(f\"apt install -y {pkg}\")\n    c.sudo(\"usermod -aG docker {}\".format(c.user)) # Kullan\u0131c\u0131y\u0131 docker grubuna ekle\n    print(\"Temel paketler kuruldu ve kullan\u0131c\u0131 docker grubuna eklendi.\")\n\n@task\ndef configure_firewall(c):\n    \"\"\"UFW g\u00fcvenlik duvar\u0131n\u0131 yap\u0131land\u0131r\u0131r.\"\"\"\n    c.sudo(\"ufw allow OpenSSH\")\n    c.sudo(\"ufw allow 'Nginx HTTP'\")\n    c.sudo(\"ufw enable\")\n    c.sudo(\"ufw status\")\n    print(\"G\u00fcvenlik duvar\u0131 yap\u0131land\u0131r\u0131ld\u0131.\")\n\n@task\ndef create_deploy_user(c):\n    \"\"\"Yeni bir da\u011f\u0131t\u0131m kullan\u0131c\u0131s\u0131 olu\u015fturur ve SSH anahtar\u0131n\u0131 ekler.\"\"\"\n    deploy_user = \"deployer\"\n    c.sudo(f\"adduser --disabled-password --gecos '' {deploy_user}\")\n    c.sudo(f\"mkdir -p \/home\/{deploy_user}\/.ssh\")\n    c.sudo(f\"chmod 700 \/home\/{deploy_user}\/.ssh\")\n    \n    # Yerel SSH anahtar\u0131n\u0131 uzak sunucuya kopyala (\u00f6rnek ama\u00e7l\u0131, daha g\u00fcvenli y\u00f6ntemler tercih edilmeli)\n    # Ger\u00e7ek uygulamada, anahtar\u0131n g\u00fcvenli bir \u015fekilde aktar\u0131lmas\u0131 gerekir.\n    # \u00d6rne\u011fin, yerel makinedeki id_rsa.pub dosyas\u0131n\u0131 kopyalayal\u0131m\n    c.put(\"~\/.ssh\/id_rsa.pub\", f\"\/tmp\/{deploy_user}_key.pub\")\n    c.sudo(f\"cat \/tmp\/{deploy_user}_key.pub >> \/home\/{deploy_user}\/.ssh\/authorized_keys\")\n    c.sudo(f\"chmod 600 \/home\/{deploy_user}\/.ssh\/authorized_keys\")\n    c.sudo(f\"chown -R {deploy_user}:{deploy_user} \/home\/{deploy_user}\/.ssh\")\n    c.sudo(f\"rm \/tmp\/{deploy_user}_key.pub\")\n    print(f\"Kullan\u0131c\u0131 '{deploy_user}' olu\u015fturuldu ve SSH anahtar\u0131 eklendi.\")\n\n@task\ndef provision_server(c):\n    \"\"\"Yeni bir sunucuyu u\u00e7tan uca haz\u0131rlar.\"\"\"\n    update_system(c)\n    install_common_packages(c)\n    configure_firewall(c)\n    create_deploy_user(c)\n    print(\"Sunucu haz\u0131rl\u0131\u011f\u0131 tamamland\u0131!\")<\/code><\/pre>\n<p>Bu g\u00f6revleri <code>fab -H your_admin_user@your_new_server_ip provision_server<\/code> komutuyla \u00e7al\u0131\u015ft\u0131rarak yeni bir sunucuyu dakikalar i\u00e7inde haz\u0131r hale getirebilirsiniz.<\/p>\n<p><strong>2. Rutin Bak\u0131m ve \u0130zleme:<\/strong><br \/>\nG\u00fcnl\u00fck, haftal\u0131k veya ayl\u0131k olarak yap\u0131lmas\u0131 gereken rutin bak\u0131m g\u00f6revleri de Fabric ile otomatize edilebilir.<\/p>\n<pre><code class=\"language-python\"># fabfile.py (devam)\n@task\ndef cleanup_logs(c):\n    \"\"\"Belirli log dosyalar\u0131n\u0131 temizler.\"\"\"\n    log_paths = [\"\/var\/log\/nginx\/<em>.log\", \"\/var\/log\/app\/<\/em>.log\"]\n    for log_path in log_paths:\n        c.sudo(f\"truncate -s 0 {log_path}\", warn=True) # Hata olsa bile devam et\n    print(\"Log dosyalar\u0131 temizlendi.\")\n\n@task\ndef check_service_status(c, service_name=\"nginx\"):\n    \"\"\"Belirli bir servisin durumunu kontrol eder.\"\"\"\n    result = c.run(f\"systemctl is-active {service_name}\", warn=True)\n    if result.ok:\n        print(f\"{service_name} servisi \u00e7al\u0131\u015f\u0131yor.\")\n    else:\n        print(f\"{service_name} servisi \u00e7al\u0131\u015fm\u0131yor veya durumu belirsiz. \u00c7\u0131kt\u0131: {result.stdout}\")\n\n@task\ndef create_backup(c):\n    \"\"\"Veritaban\u0131 ve uygulama dosyalar\u0131n\u0131n yede\u011fini al\u0131r.\"\"\"\n    backup_dir = \"\/var\/backups\"\n    timestamp = c.run(\"date +%Y%m%d%H%M%S\", hide=True).stdout.strip()\n    \n    c.sudo(f\"mkdir -p {backup_dir}\")\n    \n    # PostgreSQL yede\u011fi (\u00f6rnek)\n    db_name = \"my_database\"\n    db_user = \"my_db_user\"\n    c.sudo(f\"pg_dump -U {db_user} {db_name} > {backup_dir}\/{db_name}_{timestamp}.sql\")\n    \n    # Uygulama dosyalar\u0131 yede\u011fi\n    app_path = \"\/var\/www\/my_app\"\n    c.sudo(f\"tar -czvf {backup_dir}\/my_app_files_{timestamp}.tar.gz {app_path}\")\n    \n    print(\"Yedekleme tamamland\u0131.\")\n    # \u0130ste\u011fe ba\u011fl\u0131: Yedekleri yerel makineye indir veya bulut depolama alan\u0131na y\u00fckle.<\/code><\/pre>\n<h3>Uygulama Da\u011f\u0131t\u0131mlar\u0131n\u0131n Otomasyonu<\/h3>\n<p>Fabric&#8217;in en yayg\u0131n kullan\u0131m alanlar\u0131ndan biri, uygulama da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini otomatikle\u015ftirmektir. Bu, geli\u015ftiricilerin kodlar\u0131n\u0131 sunuculara h\u0131zl\u0131, g\u00fcvenli ve hatas\u0131z bir \u015fekilde ula\u015ft\u0131rmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>1. Basit Bir Web Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131:<\/strong><br \/>\nBir Python\/Django\/Flask uygulamas\u0131n\u0131n sunucuya da\u011f\u0131t\u0131m\u0131n\u0131 otomatikle\u015ftirelim.<\/p>\n<pre><code class=\"language-python\"># fabfile.py (devam)\nfrom fabric import Connection, task\nimport os\n\n<h2>Ortam de\u011fi\u015fkenleri veya config dosyas\u0131 ile y\u00f6netilebilir<\/h2>\nREPO_URL = \"https:\/\/github.com\/your_username\/your_app.git\"\nAPP_NAME = \"my_webapp\"\nAPP_DIR = f\"\/var\/www\/{APP_NAME}\"\nVENV_DIR = f\"{APP_DIR}\/venv\"\nREQUIREMENTS_FILE = \"requirements.txt\"\nGUNICORN_SERVICE = f\"{APP_NAME}.service\"\n\n@task\ndef deploy_initial(c):\n    \"\"\"Uygulamay\u0131 ilk kez da\u011f\u0131t\u0131r.\"\"\"\n    c.sudo(f\"mkdir -p {APP_DIR}\")\n    with c.cd(APP_DIR):\n        c.run(f\"git clone {REPO_URL} .\")\n        c.run(f\"python3 -m venv {VENV_DIR}\")\n        c.run(f\"{VENV_DIR}\/bin\/pip install -r {REQUIREMENTS_FILE}\")\n        c.run(f\"{VENV_DIR}\/bin\/python manage.py migrate\") # Django\/Flask i\u00e7in\n        c.run(f\"{VENV_DIR}\/bin\/python manage.py collectstatic --noinput\") # Django i\u00e7in\n    configure_gunicorn_nginx(c)\n    print(f\"Uygulama '{APP_NAME}' ilk kez da\u011f\u0131t\u0131ld\u0131.\")\n\n@task\ndef deploy_update(c):\n    \"\"\"Mevcut uygulamay\u0131 g\u00fcnceller.\"\"\"\n    with c.cd(APP_DIR):\n        c.run(\"git pull origin main\") # Ana branch'ten \u00e7ek\n        c.run(f\"{VENV_DIR}\/bin\/pip install -r {REQUIREMENTS_FILE}\")\n        c.run(f\"{VENV_DIR}\/bin\/python manage.py migrate\")\n        c.run(f\"{VENV_DIR}\/bin\/python manage.py collectstatic --noinput\")\n    c.sudo(f\"systemctl restart {GUNICORN_SERVICE}\")\n    c.sudo(\"systemctl reload nginx\")\n    print(f\"Uygulama '{APP_NAME}' g\u00fcncellendi ve servisler yeniden ba\u015flat\u0131ld\u0131.\")\n\n@task\ndef configure_gunicorn_nginx(c):\n    \"\"\"Gunicorn ve Nginx yap\u0131land\u0131rmas\u0131n\u0131 yapar.\"\"\"\n    # Gunicorn systemd servisi olu\u015fturma\n    gunicorn_service_content = f\"\"\"\n[Unit]\nDescription={APP_NAME} Gunicorn instance\nAfter=network.target\n\n[Service]\nUser={c.user}\nGroup=www-data\nWorkingDirectory={APP_DIR}\nExecStart={VENV_DIR}\/bin\/gunicorn --workers 3 --bind unix:{APP_DIR}\/{APP_NAME}.sock -m 007 wsgi:app\nRestart=always\n\n[Install]\nWantedBy=multi-user.target\n\"\"\"\n    # Yerel bir ge\u00e7ici dosya olu\u015fturup uzak sunucuya y\u00fckle\n    local_service_file = f\"\/tmp\/{GUNICORN_SERVICE}\"\n    with open(local_service_file, \"w\") as f:\n        f.write(gunicorn_service_content)\n    \n    c.put(local_service_file, f\"\/etc\/systemd\/system\/{GUNICORN_SERVICE}\", sudo=True)\n    os.remove(local_service_file) # Ge\u00e7ici dosyay\u0131 temizle\n\n    c.sudo(\"systemctl daemon-reload\")\n    c.sudo(f\"systemctl start {GUNICORN_SERVICE}\")\n    c.sudo(f\"systemctl enable {GUNICORN_SERVICE}\")\n\n    # Nginx yap\u0131land\u0131rmas\u0131 (\u00f6rnek)\n    nginx_config_content = f\"\"\"\nserver {{\n    listen 80;\n    server_name your_domain.com; # Kendi domain ad\u0131n\u0131z\u0131 buraya yaz\u0131n\n\n    location \/ {{\n        include proxy_params;\n        proxy_pass http:\/\/unix:{APP_DIR}\/{APP_NAME}.sock;\n    }}\n\n    location \/static\/ {{\n        alias {APP_DIR}\/static\/;\n    }}\n}}\n\"\"\"\n    local_nginx_config_file = f\"\/tmp\/{APP_NAME}.conf\"\n    with open(local_nginx_config_file, \"w\") as f:\n        f.write(nginx_config_content)\n    \n    c.put(local_nginx_config_file, f\"\/etc\/nginx\/sites-available\/{APP_NAME}\", sudo=True)\n    os.remove(local_nginx_config_file)\n\n    c.sudo(f\"ln -sf \/etc\/nginx\/sites-available\/{APP_NAME} \/etc\/nginx\/sites-enabled\/\")\n    c.sudo(\"nginx -t\") # Nginx yap\u0131land\u0131rma testi\n    c.sudo(\"systemctl reload nginx\")\n    print(\"Gunicorn ve Nginx yap\u0131land\u0131rmas\u0131 tamamland\u0131.\")<\/code><\/pre>\n<p>Bu betikler, bir web uygulamas\u0131n\u0131n ilk kurulumunu ve sonraki g\u00fcncellemelerini otomatikle\u015ftirmek i\u00e7in kullan\u0131labilir.<\/p>\n<p><strong>2. \u00c7oklu Ortam Deste\u011fi:<\/strong><br \/>\nFarkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in farkl\u0131 yap\u0131land\u0131rmalar veya da\u011f\u0131t\u0131m ad\u0131mlar\u0131 gerekebilir. Fabric, bu senaryolar\u0131 y\u00f6netmek i\u00e7in esneklik sunar.<\/p>\n<pre><code class=\"language-python\"># fabfile.py (devam)\nfrom fabric import Connection, task\n\n<h2>Ortam bazl\u0131 yap\u0131land\u0131rmalar<\/h2>\nenv_configs = {\n    \"dev\": {\n        \"hosts\": [\"dev_user@dev_server_ip\"],\n        \"app_dir\": \"\/var\/www\/dev_app\",\n        \"branch\": \"develop\",\n        \"django_settings\": \"my_app.settings.development\"\n    },\n    \"prod\": {\n        \"hosts\": [\"prod_user@prod_server_ip\"],\n        \"app_dir\": \"\/var\/www\/prod_app\",\n        \"branch\": \"main\",\n        \"django_settings\": \"my_app.settings.production\"\n    }\n}\n\n@task\ndef deploy(c, env=\"dev\"):\n    \"\"\"Belirtilen ortama uygulamay\u0131 da\u011f\u0131t\u0131r.\"\"\"\n    config = env_configs.get(env)\n    if not config:\n        print(f\"Hata: '{env}' ortam\u0131 bulunamad\u0131.\")\n        return\n\n    c.host = config[\"hosts\"][0].split('@')[1] # Ba\u011flant\u0131 nesnesini g\u00fcncelleyebiliriz\n    c.user = config[\"hosts\"][0].split('@')[0]\n    \n    app_dir = config[\"app_dir\"]\n    branch = config[\"branch\"]\n    django_settings = config[\"django_settings\"]\n\n    print(f\"'{env}' ortam\u0131na da\u011f\u0131t\u0131m yap\u0131l\u0131yor ({c.host})...\")\n    with c.cd(app_dir):\n        c.run(f\"git pull origin {branch}\")\n        c.run(f\"source venv\/bin\/activate && pip install -r requirements.txt\")\n        c.run(f\"source venv\/bin\/activate && python manage.py migrate --settings={django_settings}\")\n        c.run(f\"source venv\/bin\/activate && python manage.py collectstatic --noinput --settings={django_settings}\")\n    \n    c.sudo(f\"systemctl restart {APP_NAME}.service\")\n    c.sudo(\"systemctl reload nginx\")\n    print(f\"'{env}' ortam\u0131na da\u011f\u0131t\u0131m tamamland\u0131.\")\n\n<h2>\u00c7al\u0131\u015ft\u0131rma:<\/h2>\n<h2>fab deploy --env=dev<\/h2>\n<h2>fab deploy --env=prod<\/code><\/pre>\n<\/h2>\n<p>Bu \u00f6rnek, farkl\u0131 ortamlar i\u00e7in dinamik olarak ba\u011flant\u0131 ve da\u011f\u0131t\u0131m parametrelerini ayarlaman\u0131n bir yolunu g\u00f6sterir.<\/p>\n<p><strong>3. Geri Alma (Rollback) Stratejileri:<\/strong><br \/>\nDa\u011f\u0131t\u0131mlar s\u0131ras\u0131nda beklenmedik sorunlar ortaya \u00e7\u0131kabilir. Bu durumda, uygulaman\u0131n \u00f6nceki, \u00e7al\u0131\u015fan bir s\u00fcr\u00fcm\u00fcne h\u0131zl\u0131ca geri d\u00f6nebilmek kritik \u00f6neme sahiptir. Fabric ile basit geri alma mekanizmalar\u0131 olu\u015fturulabilir. Bu genellikle da\u011f\u0131t\u0131m s\u0131ras\u0131nda kodun bir kopyas\u0131n\u0131 veya git commit hash&#8217;ini saklayarak yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\"># fabfile.py (devam)\n@task\ndef rollback(c, env=\"prod\", commit_hash=None):\n    \"\"\"Uygulamay\u0131 belirli bir commit hash'ine geri d\u00f6nd\u00fcr\u00fcr.\"\"\"\n    config = env_configs.get(env)\n    if not config:\n        print(f\"Hata: '{env}' ortam\u0131 bulunamad\u0131.\")\n        return\n    \n    app_dir = config[\"app_dir\"]\n    \n    with c.cd(app_dir):\n        if commit_hash:\n            c.run(f\"git checkout {commit_hash}\")\n            print(f\"Uygulama '{commit_hash}' commit'ine geri d\u00f6nd\u00fcr\u00fcld\u00fc.\")\n        else:\n            # En son commit'ten bir \u00f6nceki commit'e d\u00f6n\n            c.run(\"git checkout HEAD^\") \n            print(\"Uygulama bir \u00f6nceki commit'e geri d\u00f6nd\u00fcr\u00fcld\u00fc.\")\n        \n        c.run(f\"source venv\/bin\/activate && pip install -r requirements.txt\")\n        c.run(f\"source venv\/bin\/activate && python manage.py migrate\")\n        c.run(f\"source venv\/bin\/activate && python manage.py collectstatic --noinput\")\n    \n    c.sudo(f\"systemctl restart {APP_NAME}.service\")\n    c.sudo(\"systemctl reload nginx\")\n    print(f\"Geri alma i\u015flemi tamamland\u0131 ve servisler yeniden ba\u015flat\u0131ld\u0131.\")\n\n<h2>\u00c7al\u0131\u015ft\u0131rma:<\/h2>\n<h2>fab rollback --env=prod<\/h2>\n<h2>fab rollback --env=prod --commit-hash=abcdef12345<\/code><\/pre>\n<\/h2>\n<h3>Geli\u015fmi\u015f Fabric Kullan\u0131m\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Fabric&#8217;in temel \u00f6zelliklerinin \u00f6tesine ge\u00e7erek, daha karma\u015f\u0131k senaryolar\u0131 y\u00f6netmek ve otomasyon betiklerinizi daha sa\u011flam hale getirmek i\u00e7in baz\u0131 geli\u015fmi\u015f teknikler ve en iyi uygulamalar mevcuttur.<\/p>\n<p><strong>1. Yap\u0131land\u0131rma Y\u00f6netimi:<\/strong><br \/>\n<code>fabfile.py<\/code> dosyas\u0131nda t\u00fcm yap\u0131land\u0131rmalar\u0131 do\u011frudan tutmak yerine, harici yap\u0131land\u0131rma dosyalar\u0131 (YAML, JSON) kullanmak veya Fabric&#8217;in kendi <code>Config<\/code> nesnesini kullanmak daha d\u00fczenli bir yakla\u015f\u0131m sunar.<\/p>\n<pre><code class=\"language-python\"># fabfile.py (devam)\nfrom fabric import Connection, task, Config\nimport yaml\n\n<h2>config.yaml dosyas\u0131 (\u00f6rnek)<\/h2>\n<h2>environments:<\/h2>\n<h2>dev:<\/h2>\n<h2>hosts: [\"dev_user@dev_server_ip\"]<\/h2>\n<h2>app_dir: \"\/var\/www\/dev_app\"<\/h2>\n<h2>branch: \"develop\"<\/h2>\n<h2>prod:<\/h2>\n<h2>hosts: [\"prod_user@prod_server_ip\"]<\/h2>\n<h2>app_dir: \"\/var\/www\/prod_app\"<\/h2>\n<h2>branch: \"main\"<\/h2>\n\ndef load_config(env_name):\n    with open(\"config.yaml\", \"r\") as f:\n        full_config = yaml.safe_load(f)\n    return full_config[\"environments\"].get(env_name)\n\n@task\ndef deploy_with_config(c, env=\"dev\"):\n    config = load_config(env)\n    if not config:\n        print(f\"Hata: '{env}' ortam\u0131 yap\u0131land\u0131rmas\u0131 bulunamad\u0131.\")\n        return\n\n    c.host = config[\"hosts\"][0].split('@')[1]\n    c.user = config[\"hosts\"][0].split('@')[0]\n    \n    app_dir = config[\"app_dir\"]\n    branch = config[\"branch\"]\n    \n    print(f\"'{env}' ortam\u0131na da\u011f\u0131t\u0131m yap\u0131l\u0131yor ({c.host})...\")\n    with c.cd(app_dir):\n        c.run(f\"git pull origin {branch}\")\n        # ... di\u011fer da\u011f\u0131t\u0131m ad\u0131mlar\u0131 ...\n    print(f\"'{env}' ortam\u0131na da\u011f\u0131t\u0131m tamamland\u0131.\")<\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, yap\u0131land\u0131rma verilerini koddan ay\u0131rarak daha temiz ve y\u00f6netilebilir bir yap\u0131 sa\u011flar.<\/p>\n<p><strong>2. Hata Y\u00f6netimi ve Geri Bildirim:<\/strong><br \/>\nOtomasyon betiklerinin g\u00fcvenilir olmas\u0131 i\u00e7in hata durumlar\u0131n\u0131 do\u011fru bir \u015fekilde ele almas\u0131 ve kullan\u0131c\u0131ya anlaml\u0131 geri bildirimler sunmas\u0131 \u00f6nemlidir.<br \/>\n*   <strong><code>warn=True<\/code>:<\/strong> Bir komut hata d\u00f6nd\u00fcrse bile Fabric&#8217;in \u00e7al\u0131\u015fmaya devam etmesini sa\u011flar. Kritik olmayan ad\u0131mlar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<br \/>\n*   <strong><code>hide=True<\/code>:<\/strong> Komut \u00e7\u0131kt\u0131s\u0131n\u0131 terminalde gizler, ancak \u00e7\u0131kt\u0131 <code>Result<\/code> nesnesinde saklan\u0131r. Bu, hassas bilgilerin veya \u00e7ok uzun \u00e7\u0131kt\u0131lar\u0131n gizlenmesi i\u00e7in faydal\u0131d\u0131r.<br \/>\n*   <strong><code>invoke.exceptions.Exit<\/code>:<\/strong> Kritik bir hata durumunda beti\u011fi kontroll\u00fc bir \u015fekilde sonland\u0131rmak i\u00e7in <code>invoke<\/code> k\u00fct\u00fcphanesinin <code>Exit<\/code> istisnas\u0131n\u0131 kullanabilirsiniz.<\/p>\n<pre><code class=\"language-python\">from fabric import Connection, task\nfrom invoke import Exit\n\n@task\ndef critical_deploy(c):\n    try:\n        c.run(\"some_critical_command_that_might_fail\")\n        print(\"Kritik komut ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131.\")\n    except Exception as e:\n        print(f\"HATA: Kritik komut ba\u015far\u0131s\u0131z oldu: {e}\")\n        raise Exit(code=1, message=\"Da\u011f\u0131t\u0131m kritik hata nedeniyle durduruldu.\")\n    \n    c.run(\"another_command_that_can_fail\", warn=True)\n    print(\"Kritik olmayan komut \u00e7al\u0131\u015ft\u0131 (ba\u015far\u0131s\u0131z olsa bile).\")<\/code><\/pre>\n<p><strong>3. Paralel \u00c7al\u0131\u015ft\u0131rma:<\/strong><br \/>\nFabric, birden fazla sunucuda ayn\u0131 g\u00f6revi e\u015f zamanl\u0131 olarak \u00e7al\u0131\u015ft\u0131rma yetene\u011fine sahiptir. Bu, b\u00fcy\u00fck sunucu gruplar\u0131nda i\u015flemlerin h\u0131zland\u0131r\u0131lmas\u0131 i\u00e7in \u00e7ok faydal\u0131d\u0131r.<br \/>\n<code>fab<\/code> komutuna <code>--parallel<\/code> veya <code>-P<\/code> bayra\u011f\u0131n\u0131 ekleyerek veya <code>Connection<\/code> nesnesini olu\u015ftururken <code>Config<\/code> parametresini kullanarak paralel \u00e7al\u0131\u015fmay\u0131 etkinle\u015ftirebilirsiniz.<\/p>\n<pre><code class=\"language-python\"># fabfile.py (devam)\nfrom fabric import Connection, task, Config\n\n<h2>config.yaml dosyas\u0131nda hosts listesi oldu\u011funu varsayal\u0131m<\/h2>\n<h2>environments:<\/h2>\n<h2>prod:<\/h2>\n<h2>hosts: [\"prod_user@prod_server_ip_1\", \"prod_user@prod_server_ip_2\"]<\/h2>\n\n@task(hosts=[\"prod_user@prod_server_ip_1\", \"prod_user@prod_server_ip_2\"])\ndef parallel_update(c):\n    \"\"\"Belirtilen hostlarda sistemi paralel olarak g\u00fcnceller.\"\"\"\n    print(f\"[{c.host}] Sistem g\u00fcncelleniyor...\")\n    c.sudo(\"apt update && apt upgrade -y\")\n    print(f\"[{c.host}] Sistem g\u00fcncellendi.\")\n\n<h2>\u00c7al\u0131\u015ft\u0131rma:<\/h2>\n<h2>fab --parallel parallel_update<\/h2>\n<h2>veya<\/h2>\n<h2>fab -P parallel_update<\/code><\/pre>\n<\/h2>\n<p><code>@task<\/code> dekorat\u00f6r\u00fcne <code>hosts<\/code> parametresi ekleyerek veya <code>fab<\/code> komutunda birden fazla <code>-H<\/code> bayra\u011f\u0131 kullanarak da host listesini belirtebilirsiniz.<\/p>\n<p><strong>4. Roller ve Grup Y\u00f6netimi:<\/strong><br \/>\nSunucular genellikle belirli roller \u00fcstlenir (web sunucusu, veritaban\u0131 sunucusu, \u00f6nbellek sunucusu vb.). Fabric, bu rollere g\u00f6re sunucular\u0131 gruplaman\u0131za ve sadece ilgili sunucularda belirli g\u00f6revleri \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r.<br \/>\nBu genellikle <code>fabfile<\/code> i\u00e7inde Python listeleri veya s\u00f6zl\u00fckleri kullanarak manuel olarak yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-python\"># fabfile.py (devam)\nweb_servers = [\"web_user@web_server_1\", \"web_user@web_server_2\"]\ndb_servers = [\"db_user@db_server_1\"]\n\n@task(hosts=web_servers)\ndef deploy_web_app(c):\n    \"\"\"Web sunucular\u0131na uygulamay\u0131 da\u011f\u0131t\u0131r.\"\"\"\n    print(f\"[{c.host}] Web uygulamas\u0131 da\u011f\u0131t\u0131l\u0131yor...\")\n    # ... web uygulamas\u0131 da\u011f\u0131t\u0131m ad\u0131mlar\u0131 ...\n\n@task(hosts=db_servers)\ndef run_db_migrations(c):\n    \"\"\"Veritaban\u0131 sunucusunda migrasyonlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r.\"\"\"\n    print(f\"[{c.host}] Veritaban\u0131 migrasyonlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor...\")\n    # ... veritaban\u0131 migrasyon ad\u0131mlar\u0131 ...\n\n<h2>\u00c7al\u0131\u015ft\u0131rma:<\/h2>\n<h2>fab deploy_web_app<\/h2>\n<h2>fab run_db_migrations<\/code><\/pre>\n<\/h2>\n<p><strong>5. G\u00fcvenlik \u0130pu\u00e7lar\u0131:<\/strong><br \/>\n*   <strong>SSH Anahtarlar\u0131 Kullan\u0131m\u0131:<\/strong> Parola yerine SSH anahtarlar\u0131n\u0131 kullanmak her zaman daha g\u00fcvenlidir. Fabric, varsay\u0131lan olarak <code>~\/.ssh\/id_rsa<\/code> gibi anahtarlar\u0131 kullanmaya \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <strong>Parola Y\u00f6netimi:<\/strong> Parolalar\u0131 <code>fabfile.py<\/code> i\u00e7inde saklamaktan kesinlikle ka\u00e7\u0131n\u0131n. Ortam de\u011fi\u015fkenleri, g\u00fcvenli vault&#8217;lar veya <code>fab<\/code> komutunun <code>-p<\/code> parametresi ile \u00e7al\u0131\u015fma zaman\u0131nda parola sa\u011flamak daha g\u00fcvenlidir.<br \/>\n*   <strong>K\u0131s\u0131tl\u0131 Yetkilere Sahip Kullan\u0131c\u0131lar:<\/strong> Uzak sunucularda, g\u00f6revleri \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>root<\/code> yerine k\u0131s\u0131tl\u0131 yetkilere sahip bir kullan\u0131c\u0131 kullan\u0131n ve <code>sudo<\/code> ile sadece gerekti\u011finde yetki y\u00fckseltin.<\/p>\n<p><strong>6. CI\/CD S\u00fcre\u00e7leriyle Entegrasyon:<\/strong><br \/>\nFabric betikleri, Jenkins, GitLab CI, GitHub Actions gibi s\u00fcrekli entegrasyon\/s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) ara\u00e7lar\u0131n\u0131n bir par\u00e7as\u0131 olarak kolayca kullan\u0131labilir. Bir kod deposuna push yap\u0131ld\u0131\u011f\u0131nda, CI\/CD arac\u0131 otomatik olarak Fabric g\u00f6revlerini \u00e7al\u0131\u015ft\u0131rarak testleri yapabilir, uygulamay\u0131 derleyebilir ve ard\u0131ndan uzak sunuculara da\u011f\u0131tabilir.<\/p>\n<pre><code class=\"language-yaml\"># .gitlab-ci.yml veya .github\/workflows\/main.yml (\u00f6rnek)\ndeploy:\n  stage: deploy\n  image: python:3.9-slim\n  script:\n    - pip install fabric\n    - fab -H $SSH_USER@$PROD_SERVER_IP -i ~\/.ssh\/id_rsa deploy_update\n  only:\n    - main<\/code><\/pre>\n<p>Bu, da\u011f\u0131t\u0131m s\u00fcrecini tamamen otomatikle\u015ftirerek insan m\u00fcdahalesini en aza indirir.<\/p>\n<h3>Fabric&#8217;in Alternatifleri ve Konumland\u0131rmas\u0131<\/h3>\n<p>Fabric, otomasyon d\u00fcnyas\u0131ndaki tek ara\u00e7 de\u011fildir. Ansible, Chef, Puppet ve SaltStack gibi g\u00fc\u00e7l\u00fc alternatifleri vard\u0131r. Her bir arac\u0131n kendi felsefesi, mimarisi ve kullan\u0131m senaryolar\u0131 bulunur.<\/p>\n<p>*   <strong>Ansible:<\/strong> Fabric gibi SSH tabanl\u0131d\u0131r ve arac\u0131s\u0131z \u00e7al\u0131\u015f\u0131r. YAML tabanl\u0131 deklaratif yap\u0131land\u0131rmas\u0131yla \u00f6ne \u00e7\u0131kar. Geni\u015f bir mod\u00fcl k\u00fct\u00fcphanesine sahiptir ve daha \u00e7ok &#8220;yap\u0131land\u0131rma y\u00f6netimi&#8221; arac\u0131 olarak kabul edilir. Fabric&#8217;e g\u00f6re daha karma\u015f\u0131k altyap\u0131lar\u0131n y\u00f6netimi i\u00e7in daha uygun olabilir.<br \/>\n*   <strong>Chef, Puppet, SaltStack:<\/strong> Bu ara\u00e7lar genellikle &#8220;agent tabanl\u0131&#8221;d\u0131r. Yani, y\u00f6netilen her sunucuda bir ajan (daemon) \u00e7al\u0131\u015f\u0131r. Bu ara\u00e7lar, karma\u015f\u0131k, b\u00fcy\u00fck \u00f6l\u00e7ekli ve uzun \u00f6m\u00fcrl\u00fc sunucu yap\u0131land\u0131rmalar\u0131n\u0131 deklaratif bir \u015fekilde y\u00f6netmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. Genellikle daha y\u00fcksek bir \u00f6\u011frenme e\u011frisine sahiptirler.<\/p>\n<p><strong>Fabric Ne Zaman Daha Uygun?<\/strong><br \/>\n*   <strong>Basitlik ve H\u0131z:<\/strong> H\u0131zl\u0131 ve basit otomasyon g\u00f6revleri veya da\u011f\u0131t\u0131m betikleri yazman\u0131z gerekti\u011finde.<br \/>\n*   <strong>Python Hakimiyeti:<\/strong> Ekibiniz Python konusunda g\u00fc\u00e7l\u00fc ve mevcut Python kod taban\u0131n\u0131zla entegrasyon ar\u0131yorsan\u0131z.<br \/>\n*   <strong>SSH Odakl\u0131l\u0131k:<\/strong> Arac\u0131s\u0131z, SSH \u00fczerinden do\u011frudan komut \u00e7al\u0131\u015ft\u0131rma esnekli\u011fine ihtiyac\u0131n\u0131z varsa.<br \/>\n*   <strong>Ad-hoc G\u00f6revler:<\/strong> Tek seferlik veya s\u0131k s\u0131k de\u011fi\u015fen y\u00f6netim g\u00f6revleri i\u00e7in.<br \/>\n*   <strong>Da\u011f\u0131t\u0131m Betikleri:<\/strong> Uygulama da\u011f\u0131t\u0131m\u0131 i\u00e7in \u00f6zel, esnek bir s\u00fcre\u00e7 tan\u0131mlamak istedi\u011finizde.<\/p>\n<p><strong>Fabric&#8217;in S\u0131n\u0131rl\u0131l\u0131klar\u0131:<\/strong><br \/>\n*   <strong>Daha Az Deklaratif:<\/strong> Fabric, daha \u00e7ok &#8220;nas\u0131l yap\u0131l\u0131r&#8221; (imperative) yakla\u015f\u0131m\u0131n\u0131 benimserken, Ansible gibi ara\u00e7lar &#8220;ne olmas\u0131 gerekti\u011fi&#8221; (declarative) yakla\u015f\u0131m\u0131n\u0131 benimser. Bu, Fabric ile sunucunun mevcut durumunu do\u011frulamak i\u00e7in daha fazla manuel kontrol kodu yazman\u0131z gerekti\u011fi anlam\u0131na gelebilir.<br \/>\n*   <strong>Yap\u0131land\u0131rma Y\u00f6netimi \u00d6zellikleri:<\/strong> Fabric, bir yap\u0131land\u0131rma y\u00f6netimi arac\u0131 olmaktan \u00e7ok bir &#8220;g\u00f6rev \u00e7al\u0131\u015ft\u0131r\u0131c\u0131&#8221;d\u0131r. Kullan\u0131c\u0131 y\u00f6netimi, servislerin durumu gibi karma\u015f\u0131k yap\u0131land\u0131rma y\u00f6netimi i\u015flevlerini yerle\u015fik olarak sunmaz; bunlar\u0131 Python kodlar\u0131yla kendiniz implemente etmeniz gerekir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Fabric, Python&#8217;\u0131n g\u00fcc\u00fcn\u00fc ve SSH&#8217;nin evrenselli\u011fini birle\u015ftirerek y\u00f6netim g\u00f6revlerini ve uygulama da\u011f\u0131t\u0131mlar\u0131n\u0131 otomatikle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir ara\u00e7 sunar. Basit kurulumu, sezgisel API&#8217;si ve Python tabanl\u0131 yap\u0131s\u0131 sayesinde, hem geli\u015ftiricilerin hem de sistem y\u00f6neticilerinin karma\u015f\u0131k s\u00fcre\u00e7leri kolayca otomatikle\u015ftirmesine olanak tan\u0131r.<\/p>\n<p>Bu makalede, Fabric&#8217;in kurulumundan temel komutlar\u0131na, sunucu sa\u011flama ve uygulama da\u011f\u0131t\u0131m\u0131 gibi pratik kullan\u0131m senaryolar\u0131ndan ileri d\u00fczey \u00f6zelliklere kadar geni\u015f bir yelpazeyi ele ald\u0131k. Fabric kullanarak manuel hatalar\u0131 azaltabilir, operasyonel verimlili\u011fi art\u0131rabilir ve ekiplerinizi daha stratejik \u00e7al\u0131\u015fmalara y\u00f6nlendirebilirsiniz. K\u00fc\u00e7\u00fck projelerden ba\u015flayarak ad\u0131m ad\u0131m Fabric&#8217;i s\u00fcre\u00e7lerinize entegre etmek, IT altyap\u0131n\u0131z\u0131n y\u00f6netimini ve da\u011f\u0131t\u0131m\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde d\u00f6n\u00fc\u015ft\u00fcrecektir. Unutmay\u0131n, otomasyon bir yolculuktur ve Fabric bu yolculukta size sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek\nGiri\u015f: Otomasyonun Y\u00fckseli\u015fi ve Fabric&#8217;in Rol\u00fc\nG\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempo","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-38394","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>Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek - 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\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek\" \/>\n<meta property=\"og:description\" content=\"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek Giri\u015f: Otomasyonun Y\u00fckseli\u015fi ve Fabric&#039;in Rol\u00fc G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempo\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-30T09:41:05+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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek\",\"datePublished\":\"2026-01-30T09:41:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/\"},\"wordCount\":2530,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/\",\"name\":\"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-30T09:41:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek\"}]},{\"@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":"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek - 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\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/","og_locale":"tr_TR","og_type":"article","og_title":"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek","og_description":"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek Giri\u015f: Otomasyonun Y\u00fckseli\u015fi ve Fabric'in Rol\u00fc G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zl\u0131 tempo","og_url":"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-30T09:41:05+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek","datePublished":"2026-01-30T09:41:05+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/"},"wordCount":2530,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/","url":"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/","name":"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-30T09:41:05+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/fabric-ile-yonetim-gorevlerini-ve-dagitimlari-otomatiklestirmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Fabric ile Y\u00f6netim G\u00f6revlerini ve Da\u011f\u0131t\u0131mlar\u0131 Otomatikle\u015ftirmek"}]},{"@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\/38394","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=38394"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38394\/revisions"}],"predecessor-version":[{"id":38395,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38394\/revisions\/38395"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}