Sådan oprettes skabeloner, der er egnede til at oprette konfigurationer på administrerede noder - del 7


I denne del 7 af Ansible Series lærer du, hvordan du opretter og bruger skabeloner i Ansible til at oprette tilpassede konfigurationer på administrerede noder. Templating i Ansible er en nem og venlig måde at skubbe brugerdefinerede konfigurationer til administrerede noder, der kører forskellige systemer med minimal redigering af playbook-filer.

For at få en bedre forståelse af, hvad en skabelon er, skal vi overveje, at en IT-manager udarbejder en e-mail for at invitere sin afdeling til et cocktailparty. E-mailen sendes til hvert af medlemmerne og opfordrer dem også til at tagge sammen med deres ægtefæller.

E-mailen er tilpasset således, at e-mailens krop forbliver den samme, men adressaterne og navnene på deres respektive ægtefæller varierer. E-mailen bliver skabelonen, mens modtagere og respektive ægtefæller er variabler.

Det var et generisk eksempel. Ansible bruger Jinja2, som er en moderne skabelonmotor til Python-rammer, der bruges til at generere dynamisk indhold eller udtryk. Skabeloner er ekstremt nyttigt, når du opretter tilpassede konfigurationsfiler til flere servere, men unikke for hver af dem.

Jinja2 bruger de dobbelte krøllede seler {{...}} til at vedlægge en variabel, der er defineret. Brug {{# #} til kommentarer, og brug betingede udsagn {%…%} .

Lad os antage, at du har en datamodel af VLAN'er i dit netværk med værtssystemer, som du vil skubbe 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 at gengive denne konfiguration vises den tilsvarende jinja2-skabelon kaldet vlans.j2 som vist. Som du kan se, er variablerne vlan.id og vlan.name lukket i krøllede seler.

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

Sætter det hele sammen i en playbook, der placerer forskellige værtsmaskiner, ser dette ud som vist:

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

Eksempel 1: Konfiguration af webservere i forskellige distributioner

I dette eksempel opretter vi index.html-filer, der viser oplysninger om værtsnavnet og OS på 2 webservere, der kører CentOS & Ubuntu.

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

Apache webserver er allerede installeret på begge servere.

Så lad os oprette 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

Vores Jinja-filskabelon er index.html.j2, som skubbes til index.html-filen på hver webserver. Husk altid at sætte udvidelsen .j2 i slutningen for at angive, at det er en jinja2-fil.

Lad os nu oprette skabelonfilen 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 skabelon er en grundlæggende HTML-fil, hvor ansible_hostname og ansible_os_family er indbyggede variabler, der erstattes med de respektive værtsnavne og operativsystemer for de enkelte webservere i browseren.

Lad os nu køre playbook.

# ansible-playbook test_server.yml

Lad os nu genindlæse websiderne for både CentOS 7 og Ubuntu webservere.

Som du kan se, er forskellige oplysninger om værtsnavnet og familien til OS blevet vist på hver server. Og sådan er cool Jinja2-skabeloner!

FILTER:

Nogle gange kan du beslutte at erstatte værdien af en variabel med en streng, der vises på en bestemt måde.

I det forrige eksempel kan vi f.eks. Beslutte at få de synlige variabler til at blive vist i store bogstaver. For at gøre dette skal du føje den øverste værdi til variablen. På denne måde konverteres værdien i variablen til store bogstaver.

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

På samme måde kan du konvertere strengoutputtet til små bogstaver ved at tilføje det lavere argument.

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

Derudover kan du erstatte en streng med en anden.

For eksempel:

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

For at erstatte output med en anden streng skal du bruge erstatningsargumentet som vist:

Filmtitlen er {{movie_name | erstatte (“Ring“, ”Heist”)}} => Filmtitlen er Heist.

Brug min-filteret til at hente den mindste værdi i en matrix.

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

På samme måde skal du bruge max-filteret for at hente det største antal.

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

Brug det unikke filter for at få vist unikke værdier.

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

Brug tilfældigt filter til at få et tilfældigt tal mellem 0 og værdien.

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

LOOPS:

Ligesom i programmeringssprog har vi sløjfer i Ansible Jinja2.

For eksempel, for at generere en fil, der indeholder en liste over numre, skal du bruge for-loop som vist i eksemplet nedenfor:

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

Du kan også kombinere for-loop med if-else-udsagn for at filtrere og opnå bestemte værdier.

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

Og det er det til dette foredrag. Deltag i det næste emne, hvor vi vil vove os med at arbejde med synlige variabler og fakta.