Templating use cases
1) Statik Dosya Kopyalama vs. Dinamik Template
copy Modülü: Ansible’daki
copy
modülü, yerel makinedeki bir dosyayı hedef sunucuya olduğu gibi kopyalar. Bu yöntem, dosyanın içeriğinde değişken kullanıp “sunucuya göre özelleştirme” yapmanıza izin vermez.template Modülü: İşte burada devreye “template” gelir. Dosyanız Jinja2 şablon formatında hazırlanır ve Ansible, o şablondaki değişkenleri hedef sunucuya ait değerlerle doldurur.
Örnek İhtiyaç:
Web sunucusuna yerleştireceğimiz index.html
dosyasında, her sunucunun adını (hostname) dinamik olarak göstermek istiyoruz.
2) Jinja2 Şablonu Nedir?
Bir .j2
(veya .j2
uzantılı) dosyası düşünün. HTML, YAML, vb. herhangi bir metin formatında olabilir. İçinde Jinja2 sözdizimiyle değişken yerleştirebilirsiniz:
Burada {{ inventory_hostname }}
Ansible’ın otomatik sağladığı bir değişkendir. Hostun adını (ör. “web1”) koyar.
3) Ansible’da Template Modülü Kullanmak
Playbook Örneği:
Açıklama:
src: index.html.j2
→ Yereldeki Jinja2 şablonu (kaynak dosya).dest: /var/www/html/index.html
→ Hedef sunucuda oluşacak gerçek dosyanın konumu.Ansible,
index.html.j2
içindeki{{ inventory_hostname }}
gibi değişkenleri uygun değerlerle interpole (değiştirir) edip kopyalar.
4) Nasıl Çalışır?
Playbook çalıştığında:
Envanter (inventory) veya diğer değişken kaynaklarından (vars, group_vars, vb.) host bilgileri okunur.
Jinja2 Motoru:
index.html.j2
dosyasındaki{{ ... }}
yerlerine host özelindeki değerler konur.Sonuç: Her sunucuya farklı içerik sahip bir
index.html
kopyalanmış olur.Örnek: web1’de
This is web1 server.
, web2’deThis is web2 server.
yazar.
Bu şekilde copy
modülüyle ayrı ayrı “index_web1.html”, “index_web2.html” gibi dosyalar üretmek zorunda kalmazsınız. Tek bir şablon, tüm hostlar için uygun olacak şekilde değişkenlerle çalışır.
5) Biraz Daha Detay: Değişkenler, Filtreler, Koşullar
Jinja2 şablon içinde Ansible değişkenlerini kullanabilir, hatta Jinja2’ye ait filtreleri (| default
, | upper
vs.) veya if
, for
gibi yapıları kullanabilirsiniz.
a) Default Filtre Örneği
redis_port
tanımlanmazsa varsayılan 6379 kullanılır.
b) Döngü Örneği: resolv.conf
nameservers
bir liste olduğu varsayılırsa (ör.[ "8.8.8.8", "8.8.4.4" ]
), döngü her eleman için birnameserver
satırı ekler.
6) Şablon Dosyası Nereye Konur?
Basit projelerde, playbook’unuzla aynı dizinde veya “templates/” gibi klasörde tutabilirsiniz.
Roles kullanıyorsanız,
roles/myrole/templates/
altında saklamak best practice’tir.
Dosya Adı: .j2
uzantısı kullanmak (örn. index.html.j2
, nginx.conf.j2
) en iyisidir. Hem siz hem Ansible, bunun bir Jinja2 şablonu olduğunu hemen anlarsınız.
7) Uygulama Senaryoları
Web Sunucu:
index.html.j2
→ Her makinede farklı hostname görüntülemek.Nginx/Apache Config:
nginx.conf.j2
→ Farklı domain adları, portlar, SSL ayarları.Redis/MySQL Config:
redis.conf.j2
,my.cnf.j2
→ Her database sunucusuna farklı bellek, port ayarları, IP adresleri atama.Network Ayar Dosyaları:
resolv.conf.j2
ile dinamik DNS sunucuları ekleme.
Temel mantık hep aynı: Bir metin dosyası şablon (.j2
), içinde değişkenli kısımlar. Ansible, template:
modülüyle o değişkenleri doldurur ve dosyayı kopyalar.
8) Özet
Ansible copy modülü → Dosyayı değiştirmeden kopyalar.
Ansible template modülü → Dosyayı Jinja2 ile işler (değişkenleri yerleştirir), sonra kopyalar.
.j2 uzantılı dosyalar → Jinja2 şablonları. İçinde
{{ varname }}
veya{% ... %}
gibi ifade kullanabilirsiniz.inventory_hostname veya diğer Ansible değişkenleriyle her host’a özel içerik oluşturabilirsiniz.
Last updated
Was this helpful?