Wyszukiwanie w witrynie

Jak tworzyć szablony w Ansible w celu tworzenia konfiguracji na zarządzanych węzłach – część 7


W tej Części 7 serii Ansible dowiesz się, jak tworzyć i używać szablonów w Ansible do tworzenia niestandardowych konfiguracji na zarządzanych węzłach. Tworzenie szablonów w Ansible to łatwy i przyjazny sposób przesyłania niestandardowych konfiguracji do zarządzanych węzłów z różnymi systemami przy minimalnej edycji plików podręcznika.

Co to jest szablonowanie w Ansible?

Aby lepiej zrozumieć, czym jest szablon, przyjrzyjmy się menedżerowi IT przygotowującemu wiadomość e-mail z zaproszeniem swojego działu na przyjęcie koktajlowe. E-mail jest wysyłany do każdego z członków i zaprasza go również do oznaczania się wraz ze swoimi współmałżonkami.

Wiadomość e-mail została dostosowana w taki sposób, że treść wiadomości pozostaje taka sama, ale adresaci i imiona ich małżonków są różne. Wiadomość e-mail staje się szablonem, natomiast odbiorcy i poszczególni małżonkowie są zmiennymi.

To był ogólny przykład. Ansible używa Jinja2, który jest nowoczesnym silnikiem szablonów dla frameworków Pythona używanym do generowania dynamicznej treści lub wyrażeń. Szablonowanie jest niezwykle przydatne podczas tworzenia niestandardowych plików konfiguracyjnych dla wielu serwerów, ale unikalnych dla każdego z nich.

Jinja2 używa podwójnych nawiasów klamrowych {{ ... } do ujęcia zdefiniowanej zmiennej. W przypadku komentarzy użyj {{# #}, a w przypadku instrukcji warunkowych użyj {% … %.

Załóżmy, że masz model danych sieci VLAN w swojej sieci z systemami hostów, które chcesz przekazać do odpowiednich sieci VLAN, jak pokazano.

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

Aby wyrenderować tę konfigurację, pojawi się odpowiedni szablon jinja2 o nazwie vlans.j2, jak pokazano. Jak widać, zmienne vlan.id i vlan.name zostały ujęte w nawiasy klamrowe.

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

Łącząc wszystko w podręczniku, w którym umieszczane są różne komputery-hosty, wyglądałoby to tak, jak pokazano:

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

Przykład 1: Konfigurowanie serwerów WWW w różnych dystrybucjach

W tym przykładzie utworzymy pliki index.html, które będą wyświetlać informacje o nazwie hosta i systemie operacyjnym 2 serwerów internetowych z systemem CentOS i Ubuntu .

Organizować coś

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

Serwer WWW Apache został już zainstalowany na obu serwerach.

Dla CentOS 7

Dla Ubuntu 18.04

Stwórzmy więc podręcznik test_server.yml, jak pokazano:

---

 - hosts: all
   become: yes

   tasks:

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

Nasz szablon pliku Jinja to index.html.j2, który zostanie przesłany do pliku index.html na każdym serwerze internetowym. Zawsze pamiętaj o dodaniu rozszerzenia .j2 na końcu, aby zaznaczyć, że jest to plik jinja2.

Utwórzmy teraz plik szablonu index.html.j2.

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

Ten szablon to podstawowy plik HTML, w którym ansible_hostname i ansible_os_family to wbudowane zmienne, które zostaną zastąpione odpowiednimi nazwami hostów i systemami operacyjnymi poszczególnych serwerów internetowych w przeglądarce.

Teraz uruchommy podręcznik.

ansible-playbook test_server.yml

Teraz załadujmy ponownie strony internetowe serwerów CentOS 7 i Ubuntu.

Dla CentOS 7

Dla Ubuntu 18.04

Jak widać, na każdym serwerze zostały wyświetlone różne informacje o nazwie hosta i rodzinie systemów operacyjnych. I właśnie takie fajne jest szablonowanie Jinja2!

FILTRY:

Czasami możesz zdecydować się na zastąpienie wartości zmiennej ciągiem znaków, który pojawia się w określony sposób.

Przykład 1: Spraw, aby ciągi znaków były pisane wielkimi i małymi literami

Na przykład w poprzednim przykładzie możemy zdecydować, że zmienne Ansible będą wyświetlane wielkimi literami. Aby to zrobić, dołącz wartość górną do zmiennej. W ten sposób wartość zmiennej jest konwertowana do formatu wielkich liter.

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

Podobnie możesz przekonwertować wynik ciągu na małe litery, dodając dolny argument.

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

Przykład 2: Zamień ciąg na inny

Dodatkowo możesz zastąpić ciąg innym.

Na przykład:

Tytuł filmu to {{ movie_name }} => Tytuł filmu to Pierścień.

Aby zastąpić wynik innym ciągiem, użyj argumentu zamiany, jak pokazano:

Tytuł filmu to {{ nazwa_filmu | zamień („Pierścień”, „Napad”) }} => Tytuł filmu to Napad.

Przykład 3: Listy i zestawy filtrów

Aby pobrać najmniejszą wartość w tablicy, użyj filtra min.

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

Podobnie, aby uzyskać największą liczbę, użyj filtra max.

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

Aby wyświetlić unikalne wartości, użyj filtra unikalne.

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

Użyj filtra losowego, aby uzyskać losową liczbę z zakresu od 0 do wartości.

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

PĘTLE:

Podobnie jak w językach programowania, w Ansible Jinja2 mamy pętle.

Na przykład, aby wygenerować plik zawierający listę liczb, użyj pętli for, jak pokazano w poniższym przykładzie:

Przykład 1:

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

Możesz także połączyć pętlę for z instrukcjami if-else, aby filtrować i uzyskiwać określone wartości.

Przykład 2:

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

I to tyle w tym wykładzie. Dołącz do nas w następnym temacie, w którym odważymy się pracować ze zmiennymi ansible i faktami.