Vyhledávání na webu

Jak vytvářet šablony v Ansible pro vytváření konfigurací na spravovaných uzlech – část 7


V této 7. části série Ansible se naučíte, jak vytvářet a používat šablony v Ansible k vytváření přizpůsobených konfigurací na spravovaných uzlech. Šablony v Ansible je snadný a přátelský způsob, jak posílat vlastní konfigurace spravovaným uzlům s různými systémy s minimálními úpravami souborů playbooků.

Co je šablonování v Ansible?

Chcete-li získat lepší představu o tom, co je šablona, uvažujme IT manažera, který navrhuje e-mail, aby pozval své oddělení na koktejl. E-mail je zaslán každému z členů a také je vyzve, aby označili spolu se svými manželi.

E-mail byl upraven tak, že tělo e-mailu zůstává stejné, ale liší se adresáti a jména jejich manželů. E-mail se stane šablonou, zatímco příjemci a příslušní manželé jsou proměnnými.

To byl obecný příklad. Ansible používá Jinja2, což je moderní šablonovací engine pro Python frameworky používaný ke generování dynamického obsahu nebo výrazů. Šablony jsou mimořádně užitečné při vytváření vlastních konfiguračních souborů pro více serverů, ale pro každý z nich jsou jedinečné.

Jinja2 používá dvojité složené závorky {{ ... }} k uzavření proměnné, která byla definována. Pro komentáře použijte {{# #} a pro podmíněné příkazy použijte {% … %}.

Předpokládejme, že máte ve své síti datový model VLAN s hostitelskými systémy, které chcete odeslat do příslušných VLAN, jak je znázorněno.

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

Pro vykreslení této konfigurace se zobrazí odpovídající šablona jinja2 s názvem vlans.j2, jak je znázorněno. Jak vidíte, proměnné vlan.id a vlan.name byly uzavřeny do složených závorek.

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

Když to všechno dáte dohromady do playbooku, který umístí různé hostitelské stroje, vypadalo by to takto:

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

Příklad 1: Konfigurace webových serverů v různých distribucích

V tomto příkladu vytvoříme soubory index.html, které budou zobrazovat informace o názvu hostitele a OS 2 webových serverů se systémem CentOS a Ubuntu .

Založit

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

Webový server Apache je již nainstalován na obou serverech.

Pro CentOS 7

Pro Ubuntu 18.04

Vytvořme tedy playbook test_server.yml, jak je znázorněno:

---

 - hosts: all
   become: yes

   tasks:

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

Naše šablona souboru Jinja je index.html.j2, která bude přenesena do souboru index.html na každém webovém serveru. Vždy nezapomeňte na konec přidat příponu .j2, která označuje, že se jedná o soubor jinja2.

Nyní vytvoříme soubor šablony 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>

Tato šablona je základní soubor HTML, kde ansible_hostname a ansible_os_family jsou vestavěné proměnné, které budou nahrazeny příslušnými názvy hostitelů a operačními systémy jednotlivých webových serverů v prohlížeči.

Nyní spustíme učebnici.

ansible-playbook test_server.yml

Nyní znovu načteme webové stránky pro webový server CentOS 7 a Ubuntu.

Pro CentOS 7

Pro Ubuntu 18.04

Jak vidíte, na každém serveru byly zobrazeny různé informace o názvu hostitele a rodině OS. A tak skvělé jsou šablony Jinja2!

FILTRY:

Někdy se můžete rozhodnout nahradit hodnotu proměnné řetězcem, který se objeví určitým způsobem.

Příklad 1: Zajistěte, aby se řetězce zobrazovaly jako velká/malá písmena

Například v předchozím příkladu se můžeme rozhodnout, že se proměnné Ansible budou zobrazovat jako velká písmena. Chcete-li to provést, připojte k proměnné hodnotu nahoře. Tímto způsobem se hodnota v proměnné převede na velká písmena.

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

Podobně můžete výstup řetězce převést na malá písmena připojením spodního argumentu.

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

Příklad 2: Nahraďte řetězec jiným

Kromě toho můžete řetězec nahradit jiným.

Například:

Název filmu je {{ movie_name }} => Název filmu je Ring.

Chcete-li nahradit výstup jiným řetězcem, použijte argument nahradit, jak je znázorněno:

Název filmu je {{ movie_name | nahradit (“Ring“, ”Heist ”) }} => Název filmu je Heist.

Příklad 3: Seznamy a sady filtrů

Chcete-li načíst nejmenší hodnotu v poli, použijte filtr min.

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

Podobně, chcete-li získat největší číslo, použijte filtr max.

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

Chcete-li zobrazit jedinečné hodnoty, použijte filtr unikátní.

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

Pomocí filtru náhodné získáte náhodné číslo mezi 0 a hodnotou.

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

SMYČKY:

Stejně jako v programovacích jazycích máme v Ansible Jinja2 smyčky.

Chcete-li například vygenerovat soubor obsahující seznam čísel, použijte cyklus for, jak je znázorněno v příkladu níže:

Příklad 1:

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

Můžete také kombinovat cyklus for s příkazy if-else a filtrovat a získat určité hodnoty.

Příklad 2:

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

A to je pro tuto přednášku vše. Přidejte se k nám v dalším tématu, kde se pustíme do práce s dostupnými proměnnými a fakty.