Yönetilen Düğümlerde Konfigürasyonlar Oluşturmak için Ansible'da Şablonlar Nasıl Oluşturulur - Bölüm 7


Ansible Serisinin bu Bölüm 7'sinde, yönetilen düğümlerde özelleştirilmiş yapılandırmalar oluşturmak için Ansible'da şablonların nasıl oluşturulacağını ve kullanılacağını öğreneceksiniz. Ansible'da şablon oluşturma, özel yapılandırmaları farklı sistemler çalıştıran yönetilen düğümlere, oyun kitabı dosyalarında minimum düzeyde düzenleme yaparak aktarmanın kolay ve kolay bir yoludur.

Ansible'da Şablon Oluşturma Nedir?

Şablonun ne olduğunu daha iyi anlayabilmek için, bir BT yöneticisinin departmanını bir kokteyl partisine davet etmek üzere bir e-posta taslağı hazırladığını düşünelim. E-posta üyelerin her birine gönderilir ve onları eşleriyle birlikte etiketlemeye davet eder.

E-posta, e-postanın gövdesi aynı kalacak şekilde özelleştirilmiştir ancak muhatapları ve eşlerinin isimleri farklılık göstermektedir. E-posta şablon haline gelirken, alıcılar ve ilgili eşler değişkenlerdir.

Bu genel bir örnekti. Ansible, dinamik içerik veya ifadeler oluşturmak için kullanılan Python çerçevelerine yönelik modern bir şablon oluşturma motoru olan Jinja2'yi kullanır. Şablon oluşturma, birden fazla sunucu için özel yapılandırma dosyaları oluştururken son derece kullanışlıdır ancak her biri için benzersizdir.

