{"id":36514,"date":"2025-12-19T05:40:47","date_gmt":"2025-12-19T02:40:47","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36514"},"modified":"2025-12-19T05:40:47","modified_gmt":"2025-12-19T02:40:47","slug":"ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/","title":{"rendered":"Ansible Playbook&#8217;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma"},"content":{"rendered":"<p><body><\/p>\n<h2>Ansible Playbook&#8217;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>Modern altyap\u0131 y\u00f6netiminde otomasyon, tutarl\u0131l\u0131k ve verimlilik vazge\u00e7ilmez unsurlard\u0131r. Ansible, bu hedeflere ula\u015fmak i\u00e7in geli\u015ftirilmi\u015f, g\u00fc\u00e7l\u00fc ve kullan\u0131m\u0131 kolay bir otomasyon arac\u0131d\u0131r. Sunucular\u0131n ve a\u011f cihazlar\u0131n\u0131n yap\u0131land\u0131rmas\u0131ndan, uygulama da\u011f\u0131t\u0131m\u0131na kadar geni\u015f bir yelpazede g\u00f6revleri otomatikle\u015ftirebilir. Ansible&#8217;\u0131n en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri de \u015fablonlama (templating) yetene\u011fidir. \u015eablonlar, dinamik ve esnek yap\u0131land\u0131rma dosyalar\u0131 olu\u015fturmam\u0131z\u0131 sa\u011flayarak, farkl\u0131 ortamlar veya sunucular i\u00e7in \u00f6zelle\u015ftirilmi\u015f ayarlar\u0131n otomatik olarak \u00fcretilmesine olanak tan\u0131r.<\/p>\n<p>Bu makale, Ansible playbook&#8217;lar\u0131nda \u015fablonlar\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ve kullan\u0131laca\u011f\u0131n\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele alacakt\u0131r. Jinja2 \u015fablon motorunun temel prensiplerinden ba\u015flayarak, de\u011fi\u015fkenlerin, ko\u015fullar\u0131n ve d\u00f6ng\u00fclerin \u015fablonlar i\u00e7inde nas\u0131l kullan\u0131laca\u011f\u0131n\u0131, pratik uygulama \u00f6rneklerini ve en iyi uygulamalar\u0131 inceleyece\u011fiz. Amac\u0131m\u0131z, okuyucular\u0131n Ansible&#8217;\u0131n \u015fablonlama g\u00fcc\u00fcn\u00fc tam olarak anlamalar\u0131n\u0131 ve kendi otomasyon s\u00fcre\u00e7lerinde etkin bir \u015fekilde kullanabilmelerini sa\u011flamakt\u0131r. \u015eablonlar sayesinde, manuel yap\u0131land\u0131rma hatalar\u0131n\u0131 en aza indirebilir, da\u011f\u0131t\u0131m s\u00fcrelerini k\u0131saltabilir ve altyap\u0131 y\u00f6netimini daha g\u00fcvenilir hale getirebiliriz.<\/p>\n<h3>Temel Kavramlar: Jinja2 ve Ansible Templating<\/h3>\n<p>Ansible&#8217;\u0131n \u015fablonlama yetene\u011fi, Python tabanl\u0131 pop\u00fcler bir \u015fablon motoru olan Jinja2 taraf\u0131ndan desteklenmektedir. Jinja2, web geli\u015ftirme \u00e7er\u00e7evelerinde (\u00f6rne\u011fin Flask, Django) yayg\u0131n olarak kullan\u0131lmas\u0131n\u0131n yan\u0131 s\u0131ra, yap\u0131land\u0131rma dosyalar\u0131 gibi metin tabanl\u0131 \u00e7\u0131kt\u0131lar\u0131n dinamik olarak olu\u015fturulmas\u0131 i\u00e7in de idealdir. Ansible, Jinja2&#8217;yi entegre ederek, playbook&#8217;larda tan\u0131mlanan de\u011fi\u015fkenleri, Ansible envanterinden veya toplanan &#8220;facts&#8221;lerden gelen bilgileri kullanarak \u015fablon dosyalar\u0131n\u0131 i\u015fler ve nihai yap\u0131land\u0131rma dosyas\u0131n\u0131 hedefe kopyalar.<\/p>\n<h4>Jinja2 S\u00f6zdizimi Temelleri<\/h4>\n<p>Jinja2, \u015fablon i\u00e7inde dinamik i\u00e7erik olu\u015fturmak i\u00e7in \u00f6zel s\u00f6zdizimi i\u015faretleyicileri kullan\u0131r:<\/p>\n<p>*   <strong>De\u011fi\u015fkenler:<\/strong> De\u011fi\u015fkenlerin de\u011ferlerini \u015fablon i\u00e7inde g\u00f6r\u00fcnt\u00fclemek i\u00e7in \u00e7ift s\u00fcsl\u00fc parantez <code>{{ variable }}<\/code> kullan\u0131l\u0131r. \u00d6rne\u011fin, <code>{{ server_name }}<\/code> ifadesi, <code>server_name<\/code> adl\u0131 de\u011fi\u015fkenin de\u011ferini ekrana yazd\u0131r\u0131r.<br \/>\n*   <strong>Kontrol Yap\u0131lar\u0131:<\/strong> Mant\u0131k (ko\u015fullar, d\u00f6ng\u00fcler) uygulamak i\u00e7in y\u00fczde i\u015faretleri ve s\u00fcsl\u00fc parantezler <code>{% control_statement %}<\/code> kullan\u0131l\u0131r.<br \/>\n    *   <strong>Ko\u015fullar (If\/Else):<\/strong> <code>{% if condition %}<\/code> &#8230; <code>{% elif another_condition %}<\/code> &#8230; <code>{% else %}<\/code> &#8230; <code>{% endif %}<\/code><br \/>\n    *   <strong>D\u00f6ng\u00fcler (For):<\/strong> <code>{% for item in list %}<\/code> &#8230; <code>{% endfor %}<\/code><br \/>\n*   <strong>Yorumlar:<\/strong> \u015eablon i\u00e7inde a\u00e7\u0131klama eklemek i\u00e7in <code>#<\/code> i\u015faretleri ve s\u00fcsl\u00fc parantezler <code>{# comment #}<\/code> kullan\u0131l\u0131r. Bu yorumlar, i\u015flenmi\u015f \u00e7\u0131kt\u0131da yer almaz.<br \/>\n*   <strong>Filtreler:<\/strong> De\u011fi\u015fkenlerin de\u011ferlerini de\u011fi\u015ftirmek veya bi\u00e7imlendirmek i\u00e7in dikey \u00e7izgi <code>|<\/code> ile filtreler uygulan\u0131r. \u00d6rne\u011fin, <code>{{ variable | upper }}<\/code> de\u011fi\u015fkenin de\u011ferini b\u00fcy\u00fck harflere d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<p>Ansible, bir \u015fablon dosyas\u0131n\u0131 i\u015flerken, Jinja2 motorunu kullanarak bu s\u00f6zdizimini yorumlar, de\u011fi\u015fkenleri uygun de\u011ferlerle de\u011fi\u015ftirir ve kontrol yap\u0131lar\u0131n\u0131 y\u00fcr\u00fct\u00fcr. Sonu\u00e7 olarak, tamamen statik bir metin dosyas\u0131 elde edilir ve bu dosya hedef sunucuya kopyalan\u0131r. Bu mekanizma, bir kez yaz\u0131lm\u0131\u015f bir \u015fablonun, farkl\u0131 de\u011fi\u015fken setleri ile birden \u00e7ok kez kullan\u0131lmas\u0131na olanak tan\u0131r, b\u00f6ylece kod tekrar\u0131 \u00f6nlenir ve y\u00f6netim kolayla\u015f\u0131r.<\/p>\n<h3>Ansible&#8217;da Template Kullan\u0131m\u0131n\u0131n Avantajlar\u0131<\/h3>\n<p>Ansible&#8217;da \u015fablonlar\u0131 kullanmak, altyap\u0131 otomasyon s\u00fcre\u00e7lerine bir dizi \u00f6nemli avantaj sa\u011flar:<\/p>\n<h4>Dinamik Konfig\u00fcrasyon<\/h4>\n<p>\u015eablonlar, sunucudan sunucuya, ortamdan ortama (geli\u015ftirme, test, \u00fcretim) de\u011fi\u015fen yap\u0131land\u0131rma de\u011ferlerinin otomatik olarak uygulanmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir web sunucusunun <code>server_name<\/code> veya <code>listen_port<\/code> gibi ayarlar\u0131, her sunucu veya ortam i\u00e7in farkl\u0131 olabilir. \u015eablonlar sayesinde, bu de\u011ferleri dinamik olarak playbook&#8217;lardan veya envanterden alarak do\u011fru yap\u0131land\u0131rma dosyas\u0131n\u0131 olu\u015fturabiliriz.<\/p>\n<h4>Kod Tekrar\u0131n\u0131 \u00d6nleme (DRY &#8211; Don&#8217;t Repeat Yourself)<\/h4>\n<p>Ayn\u0131 yap\u0131land\u0131rma dosyas\u0131n\u0131n farkl\u0131 varyasyonlar\u0131n\u0131 manuel olarak olu\u015fturmak yerine, tek bir \u015fablon dosyas\u0131 yaz\u0131l\u0131r ve de\u011fi\u015fkenlerle \u00f6zelle\u015ftirilir. Bu, kod tekrar\u0131n\u0131 ortadan kald\u0131r\u0131r, yap\u0131land\u0131rma dosyalar\u0131n\u0131n bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r ve hata yapma olas\u0131l\u0131\u011f\u0131n\u0131 azalt\u0131r. Bir yap\u0131land\u0131rma kural\u0131 de\u011fi\u015fti\u011finde, sadece \u015fablonu g\u00fcncellemek yeterlidir.<\/p>\n<h4>Ortamlar Aras\u0131 Tutarl\u0131l\u0131k<\/h4>\n<p>\u015eablonlar, t\u00fcm ortamlar\u0131n\u0131zda (geli\u015ftirme, test, \u00fcretim) yap\u0131land\u0131rma tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flaman\u0131n g\u00fc\u00e7l\u00fc bir yoludur. Ayn\u0131 \u015fablonu kullanarak, her ortam\u0131n kendine \u00f6zg\u00fc de\u011fi\u015fkenlerle beslenmesini sa\u011flayabilir, ancak temel yap\u0131land\u0131rma mant\u0131\u011f\u0131n\u0131n her yerde ayn\u0131 kalmas\u0131n\u0131 garantileyebilirsiniz. Bu, &#8220;\u00e7al\u0131\u015ft\u0131 benim makinemde&#8221; sorunlar\u0131n\u0131 azalt\u0131r ve da\u011f\u0131t\u0131mlar\u0131n daha g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Hassas Bilgilerin Y\u00f6netimi<\/h4>\n<p>Veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 gibi hassas bilgiler, \u015fablonlar arac\u0131l\u0131\u011f\u0131yla yap\u0131land\u0131rma dosyalar\u0131na dinamik olarak eklenebilir. Bu bilgiler genellikle Ansible Vault ile \u015fifrelenir ve \u015fablonlar taraf\u0131ndan g\u00fcvenli bir \u015fekilde kullan\u0131l\u0131r. Bu yakla\u015f\u0131m, hassas verilerin a\u00e7\u0131k metin olarak depolanmas\u0131n\u0131 \u00f6nler ve g\u00fcvenlik risklerini azalt\u0131r.<\/p>\n<h4>Karma\u015f\u0131k Yap\u0131land\u0131rmalar\u0131n Basitle\u015ftirilmesi<\/h4>\n<p>Baz\u0131 uygulamalar\u0131n yap\u0131land\u0131rma dosyalar\u0131 olduk\u00e7a karma\u015f\u0131k olabilir ve bir\u00e7ok farkl\u0131 ayar i\u00e7erebilir. Jinja2&#8217;nin d\u00f6ng\u00fc ve ko\u015ful yetenekleri sayesinde, bu karma\u015f\u0131k yap\u0131land\u0131rmalar\u0131 daha y\u00f6netilebilir ve okunabilir bir \u015fekilde \u015fablonlar i\u00e7inde ifade edebiliriz. \u00d6rne\u011fin, birden fazla sanal ana bilgisayar veya g\u00fcvenlik duvar\u0131 kural\u0131 tan\u0131mlamak i\u00e7in d\u00f6ng\u00fcler kullan\u0131labilir.<\/p>\n<h3>Template Olu\u015fturma ve Kullanma Ad\u0131mlar\u0131<\/h3>\n<p>Ansible&#8217;da bir \u015fablon olu\u015fturmak ve kullanmak olduk\u00e7a basittir, ancak birka\u00e7 ad\u0131mdan olu\u015fur.<\/p>\n<h4>Ad\u0131m 1: Template Dosyas\u0131n\u0131 Olu\u015fturma (.j2 uzant\u0131s\u0131)<\/h4>\n<p>\u015eablon dosyalar\u0131 genellikle <code>.j2<\/code> uzant\u0131s\u0131yla adland\u0131r\u0131l\u0131r (Jinja2&#8217;den gelir), ancak bu zorunlu de\u011fildir. Bu uzant\u0131, dosyan\u0131n bir Jinja2 \u015fablonu oldu\u011funu belirtmek i\u00e7in bir konvansiyondur. \u015eablon dosyalar\u0131n\u0131z\u0131 genellikle playbook&#8217;lar\u0131n\u0131zla ayn\u0131 dizinde veya playbook&#8217;un alt\u0131ndaki \u00f6zel bir <code>templates\/<\/code> dizininde saklamak iyi bir uygulamad\u0131r.<\/p>\n<p>\u00d6rnek olarak, bir Nginx web sunucusu i\u00e7in sanal bir ana bilgisayar yap\u0131land\u0131rma \u015fablonu olu\u015ftural\u0131m: <code>nginx.conf.j2<\/code><\/p>\n<pre><code class=\"language-jinja2\"># nginx.conf.j2\nserver {\n    listen {{ http_port | default(80) }};\n    listen {{ https_port | default(443) }} ssl;\n\n    server_name {{ domain_name }};\n\n    ssl_certificate \/etc\/nginx\/ssl\/{{ domain_name }}.crt;\n    ssl_certificate_key \/etc\/nginx\/ssl\/{{ domain_name }}.key;\n\n    root \/var\/www\/{{ domain_name }}\/html;\n    index index.html index.htm;\n\n    location \/ {\n        try_files $uri $uri\/ =404;\n    }\n\n    {% if enable_redirect_to_www %}\n    if ($host !~* ^www\\.{{ domain_name }}$) {\n        rewrite ^(.*)$ https:\/\/www.{{ domain_name }}$1 permanent;\n    }\n    {% endif %}\n\n    {% if custom_locations is defined and custom_locations %}\n    # Custom locations\n    {% for location in custom_locations %}\n    location {{ location.path }} {\n        proxy_pass {{ location.proxy_target }};\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n    }\n    {% endfor %}\n    {% endif %}\n\n    error_log \/var\/log\/nginx\/{{ domain_name }}_error.log warn;\n    access_log \/var\/log\/nginx\/{{ domain_name }}_access.log combined;\n}\n\n<h2>Ansible taraf\u0131ndan y\u00f6netilen {{ ansible_hostname }} \u00fczerinde.<\/h2>\n<h2>OS: {{ ansible_distribution }} {{ ansible_distribution_version }}<\/code><\/pre>\n<\/h2>\n<p>Bu \u00f6rnek \u015fablon:<br \/>\n*   <code>http_port<\/code>, <code>https_port<\/code>, <code>domain_name<\/code> gibi de\u011fi\u015fkenler kullan\u0131r.<br \/>\n*   <code>default<\/code> filtresi ile portlara varsay\u0131lan de\u011ferler atar.<br \/>\n*   <code>if<\/code> ko\u015fulu ile <code>enable_redirect_to_www<\/code> de\u011fi\u015fkenine g\u00f6re www y\u00f6nlendirmesi ekler.<br \/>\n*   <code>if<\/code> ve <code>for<\/code> d\u00f6ng\u00fcleri ile <code>custom_locations<\/code> listesindeki \u00f6zel konumlar\u0131 dinamik olarak ekler.<br \/>\n*   Ansible&#8217;\u0131n otomatik olarak toplad\u0131\u011f\u0131 <code>ansible_hostname<\/code>, <code>ansible_distribution<\/code>, <code>ansible_distribution_version<\/code> gibi &#8220;facts&#8221;leri kullan\u0131r.<\/p>\n<h4>Ad\u0131m 2: Ansible Playbook&#8217;ta Template Kullan\u0131m\u0131<\/h4>\n<p>\u015eablon dosyas\u0131n\u0131 olu\u015fturduktan sonra, onu bir Ansible playbook&#8217;unda <code>template<\/code> mod\u00fcl\u00fc ile kullanabiliriz. <code>template<\/code> mod\u00fcl\u00fc, belirtilen \u015fablon dosyas\u0131n\u0131 i\u015fler ve sonucu hedef sunucudaki belirtilen yola kopyalar.<\/p>\n<p>\u00d6rnek bir playbook: <code>deploy_nginx.yml<\/code><\/p>\n<pre><code class=\"language-yaml\">---\n- name: Nginx Web Sunucusu Kurulumu ve Yap\u0131land\u0131rmas\u0131\n  hosts: webservers\n  become: yes # Y\u00f6netici haklar\u0131 ile \u00e7al\u0131\u015ft\u0131r\n\n  vars:\n    http_port: 80\n    https_port: 443\n    domain_name: example.com\n    enable_redirect_to_www: true\n    custom_locations:\n      - path: \/api\/\n        proxy_target: http:\/\/backend-service:8080\/\n      - path: \/admin\/\n        proxy_target: http:\/\/admin-panel:9000\/\n\n  tasks:\n    - name: Nginx paketini y\u00fckle\n      ansible.builtin.apt:\n        name: nginx\n        state: present\n      when: ansible_os_family == \"Debian\"\n\n    - name: Nginx yap\u0131land\u0131rma dizinini olu\u015ftur\n      ansible.builtin.file:\n        path: \/etc\/nginx\/sites-available\n        state: directory\n        mode: '0755'\n\n    - name: SSL dizinini olu\u015ftur\n      ansible.builtin.file:\n        path: \/etc\/nginx\/ssl\n        state: directory\n        mode: '0700'\n\n    # \u00d6rnek SSL sertifikas\u0131 ve anahtar\u0131 olu\u015fturma (ger\u00e7ek uygulamada sertifika y\u00f6neticisi kullan\u0131n)\n    - name: SSL sertifika ve anahtar\u0131 olu\u015ftur (sadece \u00f6rnek)\n      community.crypto.openssl_csr:\n        path: \"\/etc\/nginx\/ssl\/{{ domain_name }}.csr\"\n        privatekey_path: \"\/etc\/nginx\/ssl\/{{ domain_name }}.key\"\n        common_name: \"{{ domain_name }}\"\n        organization_name: \"Example Corp\"\n      args:\n        creates: \"\/etc\/nginx\/ssl\/{{ domain_name }}.key\" # Sadece dosya yoksa olu\u015ftur\n      when: not ansible.builtin.stat(path=\"\/etc\/nginx\/ssl\/{{ domain_name }}.key\").stat.exists\n\n    - name: Self-signed SSL sertifikas\u0131 olu\u015ftur (sadece \u00f6rnek)\n      community.crypto.x509_certificate:\n        path: \"\/etc\/nginx\/ssl\/{{ domain_name }}.crt\"\n        privatekey_path: \"\/etc\/nginx\/ssl\/{{ domain_name }}.key\"\n        csr_path: \"\/etc\/nginx\/ssl\/{{ domain_name }}.csr\"\n        provider: selfsigned\n      args:\n        creates: \"\/etc\/nginx\/ssl\/{{ domain_name }}.crt\"\n      when: not ansible.builtin.stat(path=\"\/etc\/nginx\/ssl\/{{ domain_name }}.crt\").stat.exists\n\n    - name: Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 \u015fablondan olu\u015ftur\n      ansible.builtin.template:\n        src: nginx.conf.j2 # Kaynak \u015fablon dosyas\u0131\n        dest: \"\/etc\/nginx\/sites-available\/{{ domain_name }}.conf\" # Hedef dosya yolu\n        owner: root\n        group: root\n        mode: '0644'\n      notify: Nginx'i yeniden ba\u015flat\n\n    - name: Nginx yap\u0131land\u0131rmas\u0131n\u0131 etkinle\u015ftir (symlink olu\u015ftur)\n      ansible.builtin.file:\n        src: \"\/etc\/nginx\/sites-available\/{{ domain_name }}.conf\"\n        dest: \"\/etc\/nginx\/sites-enabled\/{{ domain_name }}.conf\"\n        state: link\n      notify: Nginx'i yeniden ba\u015flat\n\n    - name: Varsay\u0131lan Nginx yap\u0131land\u0131rmas\u0131n\u0131 devre d\u0131\u015f\u0131 b\u0131rak\n      ansible.builtin.file:\n        path: \/etc\/nginx\/sites-enabled\/default\n        state: absent\n      notify: Nginx'i yeniden ba\u015flat\n\n    - name: Nginx servisini ba\u015flat ve ba\u015flang\u0131\u00e7ta etkinle\u015ftir\n      ansible.builtin.systemd:\n        name: nginx\n        state: started\n        enabled: yes\n\n  handlers:\n    - name: Nginx'i yeniden ba\u015flat\n      ansible.builtin.systemd:\n        name: nginx\n        state: restarted<\/code><\/pre>\n<p>Bu playbook&#8217;ta:<br \/>\n*   <code>vars<\/code> blo\u011funda \u015fablonda kullan\u0131lacak de\u011fi\u015fkenler tan\u0131mlanm\u0131\u015ft\u0131r.<br \/>\n*   <code>ansible.builtin.template<\/code> mod\u00fcl\u00fc, <code>nginx.conf.j2<\/code> \u015fablonunu i\u015fler ve <code>dest<\/code> parametresinde belirtilen yola kopyalar.<br \/>\n*   <code>owner<\/code>, <code>group<\/code>, <code>mode<\/code> parametreleri kopyalanan dosyan\u0131n izinlerini ve sahipli\u011fini ayarlar.<br \/>\n*   <code>notify<\/code> ifadesi, yap\u0131land\u0131rma dosyas\u0131 de\u011fi\u015fti\u011finde Nginx servisinin yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flayan bir <code>handler<\/code> tetikler.<\/p>\n<h4>Ad\u0131m 3: De\u011fi\u015fkenlerin Y\u00f6netimi<\/h4>\n<p>\u015eablonlarda kullan\u0131lan de\u011fi\u015fkenlerin de\u011ferleri farkl\u0131 yerlerden gelebilir:<\/p>\n<p>*   <strong>Playbook <code>vars<\/code> blo\u011fu:<\/strong> Yukar\u0131daki \u00f6rnekte oldu\u011fu gibi, playbook&#8217;un kendisinde tan\u0131mlanan de\u011fi\u015fkenler.<br \/>\n*   <strong>Envanter dosyalar\u0131 (<code>group_vars<\/code> ve <code>host_vars<\/code>):<\/strong> Daha yap\u0131land\u0131r\u0131lm\u0131\u015f ve ortam bazl\u0131 de\u011fi\u015fkenler i\u00e7in <code>inventory\/group_vars\/webservers.yml<\/code> veya <code>inventory\/host_vars\/webserver1.example.com.yml<\/code> gibi dosyalar kullan\u0131labilir.<br \/>\n    *   <code>inventory\/group_vars\/webservers.yml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">domain_name: example.com\n        http_port: 80\n        https_port: 443\n        enable_redirect_to_www: true\n        custom_locations:\n          - path: \/api\/\n            proxy_target: http:\/\/backend-service:8080\/<\/code><\/pre>\n<p>*   <strong>Komut sat\u0131r\u0131 (<code>--extra-vars<\/code> veya <code>-e<\/code>):<\/strong> Ge\u00e7ici veya tek seferlik de\u011fi\u015fkenler i\u00e7in <code>ansible-playbook deploy_nginx.yml -e \"domain_name=newdomain.com\"<\/code><br \/>\n*   <strong>Ansible Facts:<\/strong> Ansible taraf\u0131ndan hedef sunucular hakk\u0131nda otomatik olarak toplanan bilgiler (<code>ansible_hostname<\/code>, <code>ansible_os_family<\/code>, <code>ansible_default_ipv4.address<\/code> vb.).<br \/>\n*   <strong><code>set_fact<\/code> mod\u00fcl\u00fc:<\/strong> Playbook i\u00e7inde dinamik olarak yeni de\u011fi\u015fkenler olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <strong>Ansible Vault:<\/strong> Hassas verileri (\u015fifreler, API anahtarlar\u0131) \u015fifrelemek ve g\u00fcvenli bir \u015fekilde \u015fablonlarda kullanmak i\u00e7in.<\/p>\n<h3>Geli\u015fmi\u015f Template Teknikleri<\/h3>\n<p>Jinja2, temel de\u011fi\u015fken ikamesinden \u00e7ok daha fazlas\u0131n\u0131 sunar. Geli\u015fmi\u015f filtreler, testler, d\u00f6ng\u00fcler, ko\u015fullar, makrolar ve i\u00e7ermeler (includes) \u015fablonlar\u0131n\u0131z\u0131 daha g\u00fc\u00e7l\u00fc ve esnek hale getirir.<\/p>\n<h4>Jinja2 Filtreleri<\/h4>\n<p>Filtreler, bir de\u011fi\u015fkenin de\u011ferini de\u011fi\u015ftirmek veya d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131l\u0131r. Syntax <code>{{ variable | filter_name(arg1, arg2) }}<\/code> \u015feklindedir.<\/p>\n<p>*   <code>default(value)<\/code>: De\u011fi\u015fken tan\u0131ml\u0131 de\u011filse veya bo\u015fsa varsay\u0131lan bir de\u011fer sa\u011flar. (\u00d6rnek \u015fablonda kullan\u0131ld\u0131)<br \/>\n*   <code>upper<\/code>, <code>lower<\/code>, <code>capitalize<\/code>, <code>title<\/code>, <code>trim<\/code>: Metin dizelerini bi\u00e7imlendirme.<br \/>\n    *   <code>{{ \"hello world\" | upper }}<\/code> -> <code>HELLO WORLD<\/code><br \/>\n*   <code>split(separator)<\/code>, <code>join(separator)<\/code>: Dizeleri b\u00f6lme veya birle\u015ftirme.<br \/>\n    *   <code>{{ my_list | join(', ') }}<\/code><br \/>\n*   <code>to_nice_json<\/code>, <code>to_yaml<\/code>: Python veri yap\u0131lar\u0131n\u0131 JSON veya YAML format\u0131na d\u00f6n\u00fc\u015ft\u00fcrme. \u00d6zellikle yap\u0131land\u0131rma dosyalar\u0131na karma\u015f\u0131k veri yap\u0131lar\u0131 yazarken kullan\u0131\u015fl\u0131d\u0131r.<br \/>\n    *   <code>{{ my_dict | to_nice_json(indent=2) }}<\/code><br \/>\n*   <code>ipaddr('address\/net')<\/code>: IP adresleri ile ilgili i\u015flemler (\u00f6rne\u011fin, bir IP adresinin belirli bir alt a\u011fda olup olmad\u0131\u011f\u0131n\u0131 kontrol etme).<br \/>\n    *   <code>{{ '192.168.1.10' | ipaddr('192.168.1.0\/24') }}<\/code> -> <code>True<\/code><br \/>\n*   <code>hash('md5')<\/code>, <code>sha1<\/code>, <code>sha256<\/code>: Dize de\u011ferlerinin hash&#8217;ini olu\u015fturma. G\u00fcvenlik ve b\u00fct\u00fcnl\u00fck kontrolleri i\u00e7in.<\/p>\n<h4>Jinja2 Testleri<\/h4>\n<p>Testler, bir de\u011fi\u015fkenin belirli bir ko\u015fulu sa\u011flay\u0131p sa\u011flamad\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in kullan\u0131l\u0131r. Syntax <code>{% if variable is test_name %}<\/code> \u015feklindedir.<\/p>\n<p>*   <code>is defined<\/code>, <code>is undefined<\/code>: De\u011fi\u015fkenin tan\u0131ml\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. (\u00d6rnek \u015fablonda <code>custom_locations is defined<\/code> kullan\u0131ld\u0131)<br \/>\n*   <code>is none<\/code>: De\u011fi\u015fkenin <code>None<\/code> olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<br \/>\n*   <code>is divisibleby(number)<\/code>: Say\u0131n\u0131n belirli bir say\u0131ya b\u00f6l\u00fcn\u00fcp b\u00f6l\u00fcnmedi\u011fini kontrol eder.<br \/>\n*   <code>is string<\/code>, <code>is number<\/code>, <code>is boolean<\/code>: De\u011fi\u015fkenin tipini kontrol eder.<br \/>\n*   <code>is iterable<\/code>: De\u011fi\u015fkenin bir d\u00f6ng\u00fcde kullan\u0131l\u0131p kullan\u0131lamayaca\u011f\u0131n\u0131 kontrol eder.<\/p>\n<h4>D\u00f6ng\u00fcler (Loops)<\/h4>\n<p>Jinja2&#8217;deki <code>for<\/code> d\u00f6ng\u00fcleri, listeler veya s\u00f6zl\u00fckler (dictionaries) \u00fczerinde tekrarlayan bloklar olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-jinja2\"># users.conf.j2\n{% for user in system_users %}\nUser {{ user.name }} {{ user.uid }} {{ user.gid }}\n  Comment \"{{ user.comment | default('System User') }}\"\n  {% if user.home_dir is defined %}\n  HomeDirectory {{ user.home_dir }}\n  {% endif %}\n{% endfor %}<\/code><\/pre>\n<p>Playbook&#8217;ta:<\/p>\n<pre><code class=\"language-yaml\">vars:\n  system_users:\n    - name: alice\n      uid: 1001\n      gid: 1001\n      comment: \"Alice User\"\n    - name: bob\n      uid: 1002\n      gid: 1002\n      home_dir: \/home\/bob<\/code><\/pre>\n<p>D\u00f6ng\u00fcler i\u00e7inde <code>loop.index<\/code>, <code>loop.index0<\/code>, <code>loop.first<\/code>, <code>loop.last<\/code>, <code>loop.length<\/code> gibi \u00f6zel de\u011fi\u015fkenler de kullan\u0131labilir.<\/p>\n<h4>Ko\u015fullar (Conditionals)<\/h4>\n<p><code>if<\/code>, <code>elif<\/code>, <code>else<\/code> bloklar\u0131, \u015fablon i\u00e7inde mant\u0131ksal kararlar almak i\u00e7in kullan\u0131l\u0131r. (\u00d6rnek Nginx \u015fablonunda <code>enable_redirect_to_www<\/code> ve <code>custom_locations<\/code> i\u00e7in kullan\u0131ld\u0131).<\/p>\n<pre><code class=\"language-jinja2\">{% if environment == \"production\" %}\nLogLevel info\n{% elif environment == \"development\" %}\nLogLevel debug\n{% else %}\nLogLevel warn\n{% endif %}<\/code><\/pre>\n<h4>Makrolar (Macros)<\/h4>\n<p>Makrolar, \u015fablon i\u00e7inde tekrar eden kod bloklar\u0131n\u0131 fonksiyonlar gibi tan\u0131mlaman\u0131za olanak tan\u0131r. Bu, \u015fablonlar\u0131n\u0131z\u0131 daha mod\u00fcler ve okunabilir hale getirir.<\/p>\n<p><code>macros.j2<\/code> dosyas\u0131:<\/p>\n<pre><code class=\"language-jinja2\">{% macro define_user(username, uid, gid) %}\nuseradd -u {{ uid }} -g {{ gid }} {{ username }}\n{% endmacro %}<\/code><\/pre>\n<p>Ba\u015fka bir \u015fablonda kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-jinja2\">{% import 'macros.j2' as my_macros %}\n\n{{ my_macros.define_user('john', 1003, 1003) }}\n{{ my_macros.define_user('jane', 1004, 1004) }}<\/code><\/pre>\n<h4>Includes<\/h4>\n<p><code>include<\/code> direktifi, bir \u015fablon dosyas\u0131n\u0131n i\u00e7eri\u011fini ba\u015fka bir \u015fablon dosyas\u0131na dahil etmenizi sa\u011flar. Bu, b\u00fcy\u00fck \u015fablonlar\u0131 daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara b\u00f6lmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p><code>header.j2<\/code>:<\/p>\n<pre><code class=\"language-jinja2\"># Bu dosya {{ ansible_hostname }} i\u00e7in otomatik olarak olu\u015fturuldu.\n<h2>Tarih: {{ ansible_date_time.iso8601_micro }}<\/code><\/pre>\n<\/h2>\n<p>Ana \u015fablonda:<\/p>\n<pre><code class=\"language-jinja2\">{% include 'header.j2' %}\n\nserver {\n    listen 80;\n    server_name {{ domain_name }};\n    # ...\n}<\/code><\/pre>\n<h3>Pratik Uygulama \u00d6rnekleri<\/h3>\n<p>Ansible \u015fablonlar\u0131, \u00e7e\u015fitli ger\u00e7ek d\u00fcnya senaryolar\u0131nda son derece kullan\u0131\u015fl\u0131d\u0131r:<\/p>\n<p>*   <strong>Nginx\/Apache Sanal Host Yap\u0131land\u0131rmas\u0131:<\/strong> Farkl\u0131 <code>server_name<\/code>, <code>root<\/code> dizinleri, SSL sertifikalar\u0131 ve proxy ayarlar\u0131 ile birden fazla sanal host yap\u0131land\u0131rmas\u0131n\u0131 otomatikle\u015ftirmek.<br \/>\n*   <strong>Veritaban\u0131 Ba\u011flant\u0131 Ayarlar\u0131:<\/strong> Uygulama sunucular\u0131nda veritaban\u0131 ba\u011flant\u0131 dizelerini (kullan\u0131c\u0131 ad\u0131, \u015fifre, host, port) dinamik olarak olu\u015fturmak. Hassas veriler i\u00e7in Ansible Vault ile birlikte kullanmak.<br \/>\n*   <strong>Ortama \u00d6zel Uygulama Yap\u0131land\u0131rma Dosyalar\u0131:<\/strong> Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 i\u00e7in farkl\u0131 API anahtarlar\u0131, g\u00fcnl\u00fck seviyeleri veya hizmet u\u00e7 noktalar\u0131 i\u00e7eren uygulama yap\u0131land\u0131rma dosyalar\u0131 (<code>application.properties<\/code>, <code>.env<\/code>, <code>config.json<\/code>).<br \/>\n*   <strong>CRON \u0130\u015fleri Tan\u0131mlama:<\/strong> Farkl\u0131 komutlar, zamanlamalar ve kullan\u0131c\u0131lar i\u00e7in dinamik CRON i\u015fleri olu\u015fturmak.<br \/>\n*   <strong>G\u00fcvenlik Duvar\u0131 Kurallar\u0131:<\/strong> Belirli IP adresleri, portlar veya protokoller i\u00e7in g\u00fcvenlik duvar\u0131 kurallar\u0131n\u0131 (iptables, firewalld) \u015fablonlar arac\u0131l\u0131\u011f\u0131yla dinamik olarak olu\u015fturmak.<br \/>\n*   <strong>DNS Kay\u0131tlar\u0131:<\/strong> DNS sunucular\u0131nda (Bind, PowerDNS) A, CNAME, MX gibi kay\u0131tlar\u0131 otomatik olarak eklemek.<\/p>\n<h3>En \u0130yi Uygulamalar (Best Practices)<\/h3>\n<p>Ansible \u015fablonlar\u0131n\u0131 etkin ve s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde kullanmak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir:<\/p>\n<p>*   <strong>\u015eablonlar\u0131 D\u00fczenli Tutma:<\/strong> T\u00fcm \u015fablon dosyalar\u0131n\u0131z\u0131 playbook&#8217;unuzla ayn\u0131 d\u00fczeyde veya ayr\u0131 bir <code>templates\/<\/code> dizini alt\u0131nda saklay\u0131n. Bu, projenin yap\u0131s\u0131n\u0131 d\u00fczenli tutar.<br \/>\n*   <strong>De\u011fi\u015fken Adland\u0131rma Kurallar\u0131na Uyma:<\/strong> De\u011fi\u015fkenlerinizi anlaml\u0131 ve tutarl\u0131 bir \u015fekilde adland\u0131r\u0131n. \u00d6rne\u011fin, <code>http_port<\/code> yerine <code>nginx_http_port<\/code> gibi daha spesifik isimler kullanabilirsiniz, \u00f6zellikle farkl\u0131 rollerde ayn\u0131 isimde de\u011fi\u015fkenler varsa.<br \/>\n*   <strong>\u015eablonlar\u0131 Basit ve Okunabilir Tutma:<\/strong> \u015eablonlar, genellikle yap\u0131land\u0131rma dosyalar\u0131n\u0131n iskeletini sa\u011flamal\u0131 ve \u00e7ok karma\u015f\u0131k mant\u0131k i\u00e7ermemelidir. A\u015f\u0131r\u0131 karma\u015f\u0131k mant\u0131\u011f\u0131 (\u00f6rne\u011fin, yo\u011fun veri i\u015fleme) Jinja2 yerine Python&#8217;da veya Ansible playbook&#8217;un di\u011fer g\u00f6revlerinde (\u00f6rne\u011fin <code>set_fact<\/code> ile de\u011fi\u015fkenleri \u00f6nceden i\u015fleme) uygulamay\u0131 d\u00fc\u015f\u00fcn\u00fcn.<br \/>\n*   <strong>\u015eablonlar\u0131 Test Etme:<\/strong> <code>ansible-playbook --syntax-check<\/code> komutu, playbook&#8217;unuzdaki Jinja2 s\u00f6zdizimi hatalar\u0131n\u0131 yakalaman\u0131za yard\u0131mc\u0131 olabilir. Ayr\u0131ca, \u015fablonun beklenen \u00e7\u0131kt\u0131y\u0131 \u00fcretip \u00fcretmedi\u011fini g\u00f6rmek i\u00e7in &#8220;dry run&#8221; modunda (<code>--check<\/code>) playbook&#8217;u \u00e7al\u0131\u015ft\u0131rabilirsiniz.<br \/>\n*   <strong>Hassas Veriler \u0130\u00e7in Ansible Vault Kullanma:<\/strong> \u015eifreler, API anahtarlar\u0131 gibi hassas bilgileri asla a\u00e7\u0131k metin olarak \u015fablonlarda veya de\u011fi\u015fken dosyalar\u0131nda saklamay\u0131n. Bunun yerine Ansible Vault&#8217;u kullanarak bu verileri \u015fifreleyin ve \u015fablonlar\u0131n\u0131zda g\u00fcvenli bir \u015fekilde kullan\u0131n.<br \/>\n*   <strong>Yorumlar\u0131 Etkili Kullanma:<\/strong> \u015eablonlar\u0131n\u0131z\u0131n i\u00e7inde karma\u015f\u0131k mant\u0131k veya belirli bir ama\u00e7 i\u00e7in yap\u0131lm\u0131\u015f b\u00f6l\u00fcmleri a\u00e7\u0131klamak i\u00e7in Jinja2 yorumlar\u0131n\u0131 <code>{# comment #}<\/code> kullan\u0131n.<br \/>\n*   <strong>Tekrar Kullan\u0131labilirli\u011fi D\u00fc\u015f\u00fcnme:<\/strong> \u015eablonlar\u0131, farkl\u0131 senaryolarda veya projelerde tekrar kullan\u0131labilecek \u015fekilde genel ve parametrik hale getirmeye \u00e7al\u0131\u015f\u0131n.<\/p>\n<h3>S\u0131k Kar\u015f\u0131la\u015f\u0131lan Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p>\u015eablonlarla \u00e7al\u0131\u015f\u0131rken kar\u015f\u0131la\u015f\u0131labilecek baz\u0131 yayg\u0131n sorunlar ve bunlar\u0131n \u00e7\u00f6z\u00fcmleri:<\/p>\n<p>*   <strong>De\u011fi\u015fken Bulunamad\u0131 Hatas\u0131 (<code>Undefined variable<\/code>):<\/strong> Bu hata, \u015fablonda kullan\u0131lan bir de\u011fi\u015fkenin playbook&#8217;ta veya envanterde tan\u0131mlanmam\u0131\u015f olmas\u0131 durumunda ortaya \u00e7\u0131kar.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> De\u011fi\u015fkenin t\u00fcm olas\u0131 kaynaklarda (playbook vars, group_vars, host_vars, extra-vars) do\u011fru \u015fekilde tan\u0131mland\u0131\u011f\u0131ndan emin olun. <code>default<\/code> filtresini kullanarak de\u011fi\u015fkenin tan\u0131ml\u0131 olmamas\u0131 durumunda bir varsay\u0131lan de\u011fer sa\u011flayabilirsiniz.<br \/>\n*   <strong>S\u00f6zdizimi Hatalar\u0131 (Jinja2 SyntaxError):<\/strong> Jinja2 s\u00f6zdizimi kurallar\u0131na uymayan bir ifade kullan\u0131ld\u0131\u011f\u0131nda bu hata olu\u015fur.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> Jinja2 s\u00f6zdizimini dikkatlice kontrol edin (\u00f6rne\u011fin, <code>{{ }}<\/code> ve <code>{% %}<\/code> i\u015faretlerinin do\u011fru kullan\u0131m\u0131, etiketlerin kapanmas\u0131). Hata mesaj\u0131 genellikle hatan\u0131n hangi sat\u0131rda oldu\u011funu g\u00f6sterir.<br \/>\n*   <strong>Dosya \u0130zinleri ve Sahipli\u011fi Sorunlar\u0131:<\/strong> Kopyalanan yap\u0131land\u0131rma dosyas\u0131n\u0131n hedef sunucuda yanl\u0131\u015f izinlere veya sahipli\u011fe sahip olmas\u0131.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>template<\/code> mod\u00fcl\u00fcnde <code>owner<\/code>, <code>group<\/code> ve <code>mode<\/code> parametrelerini do\u011fru \u015fekilde ayarlay\u0131n. Genellikle yap\u0131land\u0131rma dosyalar\u0131 i\u00e7in <code>root:root<\/code> sahipli\u011fi ve <code>0644<\/code> veya <code>0600<\/code> gibi izinler kullan\u0131l\u0131r.<br \/>\n*   <strong>Servis Yeniden Ba\u015flatmama:<\/strong> Yap\u0131land\u0131rma dosyas\u0131 g\u00fcncellenmesine ra\u011fmen ilgili servisin (Nginx, Apache vb.) yeniden ba\u015flat\u0131lmamas\u0131.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>template<\/code> g\u00f6revinin <code>notify<\/code> parametresini kullanarak ilgili <code>handler<\/code>&#8216;\u0131 tetikledi\u011finizden emin olun. Handler&#8217;\u0131n ad\u0131n\u0131n <code>notify<\/code> parametresindeki adla tam olarak e\u015fle\u015fti\u011finden emin olun.<br \/>\n*   <strong>Karma\u015f\u0131k Mant\u0131k Hatalar\u0131:<\/strong> \u015eablonda \u00e7ok karma\u015f\u0131k Jinja2 mant\u0131\u011f\u0131 kullan\u0131ld\u0131\u011f\u0131nda, beklenen \u00e7\u0131kt\u0131y\u0131 alamamak.<br \/>\n    *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> \u015eablonu daha k\u00fc\u00e7\u00fck, daha basit par\u00e7alara ay\u0131r\u0131n. Karma\u015f\u0131k veri i\u015fleme veya ko\u015fullu mant\u0131\u011f\u0131 Jinja2 i\u00e7inde yapmak yerine, playbook&#8217;un kendisinde <code>set_fact<\/code> veya di\u011fer mod\u00fcllerle de\u011fi\u015fkenleri \u00f6nceden haz\u0131rlay\u0131n.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Ansible&#8217;da \u015fablonlar, altyap\u0131 otomasyonunun kalbinde yer alan g\u00fc\u00e7l\u00fc ve esnek bir \u00f6zelliktir. Jinja2 \u015fablon motorunu kullanarak, dinamik yap\u0131land\u0131rma dosyalar\u0131 olu\u015fturabilir, kod tekrar\u0131n\u0131 ortadan kald\u0131rabilir, ortamlar aras\u0131nda tutarl\u0131l\u0131k sa\u011flayabilir ve karma\u015f\u0131k yap\u0131land\u0131rma g\u00f6revlerini basitle\u015ftirebiliriz. Bu makalede ele ald\u0131\u011f\u0131m\u0131z temel ve geli\u015fmi\u015f teknikler, Jinja2&#8217;nin de\u011fi\u015fkenler, ko\u015fullar, d\u00f6ng\u00fcler, filtreler ve makrolar gibi yeteneklerini kullanarak otomasyon s\u00fcre\u00e7lerinizi bir \u00fcst seviyeye ta\u015f\u0131man\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>\u015eablonlar\u0131 etkili bir \u015fekilde kullanarak, Ansible playbook&#8217;lar\u0131n\u0131z daha mod\u00fcler, okunabilir ve s\u00fcrd\u00fcr\u00fclebilir hale gelir. En iyi uygulamalar\u0131 takip etmek ve yayg\u0131n sorunlar\u0131n \u00fcstesinden gelmek, otomasyon projelerinizin ba\u015far\u0131s\u0131 i\u00e7in kritik \u00f6neme sahiptir. Ansible&#8217;\u0131n \u015fablonlama g\u00fcc\u00fcnden tam olarak yararlanarak, altyap\u0131 y\u00f6netim s\u00fcre\u00e7lerinizi daha verimli, daha g\u00fcvenilir ve daha tutarl\u0131 hale getirebilirsiniz. Unutmay\u0131n, iyi tasarlanm\u0131\u015f bir \u015fablon, say\u0131s\u0131z manuel yap\u0131land\u0131rma hatas\u0131n\u0131 ve zaman kayb\u0131n\u0131 \u00f6nleyebilir.<\/p>\n","protected":false},"excerpt":{"rendered":"Ansible Playbook&#8217;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma\nGiri\u015f\nModern altyap\u0131 y\u00f6netiminde otomasyon, tutarl\u0131l\u0131k ve verimlilik vaz","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-36514","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ansible Playbook&#039;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ansible Playbook&#039;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma\" \/>\n<meta property=\"og:description\" content=\"Ansible Playbook&#039;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma Giri\u015f Modern altyap\u0131 y\u00f6netiminde otomasyon, tutarl\u0131l\u0131k ve verimlilik vaz\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-19T02:40:47+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ansible Playbook&#8217;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma\",\"datePublished\":\"2025-12-19T02:40:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/\"},\"wordCount\":2642,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/\",\"name\":\"Ansible Playbook'larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-19T02:40:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ansible Playbook&#8217;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Ansible Playbook'larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/","og_locale":"tr_TR","og_type":"article","og_title":"Ansible Playbook'larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma","og_description":"Ansible Playbook'larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma Giri\u015f Modern altyap\u0131 y\u00f6netiminde otomasyon, tutarl\u0131l\u0131k ve verimlilik vaz","og_url":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-19T02:40:47+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ansible Playbook&#8217;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma","datePublished":"2025-12-19T02:40:47+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/"},"wordCount":2642,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/","url":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/","name":"Ansible Playbook'larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-19T02:40:47+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ansible-playbooklarda-sablonlari-templates-olusturma-ve-kullanma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ansible Playbook&#8217;larda \u015eablonlar\u0131 (Templates) Olu\u015fturma ve Kullanma"}]},{"@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\/36514","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=36514"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36514\/revisions"}],"predecessor-version":[{"id":36515,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36514\/revisions\/36515"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}