Kako ustvariti predloge v programu Ansible za ustvarjanje konfiguracij na upravljanih vozliščih - 7. del


V tem 7. delu Ansible Series boste izvedeli, kako ustvariti in uporabljati predloge v programu Ansible za ustvarjanje prilagojenih konfiguracij na upravljanih vozliščih. Predloge v programu Ansible so preprost in prijazen način potiskanja konfiguracij po meri na upravljana vozlišča z različnimi sistemi z minimalnim urejanjem datotek playbook.

Da bi bolje razumeli, kaj je predloga, razmislimo o vodji IT, ki pripravi e-poštno sporočilo in povabi svoj oddelek na koktajl. E-poštno sporočilo se pošlje vsakemu članu in jih vabi, da označijo skupaj z zakoncema.

E-poštno sporočilo je bilo prilagojeno tako, da telo e-pošte ostaja enako, vendar se naslovniki in imena zakoncev razlikujejo. E-poštno sporočilo postane predloga, medtem ko sta prejemnika in zakonca spremenljivka.

To je bil splošen primer. Ansible uporablja Jinja2, ki je sodoben mehanizem za predloge za ogrodja Python, ki se uporabljajo za ustvarjanje dinamične vsebine ali izrazov. Predloge so zelo koristne pri ustvarjanju konfiguracijskih datotek po meri za več strežnikov, vendar edinstvene za vsakega od njih.

Jinja2 z dvojnimi zavitimi oklepaji {{...}} priloži spremenljivko, ki je bila definirana. Za komentarje uporabite {{# #} , za pogojne stavke pa {%…%} .

Predpostavimo, da imate v svojem omrežju podatkovni model omrežij VLAN z gostiteljskimi sistemi, ki jih želite potisniti v ustrezna omrežja VLAN, kot je prikazano.

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

Če želite upodobiti to konfiguracijo, se prikaže ustrezna predloga jinja2 z imenom vlans.j2, kot je prikazano. Kot vidite, sta spremenljivki vlan.id in vlan.name zaprti v zavite oklepaje.

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

Če vse skupaj združimo v knjigo iger, v katero so umeščeni različni gostiteljski stroji, bo to videti, kot je prikazano:

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

Primer 1: Konfiguriranje spletnih strežnikov v različnih distribucijah

V tem primeru bomo ustvarili datoteke index.html, ki bodo prikazovale informacije o imenu gostitelja in OS 2 spletnih strežnikov, v katerih se izvajata CentOS in Ubuntu.

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

Spletni strežnik Apache je že nameščen na obeh strežnikih.

Ustvarimo torej playbook test_server.yml, kot 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ša predloga datoteke Jinja je index.html.j2, ki bo potisnjena v datoteko index.html na vsakem spletnem strežniku. Vedno ne pozabite dodati končnice .j2 na konec, da označite, da gre za datoteko jinja2.

Ustvarimo zdaj datoteko s predlogo 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>

Ta predloga je osnovna datoteka HTML, v kateri sta vgrajeni spremenljivki ansible_hostname in ansible_os_family, ki ju bosta nadomestili z ustreznimi imeni gostiteljev in operacijskimi sistemi posameznih spletnih strežnikov v brskalniku.

Zdaj pa zaženimo knjigo iger.

# ansible-playbook test_server.yml

Zdaj znova naložimo spletne strani tako za spletne strežnike CentOS 7 kot za Ubuntu.

Kot lahko vidite, so na vsakem strežniku prikazane različne informacije o imenu gostitelja in družini OS. In tako čudovita je predloga Jinja2!

FILTRI:

Včasih se lahko odločite, da boste vrednost spremenljivke zamenjali z nizom, ki se prikaže na določen način.

Na primer, v prejšnjem primeru se lahko odločimo, da bodo spremenljivke Ansible prikazane z velikimi črkami. Če želite to narediti, spremenljivki dodajte zgornjo vrednost. Na ta način se vrednost v spremenljivki pretvori v veliko črko.

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

Podobno lahko pretvorite izhod niza v male črke, tako da dodate spodnji argument.

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

Poleg tega lahko niz zamenjate z drugim.

Na primer:

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

Če želite izhod zamenjati z drugim nizom, uporabite argument replace, kot je prikazano:

Naslov filma je {{ime_filma | replace (\ "Ring \", ”Heist”)}} => Naslov filma je Heist.

Če želite pridobiti najmanjšo vrednost v matriki, uporabite filter min.

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

Podobno, če želite pridobiti največje število, uporabite filter max.

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

Za prikaz enoličnih vrednosti uporabite edinstveni filter.

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

Z naključnim filtrom dobite naključno število med 0 in vrednostjo.

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

ZAMKE:

Tako kot v programskih jezikih imamo tudi v Ansible Jinja2 zanke.

Na primer, da ustvarite datoteko s seznamom številk, uporabite zanko for, kot je prikazano v spodnjem primeru:

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

Zanko for lahko kombinirate tudi z izjavami if-else za filtriranje in pridobivanje določenih vrednosti.

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

In to je to za to predavanje. Pridružite se nam v naslednji temi, kjer se bomo lotili dela z odgovornimi spremenljivkami in dejstvi.