Hvordan lage maler i Ansible for å lage konfigurasjoner på administrerte noder - Del 7


I denne del 7 av Ansible-serien lærer du hvordan du oppretter og bruker maler i Ansible for å lage tilpassede konfigurasjoner på administrerte noder. Maling i Ansible er en enkel og vennlig måte å skyve tilpassede konfigurasjoner til administrerte noder som kjører forskjellige systemer med minimal redigering av playbook-filer.

For å få en bedre forståelse av hva en mal er, la oss vurdere en IT-sjef som lager en e-post for å invitere avdelingen sin til et cocktailparty. E-posten sendes til hvert av medlemmene og inviterer dem også til å tagge sammen med ektefellene sine.

E-posten er tilpasset slik at e-postteksten forblir den samme, men adressatene og navnene på deres respektive ektefeller varierer. E-posten blir malen, mens mottakerne og respektive ektefeller er variabler.

Det var et generisk eksempel. Ansible bruker Jinja2 som er en moderne malmotor for Python-rammeverk som brukes til å generere dynamisk innhold eller uttrykk. Maling er ekstremt nyttig når du lager tilpassede konfigurasjonsfiler for flere servere, men unikt for hver av dem.

Jinja2 bruker de doble krøllete klammeparentesene {{ ... }} for å omslutte en variabel som er definert. For kommentarer, bruk {{# #} og for betingede utsagn, bruk {% … %}.

La oss anta at du har en datamodell av VLAN-er i nettverket ditt med vertssystemer som du vil sende til deres respektive VLAN-er som vist.

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

For å gjengi denne konfigurasjonen vil den tilsvarende jinja2-malen kalt vlans.j2 vises som vist. Som du kan se, har variablene vlan.id og vlan.name blitt omsluttet av krøllete klammeparenteser.

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

Ved å sette det hele sammen i en spillebok som plasserer forskjellige vertsmaskiner, vil dette se ut som vist:

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

Eksempel 1: Konfigurering av webservere i forskjellige distros

I dette eksemplet skal vi lage index.html-filer som viser informasjon om vertsnavnet og operativsystemet til 2 webservere som kjører CentOS og Ubuntu.

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

Apache webserver er allerede installert på begge serverne.

Så la oss lage en playbook test_server.yml som vist:

---

 - hosts: all
   become: yes

   tasks:

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

Vår Jinja-filmal er index.html.j2 som vil bli presset til index.html-filen på hver webserver. Husk alltid å sette filtypen .j2 på slutten for å indikere at det er en jinja2-fil.

La oss nå lage malfilen 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>

Denne malen er en grunnleggende HTML-fil der ansible_hostname og ansible_os_family er innebygde variabler som vil bli erstattet med de respektive vertsnavnene og operativsystemene til de enkelte webserverne i nettleseren.

Nå, la oss kjøre lekeboken.

# ansible-playbook test_server.yml

La oss nå laste inn nettsidene på nytt for både CentOS 7 og Ubuntu webservere.

Som du kan se, har forskjellig informasjon om vertsnavnet og familien til OS blitt vist på hver server. Og det er hvor kult Jinja2-maler er!

FILTRE:

Noen ganger kan du bestemme deg for å erstatte verdien til en variabel med en streng som vises på en bestemt måte.

For eksempel, i det forrige eksemplet, kan vi bestemme oss for å få Ansible-variablene til å vises med store bokstaver. For å gjøre det, legg til verdien øverst til variabelen. På denne måten konverteres verdien i variabelen til formatet store bokstaver.

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

På samme måte kan du konvertere strengutdataene til små bokstaver ved å legge til det nedre argumentet.

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

I tillegg kan du erstatte en streng med en annen.

For eksempel:

Filmtittelen er {{ movie_name }} => Filmtittelen er Ring.

For å erstatte utdataene med en annen streng, bruk erstatningsargumentet som vist:

Filmtittelen er {{ movie_name | replace (\Ring\,,Heist) }} => Filmtittelen er Heist.

For å hente den minste verdien i en matrise, bruk min-filteret.

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

På samme måte, for å hente det største antallet, bruk maks-filteret.

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

For å vise unike verdier, bruk det unike filteret.

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

Bruk tilfeldig filter for å få et tilfeldig tall mellom 0 og verdien.

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

SLØKKER:

Akkurat som i programmeringsspråk, har vi loops i Ansible Jinja2.

For å generere en fil som inneholder en liste med tall, bruk for-løkken som vist i eksemplet nedenfor:

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

Du kan også kombinere for-løkken med if-else-setninger for å filtrere og oppnå visse verdier.

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

Og det var det for dette foredraget. Bli med oss i neste emne hvor vi skal begi oss ut i arbeid med mulige variabler og fakta.