{"id":43696,"date":"2026-07-29T17:01:10","date_gmt":"2026-07-29T14:01:10","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=43696"},"modified":"2026-07-29T17:01:35","modified_gmt":"2026-07-29T14:01:35","slug":"konfigurasyon-yonetimi-101-chef-receteleri-yazmak","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/","title":{"rendered":"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak"},"content":{"rendered":"<h2>Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen ve geni\u015fleyen BT altyap\u0131lar\u0131nda, sunucular\u0131 ve uygulamalar\u0131 tutarl\u0131, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir \u015fekilde y\u00f6netmek b\u00fcy\u00fck bir zorluktur. Manuel yap\u0131land\u0131rma s\u00fcre\u00e7leri hataya a\u00e7\u0131k, zaman al\u0131c\u0131 ve tekrarlanamazd\u0131r. \u0130\u015fte bu noktada <strong>Konfig\u00fcrasyon Y\u00f6netimi (Configuration Management)<\/strong> devreye girer. Bu makale, konfig\u00fcrasyon y\u00f6netiminin temellerini a\u00e7\u0131klayacak ve bu alandaki pop\u00fcler ara\u00e7lardan biri olan Chef ile nas\u0131l re\u00e7eteler (recipes) yaz\u0131laca\u011f\u0131n\u0131 ad\u0131m ad\u0131m ele alacakt\u0131r.<\/p>\n<h3>Konfig\u00fcrasyon Y\u00f6netimi Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Konfig\u00fcrasyon y\u00f6netimi, sistemlerin ve yaz\u0131l\u0131m\u0131n tutarl\u0131 bir durumda olmas\u0131n\u0131 sa\u011flamak i\u00e7in yap\u0131land\u0131rmalar\u0131n otomatikle\u015ftirilmesi ve standartla\u015ft\u0131r\u0131lmas\u0131 s\u00fcrecidir. Bu, sunucular\u0131n, a\u011f cihazlar\u0131n\u0131n, veritabanlar\u0131n\u0131n ve uygulamalar\u0131n belirli bir &#8220;istenen duruma&#8221; (desired state) getirilmesi ve bu durumun s\u00fcrd\u00fcr\u00fclmesi anlam\u0131na gelir. Konfig\u00fcrasyon y\u00f6netiminin sundu\u011fu ba\u015fl\u0131ca faydalar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Tutarl\u0131l\u0131k:<\/strong> T\u00fcm ortamlar\u0131n\u0131zda (geli\u015ftirme, test, \u00fcretim) ayn\u0131 yap\u0131land\u0131rmalar\u0131n uygulanmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Yeni sunucular\u0131 h\u0131zl\u0131 ve hatas\u0131z bir \u015fekilde devreye alman\u0131z\u0131 sa\u011flar.<\/li>\n<li><strong>Hata Azaltma:<\/strong> \u0130nsan hatalar\u0131n\u0131 en aza indirir, otomatik s\u00fcre\u00e7ler daha g\u00fcvenilirdir.<\/li>\n<li><strong>Felaket Kurtarma:<\/strong> Altyap\u0131n\u0131z kod olarak tan\u0131mland\u0131\u011f\u0131 i\u00e7in, ortam\u0131n\u0131z\u0131 h\u0131zl\u0131ca yeniden olu\u015fturabilirsiniz.<\/li>\n<li><strong>G\u00fcvenlik ve Uyum:<\/strong> G\u00fcvenlik politikalar\u0131n\u0131n ve uyumluluk standartlar\u0131n\u0131n tutarl\u0131 bir \u015fekilde uygulanmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<li><strong>H\u0131z ve \u00c7eviklik:<\/strong> Uygulama da\u011f\u0131t\u0131mlar\u0131n\u0131 ve altyap\u0131 de\u011fi\u015fikliklerini h\u0131zland\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Chef, Puppet, Ansible ve SaltStack gibi ara\u00e7lar, bu s\u00fcre\u00e7leri otomatikle\u015ftirmek i\u00e7in kullan\u0131lan pop\u00fcler konfig\u00fcrasyon y\u00f6netimi ara\u00e7lar\u0131d\u0131r. Bu makalede, Ruby tabanl\u0131 g\u00fc\u00e7l\u00fc bir otomasyon platformu olan Chef&#8217;e odaklanaca\u011f\u0131z.<\/p>\n<h3>Chef&#8217;e Giri\u015f: Altyap\u0131 Kod Olarak<\/h3>\n<p>Chef, altyap\u0131n\u0131z\u0131 kod olarak tan\u0131mlaman\u0131za olanak tan\u0131yan g\u00fc\u00e7l\u00fc bir otomasyon platformudur. Bu &#8220;altyap\u0131 kod olarak&#8221; (Infrastructure as Code &#8211; IaC) yakla\u015f\u0131m\u0131, sunucu yap\u0131land\u0131rmalar\u0131n\u0131, uygulama da\u011f\u0131t\u0131mlar\u0131n\u0131 ve di\u011fer altyap\u0131 g\u00f6revlerini s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda tutulan, test edilebilir ve tekrarlanabilir kod par\u00e7ac\u0131klar\u0131 olarak ele al\u0131r. Chef, Ruby tabanl\u0131 bir DSL (Domain Specific Language) kullan\u0131r.<\/p>\n<h4>Chef&#8217;in Temel Bile\u015fenleri<\/h4>\n<ol>\n<li><strong>Chef Workstation:<\/strong> Geli\u015ftiricilerin Chef kodunu yazd\u0131\u011f\u0131, test etti\u011fi ve Chef Server&#8217;a y\u00fckledi\u011fi geli\u015ftirme ortam\u0131d\u0131r.<\/li>\n<li><strong>Chef Server:<\/strong> T\u00fcm yap\u0131land\u0131rma verilerini (re\u00e7eteler, kaynak kitaplar\u0131, d\u00fc\u011f\u00fcm bilgileri vb.) merkezi olarak depolayan ve y\u00f6neten sunucudur.<\/li>\n<li><strong>Chef Client (Node):<\/strong> Chef Server&#8217;dan gelen yap\u0131land\u0131rma bilgilerini alarak kendi \u00fczerindeki sistemin istenen duruma getirilmesinden sorumlu olan hedef sunuculard\u0131r (d\u00fc\u011f\u00fcmler).<\/li>\n<\/ol>\n<h4>Chef&#8217;in Temel Kavramlar\u0131<\/h4>\n<ul>\n<li><strong>Kaynak (Resource):<\/strong> Bir sistem \u00fczerindeki belirli bir bile\u015fenin (paket, hizmet, dosya vb.) istenen durumunu tan\u0131mlayan soyut bir yap\u0131d\u0131r. \u00d6rnek: <code>package 'nginx'<\/code>.<\/li>\n<li><strong>Re\u00e7ete (Recipe):<\/strong> Bir veya daha fazla kayna\u011f\u0131 bir araya getirerek belirli bir sistem yap\u0131land\u0131rmas\u0131n\u0131 tan\u0131mlayan Ruby kodudur.<\/li>\n<li><strong>Kaynak Kitap (Cookbook):<\/strong> \u0130li\u015fkili re\u00e7eteleri, dosyalar\u0131, \u015fablonlar\u0131, nitelikleri (attributes) ve k\u00fct\u00fcphaneleri i\u00e7eren bir dizin yap\u0131s\u0131d\u0131r. Chef&#8217;teki t\u00fcm yap\u0131land\u0131rma kodu kaynak kitaplarda d\u00fczenlenir.<\/li>\n<li><strong>\u00c7al\u0131\u015ft\u0131rma Listesi (Run List):<\/strong> Bir d\u00fc\u011f\u00fcm \u00fczerinde hangi re\u00e7etelerin ve\/veya rollerin hangi s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 belirten bir listedir.<\/li>\n<li><strong>Nitelik (Attribute):<\/strong> Re\u00e7etelerin davran\u0131\u015f\u0131n\u0131 \u00f6zelle\u015ftirmek i\u00e7in kullan\u0131lan anahtar-de\u011fer \u00e7iftleridir.<\/li>\n<li><strong>\u015eablon (Template):<\/strong> Dinamik olarak i\u00e7erik olu\u015fturmak i\u00e7in kullan\u0131lan ERB (Embedded Ruby) dosyalar\u0131d\u0131r.<\/li>\n<li><strong>Ohai:<\/strong> Chef Client \u00e7al\u0131\u015ft\u0131r\u0131lmadan \u00f6nce d\u00fc\u011f\u00fcm hakk\u0131nda bilgi (i\u015fletim sistemi, a\u011f ayarlar\u0131 vb.) toplayan bir ara\u00e7t\u0131r.<\/li>\n<\/ul>\n<h3>Chef Re\u00e7eteleri Yazmak: Temel Yap\u0131 Ta\u015flar\u0131<\/h3>\n<p>Chef re\u00e7eteleri, bir d\u00fc\u011f\u00fcm\u00fcn istenen durumunu tan\u0131mlayan Ruby kod dosyalar\u0131d\u0131r. Her re\u00e7ete, bir veya daha fazla kaynaktan olu\u015fur. Kaynaklar, Chef&#8217;e belirli bir sistem bile\u015fenini nas\u0131l y\u00f6netece\u011fini s\u00f6yler.<\/p>\n<h4>Re\u00e7etenin Temel Yap\u0131s\u0131<\/h4>\n<p>Bir Chef re\u00e7etesi, Ruby s\u00f6zdizimi kullan\u0131larak yaz\u0131l\u0131r ve genellikle a\u015fa\u011f\u0131daki gibi bir yap\u0131ya sahiptir:<\/p>\n<pre><code># Nginx paketini y\u00fckle ve hizmetini ba\u015flat\npackage 'nginx' do\n  action :install\nend\n\nservice 'nginx' do\n  action [:enable, :start]\nend\n\n<h2>Bir dosya olu\u015ftur<\/h2>\nfile '\/tmp\/my_message.txt' do\n  content 'Merhaba, Chef ile yap\u0131land\u0131r\u0131ld\u0131m!'\n  mode '0644'\n  owner 'root'\n  group 'root'\nend\n<\/code><\/pre>\n<p>Her kaynak blo\u011fu, bir kaynak t\u00fcr\u00fc (<code>package<\/code>, <code>service<\/code>, <code>file<\/code> vb.), bir isim ve bir dizi nitelik-de\u011fer \u00e7ifti (<code>action<\/code>, <code>content<\/code>, <code>mode<\/code> vb.) i\u00e7erir. <code>action<\/code> niteli\u011fi, kayna\u011fa uygulanacak i\u015flemi belirtir.<\/p>\n<h4>Yayg\u0131n Kullan\u0131lan Kaynaklar ve \u00d6rnekleri<\/h4>\n<h5><code>package<\/code> Kayna\u011f\u0131: Paket Y\u00fckleme<\/h5>\n<p>\u0130\u015fletim sistemindeki paketleri y\u00f6netmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code># Apache HTTP Server'\u0131 y\u00fckle\npackage 'apache2' do\n  action :install\nend\n\n<h2>Birden fazla paketi y\u00fckle<\/h2>\npackage ['vim', 'git'] do\n  action :install\nend\n\n<h2>Bir paketi kald\u0131r<\/h2>\npackage 'unwanted_package' do\n  action :remove\nend\n<\/code><\/pre>\n<h5><code>service<\/code> Kayna\u011f\u0131: Hizmet Y\u00f6netimi<\/h5>\n<p>\u0130\u015fletim sistemi hizmetlerini ba\u015flatmak, durdurmak veya yeniden ba\u015flatmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code># Apache hizmetini ba\u015flat ve etkinle\u015ftir\nservice 'apache2' do\n  action [:enable, :start]\nend\n\n<h2>Nginx hizmetini yeniden ba\u015flat<\/h2>\nservice 'nginx' do\n  action :restart\nend\n<\/code><\/pre>\n<h5><code>file<\/code> Kayna\u011f\u0131: Dosya Y\u00f6netimi<\/h5>\n<p>D\u00fc\u011f\u00fcm \u00fczerinde dosya olu\u015fturmak, i\u00e7eri\u011fini de\u011fi\u015ftirmek, izinlerini ayarlamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code># Yeni bir dosya olu\u015ftur ve i\u00e7eri\u011fini yaz\nfile '\/etc\/motd' do\n  content 'Bu sunucu Chef ile y\u00f6netiliyor!'\n  mode '0644'\n  owner 'root'\n  group 'root'\nend\n\n<h2>Bir dosyay\u0131 sil<\/h2>\nfile '\/tmp\/old_file.txt' do\n  action :delete\nend\n<\/code><\/pre>\n<h5><code>directory<\/code> Kayna\u011f\u0131: Dizin Y\u00f6netimi<\/h5>\n<p>D\u00fc\u011f\u00fcm \u00fczerinde dizin olu\u015fturmak veya silmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code># Bir dizin olu\u015ftur\ndirectory '\/opt\/my_app' do\n  owner 'www-data'\n  group 'www-data'\n  mode '0755'\n  recursive true # \u00dcst dizinler yoksa onlar\u0131 da olu\u015ftur\nend\n<\/code><\/pre>\n<h5><code>remote_file<\/code> Kayna\u011f\u0131: Uzak Dosya \u0130ndirme<\/h5>\n<p>Bir URL&#8217;den bir dosyay\u0131 indirip d\u00fc\u011f\u00fcme kaydetmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code># Uzak bir dosyay\u0131 indir\nremote_file '\/tmp\/web_installer.tar.gz' do\n  source 'http:\/\/example.com\/files\/web_installer.tar.gz'\n  owner 'root'\n  group 'root'\n  mode '0644'\nend\n<\/code><\/pre>\n<h5><code>template<\/code> Kayna\u011f\u0131: \u015eablonlardan Dosya Olu\u015fturma<\/h5>\n<p>ERB \u015fablonlar\u0131n\u0131 kullanarak dinamik olarak yap\u0131land\u0131rma dosyalar\u0131 olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Daha sonra detayl\u0131ca ele al\u0131nacakt\u0131r.<\/p>\n<pre><code># Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 bir \u015fablondan olu\u015ftur\ntemplate '\/etc\/nginx\/nginx.conf' do\n  source 'nginx.conf.erb'\n  owner 'root'\n  group 'root'\n  mode '0644'\n  variables(\n    port: 80\n  )\n  notifies :reload, 'service[nginx]', :delayed # Dosya de\u011fi\u015firse Nginx'i yeniden y\u00fckle\nend\n<\/code><\/pre>\n<h5><code>execute<\/code> Kayna\u011f\u0131: Komut \u00c7al\u0131\u015ft\u0131rma<\/h5>\n<p>Sistem \u00fczerinde rastgele kabuk komutlar\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131l\u0131r. Genellikle di\u011fer kaynaklar\u0131n yapamad\u0131\u011f\u0131 \u00f6zel g\u00f6revler i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code># Bir kabuk komutu \u00e7al\u0131\u015ft\u0131r\nexecute 'update-apt-cache' do\n  command 'apt update'\n  action :run\n  not_if 'grep -q \"updated\" \/var\/log\/apt\/history.log' # Yaln\u0131zca belirli bir durum yoksa \u00e7al\u0131\u015ft\u0131r\nend\n<\/code><\/pre>\n<h5><code>user<\/code> ve <code>group<\/code> Kaynaklar\u0131: Kullan\u0131c\u0131 ve Grup Y\u00f6netimi<\/h5>\n<p>Sistemde kullan\u0131c\u0131 ve grup olu\u015fturmak, de\u011fi\u015ftirmek veya silmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code># Yeni bir kullan\u0131c\u0131 olu\u015ftur\nuser 'deployer' do\n  comment 'Uygulama Da\u011f\u0131t\u0131m Kullan\u0131c\u0131s\u0131'\n  home '\/home\/deployer'\n  shell '\/bin\/bash'\nend\n\n<h2>Yeni bir grup olu\u015ftur<\/h2>\ngroup 'web_admins' do\n  action :create\nend\n<\/code><\/pre>\n<h3>Kaynak Kitaplar (Cookbooks): Re\u00e7eteleri D\u00fczenlemek<\/h3>\n<p>Chef&#8217;teki t\u00fcm yap\u0131land\u0131rma kodu, <strong>kaynak kitaplar (cookbooks)<\/strong> ad\u0131 verilen mod\u00fcler birimlerde d\u00fczenlenir. Bir kaynak kitap, belirli bir uygulama veya hizmetle ilgili re\u00e7eteleri, dosyalar\u0131, \u015fablonlar\u0131, nitelikleri ve k\u00fct\u00fcphaneleri bir araya getirerek kodun yeniden kullan\u0131labilirli\u011fini ve y\u00f6netilebilirli\u011fini art\u0131r\u0131r.<\/p>\n<h4>Kaynak Kitap Yap\u0131s\u0131<\/h4>\n<p>Tipik bir kaynak kitap dizin yap\u0131s\u0131 \u015f\u00f6yledir:<\/p>\n<pre><code>my_app_cookbook\/\n\u251c\u2500\u2500 attributes\/\n\u2502   \u2514\u2500\u2500 default.rb\n\u251c\u2500\u2500 files\/\n\u2502   \u2514\u2500\u2500 default\/\n\u2502       \u2514\u2500\u2500 static_file.txt\n\u251c\u2500\u2500 recipes\/\n\u2502   \u251c\u2500\u2500 default.rb\n\u2502   \u2514\u2500\u2500 install.rb\n\u251c\u2500\u2500 templates\/\n\u2502   \u2514\u2500\u2500 default\/\n\u2502       \u2514\u2500\u2500 config.erb\n\u251c\u2500\u2500 metadata.rb\n\u2514\u2500\u2500 README.md\n<\/code><\/pre>\n<ul>\n<li><strong><code>recipes\/<\/code>:<\/strong> Chef re\u00e7etelerini i\u00e7erir. <code>default.rb<\/code>, bir kaynak kitab\u0131n ana re\u00e7etesidir.<\/li>\n<li><strong><code>attributes\/<\/code>:<\/strong> Kaynak kitab\u0131n niteliklerini tan\u0131mlayan Ruby dosyalar\u0131n\u0131 i\u00e7erir.<\/li>\n<li><strong><code>files\/default\/<\/code>:<\/strong> D\u00fc\u011f\u00fcmlere da\u011f\u0131t\u0131lacak statik dosyalar\u0131 i\u00e7erir. <code>cookbook_file<\/code> kayna\u011f\u0131 ile kullan\u0131l\u0131r.<\/li>\n<li><strong><code>templates\/default\/<\/code>:<\/strong> ERB \u015fablon dosyalar\u0131n\u0131 i\u00e7erir. <code>template<\/code> kayna\u011f\u0131 ile kullan\u0131l\u0131r.<\/li>\n<li><strong><code>metadata.rb<\/code>:<\/strong> Kaynak kitab\u0131n ad\u0131, s\u00fcr\u00fcm\u00fc, ba\u011f\u0131ml\u0131l\u0131klar\u0131 gibi meta verilerini tan\u0131mlar.<\/li>\n<\/ul>\n<h4>Yeni Bir Kaynak Kitap Olu\u015fturma<\/h4>\n<p>Chef Workstation CLI (<code>chef generate<\/code> komutu) ile yeni bir kaynak kitap olu\u015fturmak \u00e7ok kolayd\u0131r:<\/p>\n<pre><code>chef generate cookbook my_webserver\n<\/code><\/pre>\n<p>Bu komut, <code>my_webserver<\/code> ad\u0131nda yeni bir dizin olu\u015fturacak ve temel yap\u0131y\u0131 otomatik olarak dolduracakt\u0131r.<\/p>\n<h3>Nitelikler (Attributes): Re\u00e7eteleri \u00d6zelle\u015ftirme<\/h3>\n<p>Nitelikler, re\u00e7etelerin davran\u0131\u015f\u0131n\u0131 dinamik olarak \u00f6zelle\u015ftirmek i\u00e7in kullan\u0131lan anahtar-de\u011fer \u00e7iftleridir. Bir port numaras\u0131, bir dizin yolu veya bir kullan\u0131c\u0131 ad\u0131 gibi de\u011fi\u015fken de\u011ferleri tutabilirler. Nitelikler, kaynak kitab\u0131n <code>attributes\/default.rb<\/code> dosyas\u0131nda tan\u0131mlan\u0131r ve re\u00e7etelerde <code>node['attribute_name']<\/code> \u015feklinde eri\u015filir.<\/p>\n<h4>Nitelik T\u00fcrleri ve \u00d6ncelikleri<\/h4>\n<p>Chef&#8217;te \u00e7e\u015fitli nitelik t\u00fcrleri ve bunlar\u0131n belirli bir \u00f6ncelik s\u0131ras\u0131 vard\u0131r (en d\u00fc\u015f\u00fckten en y\u00fckse\u011fe): Otomatik (Ohai), Varsay\u0131lan (<code>attributes\/default.rb<\/code>), Normal (Chef Server&#8217;da d\u00fc\u011f\u00fcme \u00f6zel), Ge\u00e7ersiz K\u0131lma (kaynak kitaplarda veya rollerde), Zorunlu Ge\u00e7ersiz K\u0131lma (en y\u00fcksek \u00f6ncelik).<\/p>\n<h4>Nitelik Tan\u0131mlama ve Kullanma<\/h4>\n<p><code>my_webserver\/attributes\/default.rb<\/code> dosyas\u0131nda nitelik tan\u0131mlama:<\/p>\n<pre><code># my_webserver\/attributes\/default.rb\ndefault['my_webserver']['port'] = 80\ndefault['my_webserver']['docroot'] = '\/var\/www\/html'\n<\/code><\/pre>\n<p>Re\u00e7etede nitelikleri kullanma:<\/p>\n<pre><code># my_webserver\/recipes\/default.rb\npackage 'apache2' do\n  action :install\nend\n\nservice 'apache2' do\n  action [:enable, :start]\nend\n\ndirectory node['my_webserver']['docroot'] do\n  owner 'www-data'\n  group 'www-data'\n  mode '0755'\n  recursive true\nend\n\nfile \"#{node['my_webserver']['docroot']}\/index.html\" do\n  content \"\n           <p>Bu site #{node['my_webserver']['port']} portunda hizmet veriyor.<\/p>\"\n  owner 'www-data'\n  group 'www-data'\n  mode '0644'\nend\n<\/code><\/pre>\n<p>Burada, <code>node['my_webserver']['port']<\/code> gibi ifadelerle nitelik de\u011ferlerine eri\u015fiyoruz. <code>node['hostname']<\/code> ise Ohai taraf\u0131ndan toplanan otomatik bir niteliktir.<\/p>\n<h3>\u015eablonlar (Templates): Dinamik Yap\u0131land\u0131rma Dosyalar\u0131<\/h3>\n<p>Statik dosyalar\u0131 da\u011f\u0131tmak yerine, sunucuya \u00f6zg\u00fc de\u011ferlerle doldurulmu\u015f dinamik yap\u0131land\u0131rma dosyalar\u0131na ihtiya\u00e7 duyuldu\u011funda \u015fablonlar kullan\u0131l\u0131r. Chef&#8217;teki \u015fablonlar, ERB (Embedded Ruby) s\u00f6zdizimini kullan\u0131r. \u015eablonlar, kaynak kitab\u0131n <code>templates\/default\/<\/code> dizininde bulunur ve <code>.erb<\/code> uzant\u0131s\u0131na sahiptir.<\/p>\n<h4>\u015eablon Olu\u015fturma ve Kullanma<\/h4>\n<p>\u00d6rnek olarak, Apache i\u00e7in basit bir sanal ana bilgisayar yap\u0131land\u0131rma dosyas\u0131 olu\u015ftural\u0131m.<br \/>\n<code>my_webserver\/templates\/default\/vhost.conf.erb<\/code>:<\/p>\n<pre><code>&lt;VirtualHost *:&lt;%= @port %&gt;&gt;\n    DocumentRoot \"&lt;%= @docroot %&gt;\"\n    ServerName &lt;%= @server_name %&gt;\n&lt;\/VirtualHost&gt;\n<\/code><\/pre>\n<p>Bu \u015fablonda, <code>&lt;%= @variable_name %&gt;<\/code> s\u00f6zdizimi, Chef re\u00e7etesinden ge\u00e7irilen de\u011fi\u015fkenlerin de\u011ferleriyle de\u011fi\u015ftirilecektir.<\/p>\n<p>\u015eablonu re\u00e7etede kullanma (<code>my_webserver\/recipes\/default.rb<\/code> i\u00e7inde):<\/p>\n<pre><code>template \"\/etc\/apache2\/sites-available\/my_webserver.conf\" do\n  source 'vhost.conf.erb'\n  owner 'root'\n  group 'root'\n  mode '0644'\n  variables(\n    port: node['my_webserver']['port'],\n    docroot: node['my_webserver']['docroot'],\n    server_name: node['fqdn'] # Tam nitelikli alan ad\u0131\n  )\n  notifies :reload, 'service[apache2]', :delayed # Yap\u0131land\u0131rma de\u011fi\u015firse Apache'yi yeniden y\u00fckle\nend\n\n<h2>Sanal ana bilgisayar\u0131 etkinle\u015ftir<\/h2>\nexecute 'a2ensite my_webserver.conf' do\n  command 'a2ensite my_webserver.conf'\n  notifies :reload, 'service[apache2]', :delayed\n  not_if { ::File.symlink?('\/etc\/apache2\/sites-enabled\/my_webserver.conf') }\nend\n<\/code><\/pre>\n<p><code>variables<\/code> niteli\u011fi, \u015fablona ge\u00e7irilecek anahtar-de\u011fer \u00e7iftlerini tan\u0131mlar. <code>notifies<\/code> niteli\u011fi, bu kaynakta bir de\u011fi\u015fiklik oldu\u011funda ba\u015fka bir kayna\u011f\u0131n (burada <code>service[apache2]<\/code>) belirli bir eylemi (<code>:reload<\/code>) ger\u00e7ekle\u015ftirmesini sa\u011flar.<\/p>\n<h3>Statik Dosyalar (Files): <code>cookbook_file<\/code> Kayna\u011f\u0131<\/h3>\n<p>E\u011fer bir dosyay\u0131 dinamik olarak olu\u015fturmak yerine, oldu\u011fu gibi d\u00fc\u011f\u00fcme kopyalamak istiyorsan\u0131z, <code>cookbook_file<\/code> kayna\u011f\u0131n\u0131 kullanabilirsiniz. Bu dosyalar, kaynak kitab\u0131n <code>files\/default\/<\/code> dizininde bulunur.<\/p>\n<p>\u00d6rnek: <code>my_webserver\/files\/default\/favicon.ico<\/code> dosyas\u0131n\u0131 d\u00fc\u011f\u00fcme kopyala.<\/p>\n<pre><code># my_webserver\/recipes\/default.rb i\u00e7inde\ncookbook_file \"#{node['my_webserver']['docroot']}\/favicon.ico\" do\n  source 'favicon.ico'\n  owner 'www-data'\n  group 'www-data'\n  mode '0644'\nend\n<\/code><\/pre>\n<h3>Chef \u00c7al\u0131\u015ft\u0131rma S\u00fcreci<\/h3>\n<p>Bir Chef Client, d\u00fc\u011f\u00fcm \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131nda a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izler:<\/p>\n<ol>\n<li><strong>Ohai \u00c7al\u0131\u015ft\u0131rma:<\/strong> D\u00fc\u011f\u00fcm hakk\u0131nda sistem bilgilerini toplar.<\/li>\n<li><strong>Yap\u0131land\u0131rma Al\u0131m\u0131:<\/strong> Chef Server&#8217;dan d\u00fc\u011f\u00fcm\u00fcn \u00e7al\u0131\u015ft\u0131rma listesini ve ilgili kaynak kitaplar\u0131 al\u0131r.<\/li>\n<li><strong>Yak\u0131nsama (Converge) A\u015famas\u0131:<\/strong> Kaynak kitaplardaki re\u00e7eteleri \u00e7al\u0131\u015ft\u0131r\u0131r. Chef mevcut durumu istenen durumla kar\u015f\u0131la\u015ft\u0131r\u0131r ve farkl\u0131l\u0131k varsa gerekli de\u011fi\u015fiklikleri yapar. Bu, Chef&#8217;in &#8220;idempotent&#8221; (tekrarlanabilir) olmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ol>\n<h4>Yerel Geli\u015ftirme ve Test<\/h4>\n<p>Chef re\u00e7etelerini yerel olarak test etmek i\u00e7in <code>chef-client -z<\/code> (Chef Zero modu) veya <code>chef-solo<\/code> kullan\u0131labilir. Test Kitchen ise, re\u00e7etelerin farkl\u0131 platformlarda otomatik olarak test edilmesini sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r.<\/p>\n<p>Kaynak kitab\u0131 Chef Server&#8217;a y\u00fcklemek i\u00e7in <code>knife cookbook upload my_webserver<\/code> komutu kullan\u0131l\u0131r. Daha sonra bir d\u00fc\u011f\u00fcm\u00fcn \u00e7al\u0131\u015ft\u0131rma listesine eklenerek uygulan\u0131r.<\/p>\n<h3>Chef ile En \u0130yi Uygulamalar<\/h3>\n<ul>\n<li><strong>Idempotency (Tekrarlanabilirlik):<\/strong> Re\u00e7eteleriniz her zaman tekrarlanabilir olmal\u0131d\u0131r.<\/li>\n<li><strong>Mod\u00fclerlik ve Yeniden Kullan\u0131m:<\/strong> Re\u00e7etelerinizi k\u00fc\u00e7\u00fck, odaklanm\u0131\u015f ve yeniden kullan\u0131labilir par\u00e7alara ay\u0131r\u0131n. Topluluk kaynak kitaplar\u0131n\u0131 kullanmaktan \u00e7ekinmeyin.<\/li>\n<li><strong>Niteliklerin Kullan\u0131m\u0131:<\/strong> Sabit kodlanm\u0131\u015f de\u011ferler yerine nitelikleri kullanarak re\u00e7etelerinizi esnek hale getirin.<\/li>\n<li><strong>\u015eablonlar\u0131n Kullan\u0131m\u0131:<\/strong> Dinamik yap\u0131land\u0131rma dosyalar\u0131 i\u00e7in \u015fablonlar\u0131 tercih edin.<\/li>\n<li><strong>Test Etme:<\/strong> Re\u00e7etelerinizi ChefSpec (birim testleri) ve Test Kitchen (entegrasyon testleri) ile d\u00fczenli olarak test edin.<\/li>\n<li><strong>S\u00fcr\u00fcm Kontrol\u00fc:<\/strong> T\u00fcm kaynak kitaplar\u0131n\u0131z\u0131 Git gibi bir s\u00fcr\u00fcm kontrol sisteminde tutun.<\/li>\n<li><strong>Gizli Bilgileri Y\u00f6netme:<\/strong> \u015eifreler gibi hassas bilgileri re\u00e7etelerde do\u011frudan saklamay\u0131n. Chef Vault gibi ara\u00e7lar\u0131 kullan\u0131n.<\/li>\n<\/ul>\n<h3>Sonu\u00e7<\/h3>\n<p>Konfig\u00fcrasyon y\u00f6netimi, modern BT altyap\u0131lar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131d\u0131r ve Chef, bu alandaki en g\u00fc\u00e7l\u00fc ve esnek ara\u00e7lardan biridir. Bu makalede, Chef&#8217;in temel kavramlar\u0131n\u0131, re\u00e7etelerin nas\u0131l yaz\u0131laca\u011f\u0131n\u0131, yayg\u0131n kaynaklar\u0131, kaynak kitaplar\u0131n yap\u0131s\u0131n\u0131, niteliklerin ve \u015fablonlar\u0131n kullan\u0131m\u0131n\u0131 \u00f6\u011frendik. Altyap\u0131n\u0131z\u0131 kod olarak tan\u0131mlayarak, tutarl\u0131l\u0131k, \u00f6l\u00e7eklenebilirlik, g\u00fcvenlik ve h\u0131z gibi \u00f6nemli avantajlar elde edebilirsiniz. Chef re\u00e7eteleri yazmaya ba\u015flamak, DevOps yolculu\u011funuzda \u00f6nemli bir ad\u0131md\u0131r ve altyap\u0131 otomasyonu becerilerinizi geli\u015ftirmenin harika bir yoludur. Unutmay\u0131n, pratik yapmak ve topluluk kaynaklar\u0131ndan faydalanmak, Chef ustal\u0131\u011f\u0131n\u0131z\u0131 h\u0131zla art\u0131racakt\u0131r.<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/simulate-chef-recipe-desired-state\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/simulate-chef-recipe-desired-state<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen ve geni\u015fleyen BT altyap\u0131lar\u0131nda, sunucular\u0131 ve uygulamalar\u0131 tutarl\u0131, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir \u015fekilde y\u00f6netmek b\u00fcy\u00fck bir zorluktur.","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-43696","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>Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak - 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\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen ve geni\u015fleyen BT altyap\u0131lar\u0131nda, sunucular\u0131 ve uygulamalar\u0131 tutarl\u0131, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir \u015fekilde y\u00f6netmek b\u00fcy\u00fck bir zorluktur.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-29T14:01:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-29T14:01:35+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=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak\",\"datePublished\":\"2026-07-29T14:01:10+00:00\",\"dateModified\":\"2026-07-29T14:01:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/\"},\"wordCount\":1859,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/\",\"name\":\"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-29T14:01:10+00:00\",\"dateModified\":\"2026-07-29T14:01:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak\"}]},{\"@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":"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak - 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\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/","og_locale":"tr_TR","og_type":"article","og_title":"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak","og_description":"G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen ve geni\u015fleyen BT altyap\u0131lar\u0131nda, sunucular\u0131 ve uygulamalar\u0131 tutarl\u0131, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir \u015fekilde y\u00f6netmek b\u00fcy\u00fck bir zorluktur.","og_url":"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-29T14:01:10+00:00","article_modified_time":"2026-07-29T14:01:35+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak","datePublished":"2026-07-29T14:01:10+00:00","dateModified":"2026-07-29T14:01:35+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/"},"wordCount":1859,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/","url":"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/","name":"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-29T14:01:10+00:00","dateModified":"2026-07-29T14:01:35+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/konfigurasyon-yonetimi-101-chef-receteleri-yazmak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Konfig\u00fcrasyon Y\u00f6netimi 101: Chef Re\u00e7eteleri Yazmak"}]},{"@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\/43696","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=43696"}],"version-history":[{"count":2,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43696\/revisions"}],"predecessor-version":[{"id":43698,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43696\/revisions\/43698"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}