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.