Jinja2, tanımlanmış bir değişkeni içine almak için çift küme parantezini {{ ... } kullanır. Yorumlar için {{# # kullanın ve koşullu ifadeler için {% … % kullanın.

Ağınızda, gösterildiği gibi ilgili VLAN'lara aktarmak istediğiniz ana bilgisayar sistemlerine sahip bir VLAN veri modelinizin olduğunu varsayalım.

vlans:
  - id: 10
    name: LB
  - id: 20
    name: WB_01
  - id: 30
    name: WB_02
  - id: 40
    name: DB

Bu yapılandırmayı oluşturmak için vlans.j2 adlı ilgili jinja2 şablonu gösterildiği gibi görünecektir. Gördüğünüz gibi vlan.id ve vlan.name değişkenleri küme parantezleri içine alınmıştır.

vlan {{ vlan.id }}
  name {{ vlan.name }}

Hepsini farklı ana makineleri yerleştiren bir oyun kitabında bir araya getirirsek, aşağıdaki gibi görünecektir:

    - hosts
  tasks:
    - name: Rendering VLAN configuration
      template:
         src: vlans.j2
         dest: "vlan_configs/{{ inventory_hostname }}.conf"

Örnek 1: Web Sunucularını Farklı Dağıtımlarda Yapılandırma

Bu örnekte, CentOS ve Ubuntu çalıştıran 2 web sunucusunun ana bilgisayar adı ve işletim sistemi hakkındaki bilgileri görüntüleyecek index.html dosyaları oluşturacağız. .

Kurmak

Ubuntu 18 - IP address: 173.82.202.239
CentOS 7 -  IP address: 173.82.115.165

Apache web sunucusu her iki sunucuya da zaten yüklenmiştir.

CentOS 7 için

Ubuntu 18.04 için

Şimdi gösterildiği gibi bir test_server.yml başucu kitabı oluşturalım:

---

 - hosts: all
   become: yes

   tasks:

    - name: Install index.html
      template:
        src: index.html.j2
        dest: /var/www/html/index.html
        mode: 0777

Jinja dosya şablonumuz index.html.j2'dir ve her web sunucusundaki index.html dosyasına aktarılacaktır. Bunun bir jinja2 dosyası olduğunu belirtmek için sonuna her zaman .j2 uzantısını koymayı unutmayın.

Şimdi index.html.j2 şablon dosyasını oluşturalım.

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

Bu şablon, ansible_hostname ve ansible_os_family'in, tarayıcıdaki ayrı web sunucularının ilgili ana bilgisayar adları ve işletim sistemleriyle değiştirilecek yerleşik değişkenler olduğu temel bir HTML dosyasıdır.

Şimdi başucu kitabını çalıştıralım.

ansible-playbook test_server.yml

Şimdi hem CentOS 7 hem de Ubuntu web sunucuları için web sayfalarını yeniden yükleyelim.

CentOS 7 için

Ubuntu 18.04 için

Gördüğünüz gibi, her sunucuda ana bilgisayar adı ve işletim sistemi ailesi hakkında farklı bilgiler görüntüleniyor. Jinja2 şablonlaması işte bu kadar harika!

FİLTRELER:

Bazen bir değişkenin değerini belirli bir şekilde görünen bir dizeyle değiştirmeye karar verebilirsiniz.

Örnek 1: Dizelerin Büyük/Küçük Harfte Görünmesini Sağlayın

Örneğin önceki örnekte Ansible değişkenlerinin Büyük harfle görünmesine karar verebiliriz. Bunu yapmak için değişkenin üst değerini ekleyin. Bu şekilde değişkendeki değer Büyük harf formatına dönüştürülür.

{{ ansible_hostname | upper }} => CENTOS 7
{{ ansible_os_family | upper }} => REDHAT

Benzer şekilde, alt argümanı ekleyerek dize çıktısını küçük harfe dönüştürebilirsiniz.

{{ ansible_hostname | lower }}  => centos 7
{{ ansible_os_family | lower }} => redhat

Örnek 2: Bir Dizeyi Başka Bir Dizeyle Değiştirme

Ayrıca bir dizeyi başka bir dizeyle değiştirebilirsiniz.

Örneğin:

Filmin adı {{ movie_name }} => Filmin adı Ring.

Çıktıyı başka bir dizeyle değiştirmek için, değiştirme bağımsız değişkenini gösterildiği gibi kullanın:

Filmin adı {{ movie_name | değiştirin (“Ring“, ”Heist ”) }} => Filmin adı Heist.

Örnek 3: Filtreleri Listeleme ve Ayarlama

Bir dizideki en küçük değeri almak için min filtresini kullanın.

{{ [ 2, 3, 4, 5, 6, 7 ] | min }}	=>	2

Benzer şekilde, en büyük sayıyı almak için maksimum filtresini kullanın.

{{ [ 2, 3, 4, 5, 6, 7 ] | max }}	=>	7

Benzersiz değerleri görüntülemek için benzersiz filtresini kullanın.

{{ [ 2, 3, 3, 2, 6, 7 ] | unique }} =>	2, 3

0 ile değer arasında rastgele bir sayı elde etmek için rastgele filtresini kullanın.

{{ 50 | random }} =>  Some random number

DÖNGÜLER:

Tıpkı programlama dillerinde olduğu gibi Ansible Jinja2'de de döngüler vardır.

Örneğin, sayıların listesini içeren bir dosya oluşturmak için aşağıdaki örnekte gösterildiği gibi for döngüsünü kullanın:

Örnek 1:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{{ number }}
{% end for %}

Belirli değerleri filtrelemek ve elde etmek için for döngüsünü if-else ifadeleriyle de birleştirebilirsiniz.

Örnek 2:

{% for number in [0, 1, 2, 3, 4, 5, 6, 7]  %}
{% if number == 5 %}
         {{ number }}
{% endif%}
{% endfor %}

Bu derste bu kadar. Anlaşılabilir değişkenler ve gerçeklerle çalışmaya girişeceğimiz bir sonraki konuda bize katılın.