Introduction to Templating
1. Templating Nedir?
Templating (şablonlama), “içinde değişken yerler olan bir iskelet dosya” ile “bu değişkenlere atanacak gerçek değerleri” birleştirerek, istenen tam metin (ör. bir konfig dosyası, HTML sayfası, e-posta vs.) oluşturma işidir.
Örnek: CEO’nun herkese gönderdiği davetiye e-postası bir şablondur (Hi {{ employee_name }}...
). E-posta gönderirken employee_name
yerine “John”, “Mary” gibi farklı değerler konur.
2. Jinja2 Nedir, Ansible’da Nasıl Kullanılır?
Jinja2: Python tabanlı bir templating motorudur. Ansible, şablon dosyalarını (
.j2
uzantılı) Jinja2 ile yorumlayarak değişkenleri yerleştirir.Ansible Playbook’ta “template:” modülü ile Jinja2 şablonunu uzak sunucuya render edip kopyalayabilirsiniz. Bu sayede “dinamik” konfig dosyaları veya scriptler oluşturabilirsiniz.
3. Basit Değişken Yerleştirme
Playbook’ta:
my_template.j2
içinde{{ my_name }}
kullandık.Vars (
my_name: "Bond"
) Ansible tarafından şablona yerleştirilir.Sonuç dosyada:
The name is Bond!
4. Filtreler ve Dönüşümler
Jinja2’de |
(pipe) ile çeşitli filtreler kullanabilirsiniz.
Metin Dönüşümleri
my_name
değerini büyük harfe çevirir ("BOND"
).Ayrıca
lower
,title
,replace("Bond","Bourne")
gibi filtreler de var.
Varsayılan Değer
Eğer
first_name
tanımlı değilse"James"
kullanır, aksi haldefirst_name
’in değerini alır.
Liste İşlemleri
nums
bir liste olduğunda,min
,max
,unique
gibi filtrelerle listeyi işleyebilirsiniz.
5. Koşullar ve Döngüler
Jinja2, “{% ... %}” blok sözdizimiyle if, for gibi yapıların kullanımını sağlar.
Döngü (for)
Bu,
my_list
içindeki elemanları tek tek yazar.
Koşul (if)
“number” değişkeni 2 ise “This is 2” yazar, değilse “Not 2”.
Örnek Geniş – Bir şablon:
Varsayılan: innodb=true, datadir="/var/lib/mysql"
Render sonunda:
Bu senaryoda, bir veritabanı sunucusunda (db_servers
) MySQL konfigürasyon dosyasını Jinja2 şablonuyla nasıl otomatik oluşturabileceğimizi göreceksiniz. Ardından dosya güncellenirse, MySQL servisini yeniden başlatacak bir handler tetikliyoruz.
1. Dizini ve Dosyaları Hazırlama
Projenizde (örneğin my-ansible-project/
klasörünüzde) bir playbook (örn. playbook.yml
) ve bir templates klasörü oluşturabilirsiniz:
templates/config_file.j2
: Jinja2 şablon dosyası (içinde değişken kullanabilirsiniz).playbook.yml
: Ansible Playbook, hangi hostlara ve nasıl uygulayacağınızı belirtiyorsunuz.
2. Jinja2 Şablonu (config_file.j2)
Örnek bir MySQL konfig dosyası şablonu:
Açıklama:
{{ datadir }}
ve{{ innodb }}
gibi değerler, Playbook veya vars içindeki değişkenlere göre doldurulacak.innodb
değişkeni true iseinnodb_buffer_pool_size=1G
satırı yazılacak, yoksa atlanacak.
3. Playbook Yapısı (playbook.yml)
Örnek bir playbook:
hosts: db_servers
db_servers
grubunda tanımlı sunuculara bu işlemleri uyguluyoruz.
vars
innodb
vedatadir
değişkenlerini tanımlıyoruz. (Örneğininnodb: true
dedik, bu şablonun if bloğunu etkinleştirecek.)
tasks
template modülü:
src: config_file.j2
: Ansible controller (bu makine) üzerindekitemplates/
klasöründeki Jinja2 şablon dosyamız.dest: /etc/mysql/my.cnf
: Uzaktaki hedeften (db sunucusu) nereye kopyalanacağını gösterir.
notify: Restart MySQL
=> Bu görev bir değişiklik yaptığında (“changed”), aşağıdakihandlers
bölümündeki “Restart MySQL” tetiklenecek.
handlers
Restart MySQL
: Bir “service” modülü ile MySQL servisini yeniden başlatır.Sadece template görevinde gerçekten dosya içeriği değiştiyse (“changed” olarak raporlanırsa) handler tetiklenir.
4. Çalıştırma ve Mantık
Ansible,
config_file.j2
dosyasını okumak için vars (innodb: true
,datadir: "/var/lib/mysql"
) değerlerini şablona uygular.Oluşan render edilmiş metin
/etc/mysql/my.cnf
olarak db sunucusuna kopyalanır.Örnek final içerik:
Eğer dosya içerik olarak önceki hâlinden farklıysa (gerçek bir değişiklik olduysa), “changed” olarak işaretlenir, dolayısıyla
notify: Restart MySQL
devreye girer.Handler, MySQL servisini restarted duruma getirir.
Sistematik Faydası:
Şablonun içinde Jinja2 ile “if/for/default vs.” yazabilir, parametrelere göre konfig dosyalarını esnekçe oluşturabilirsiniz.
“dosya değişti mi?” kontrolleri ve “servis restart” tetikleme mantığı size ek kod yazmadan, Ansible’ın built-in “change detection” özelliğiyle otomatikleşir.
Özet
Bu örnekte, Ansible template modülü ile bir MySQL konfig dosyasını Jinja2 şablonundan oluşturup hedef sunucuya kopyaladık. Varsayılan ayarlarla ya da playbook içi vars’larla (innodb
, datadir
gibi) dinamik bir dosya yaratıp, eğer bir değişiklik olduysa MySQL’i otomatik yeniden başlattık.
Özellikle koşullar (if) ve değişkenler ({{ ... }}
) sayesinde tek bir .j2
şablon dosyasını birçok farklı senaryoda kullanabilirsiniz. Bu, büyük yapılandırma yönetiminde kod tekrarını azaltır ve yönettiğiniz sistemlerde konsistensi ve kolay bakımı sağlar.
Last updated
Was this helpful?