Kako stvoriti predloške u Ansibleu za stvaranje konfiguracija na upravljanim čvorovima - 7. dio


U ovom 7. dijelu serije Ansible naučit ćete kako izraditi i koristiti predloške u Ansibleu za stvaranje prilagođenih konfiguracija na upravljanim čvorovima. Templating u Ansibleu jednostavan je i prijateljski način guranja prilagođenih konfiguracija u upravljane čvorove koji pokreću različite sustave uz minimalno uređivanje datoteka playbook-a.

Što je šabloniranje u Ansibleu?

Da bismo bolje razumjeli što je predložak, zamislimo IT menadžera koji sastavlja e-poruku kojom poziva svoj odjel na koktel zabavu. E-poruka se šalje svakom od članova i također ih poziva da se označe zajedno sa svojim supružnicima.

E-pošta je prilagođena tako da tijelo e-pošte ostaje isto, ali se adresati i imena njihovih supružnika razlikuju. E-pošta postaje predložak, dok su primatelji i odgovarajući supružnici varijable.

To je bio generički primjer. Ansible koristi Jinja2 koji je moderan mehanizam za izradu predložaka za Python okvire koji se koriste za generiranje dinamičkog sadržaja ili izraza. Izrada predložaka je izuzetno korisna pri stvaranju prilagođenih konfiguracijskih datoteka za više poslužitelja, ali jedinstvenih za svakog od njih.

Jinja2 koristi dvostruke vitičaste zagrade {{ ... }} za uključivanje varijable koja je definirana. Za komentare upotrijebite {{# #}, a za uvjetne izjave upotrijebite {% … %}.

Pretpostavimo da imate podatkovni model VLAN-ova u svojoj mreži sa sustavima domaćina koje želite gurnuti u njihove odgovarajuće VLAN-ove kao što je prikazano.

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

Za prikaz ove konfiguracije pojavit će se odgovarajući predložak jinja2 pod nazivom vlans.j2 kao što je prikazano. Kao što vidite, varijable vlan.id i vlan.name stavljene su u vitičaste zagrade.

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

Stavljajući sve zajedno u priručnik koji postavlja različite host strojeve, ovo bi izgledalo kao što je prikazano:

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

Primjer 1: Konfiguriranje web poslužitelja u različitim distribucijama

U ovom primjeru stvorit ćemo datoteke index.html koje će prikazivati informacije o nazivu glavnog računala i OS-u 2 web poslužitelja koji pokreću CentOS i Ubuntu .

Postaviti

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

Apache web poslužitelj već je instaliran na oba poslužitelja.

Za CentOS 7

Za Ubuntu 18.04

Dakle, stvorimo priručnik test_server.yml kao što je prikazano:

---

 - hosts: all
   become: yes

   tasks:

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

Naš Jinja predložak datoteke je index.html.j2 koji će biti proslijeđen u datoteku index.html na svakom web poslužitelju. Uvijek ne zaboravite staviti ekstenziju .j2 na kraj kako biste označili da je to jinja2 datoteka.

Kreirajmo sada datoteku predloška 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>

Ovaj predložak je osnovna HTML datoteka u kojoj su ansible_hostname i ansible_os_family ugrađene varijable koje će biti zamijenjene odgovarajućim nazivima hostova i operativnim sustavima pojedinačnih web poslužitelja u pregledniku.

Sada, pokrenimo priručnik.

ansible-playbook test_server.yml

Sada ponovno učitajmo web stranice za CentOS 7 i Ubuntu web poslužitelje.

Za CentOS 7

Za Ubuntu 18.04

Kao što vidite, različite informacije o nazivu hosta i obitelji OS-a prikazane su na svakom poslužitelju. I tako je cool Jinja2 šabloniranje!

FILTERI:

Ponekad možete odlučiti zamijeniti vrijednost varijable nizom koji se pojavljuje na određeni način.

Primjer 1: Neka se nizovi prikazuju velikim/malim slovima

Na primjer, u prethodnom primjeru, možemo odlučiti da se Ansible varijable prikazuju velikim slovima. Da biste to učinili, dodajte gornju vrijednost varijabli. Na taj se način vrijednost u varijabli pretvara u format velikih slova.

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

Slično tome, možete pretvoriti izlaz niza u mala slova dodavanjem donjeg argumenta.

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

Primjer 2: Zamijenite niz drugim

Osim toga, niz možete zamijeniti drugim.

Na primjer:

Naslov filma je {{ movie_name }} => Naslov filma je Prsten.

Za zamjenu izlaza drugim nizom, upotrijebite argument zamjene kao što je prikazano:

Naslov filma je {{ movie_name | zamijeni (“Ring“, ”Heist ”) }} => Naslov filma je Heist.

Primjer 3: Popisi i skupovi filtara

Da biste dohvatili najmanju vrijednost u nizu, upotrijebite filtar min.

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

Slično, da biste dohvatili najveći broj, upotrijebite filtar max.

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

Za prikaz jedinstvenih vrijednosti upotrijebite filtar jedinstveno.

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

Upotrijebite nasumični filtar za dobivanje nasumičnog broja između 0 i vrijednosti.

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

PETLJE:

Baš kao u programskim jezicima, imamo petlje u Ansible Jinja2.

Na primjer, za generiranje datoteke koja sadrži popis brojeva koristite petlju for kao što je prikazano u primjeru ispod:

Primjer 1:

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

Također možete kombinirati for petlju s if-else izjavama za filtriranje i dobivanje određenih vrijednosti.

Primjer 2:

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

I to je to za ovo predavanje. Pridružite nam se u sljedećoj temi gdje ćemo se upustiti u rad s anzibilnim varijablama i činjenicama.