Wéi Schabloune erstellen Ansible fir Konfiguratiounen op verwalteten Noden ze kreéieren - Deel 7


An dësem Deel 7 vun der Ansible Serie léiert Dir wéi Dir Templates an Ansible erstellt a benotzt fir personaliséiert Konfiguratiounen op verwalteten Noden ze kreéieren. Templating in Ansible ass en einfachen a frëndleche Wee fir personaliséiert Konfiguratiounen op verwalteten Noden ze drécken déi verschidde Systemer mat minimaler Redaktioun vu Playbook Dateien lafen.

Fir e bessere Sënn ze kréien wat eng Schabloun ass, loosst eis en IT Manager betruechten, deen eng E-Mail ausschafft fir säin Departement op eng Cocktailparty ze invitéieren. D'E-Mail gëtt un jidderee vun de Membere geschéckt an invitéiert se och mat hire Ehepartner ze taggen.

D'E-Mail gouf personaliséiert sou datt de Kierper vun der E-Mail d'selwecht bleift, awer d'Adressen an d'Nimm vun hire respektiven Ehepartner variéieren. D'E-Mail gëtt d'Schabloun, während d'Empfänger a jeeweileg Ehepartner Variablen sinn.

Dat war e generescht Beispill. Ansible benotzt Jinja2 wat e modernen Templatemotor fir Python Kaderen ass fir dynamesch Inhalter oder Ausdréck ze generéieren. Template ass extrem nëtzlech wann Dir personaliséiert Konfiguratiounsdateien fir verschidde Server erstellt awer eenzegaarteg fir jidderee vun hinnen.

Jinja2 benotzt déi duebel Curly Klameren {{ ... }} fir eng Variabel ëmzeschléissen déi definéiert gouf. Fir Kommentarer benotzt {{# #} a fir bedingte Aussoe benotzt {% … %}.

Loosst eis unhuelen datt Dir en Datemodell vu VLANs an Ärem Netz hutt mat Hostsystemer déi Dir op hir jeweileg VLANs drécke wëllt wéi gewisen.

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

Fir dës Konfiguratioun ze maachen, géif déi entspriechend jinja2 Schabloun genannt vlans.j2 schéngen wéi gewisen. Wéi Dir gesitt, sinn d'Verännerlechen vlan.id an vlan.name a Curly Klammeren zougemaach.

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

Alles zesummen an engem Spillbuch ze setzen dat verschidde Hostmaschinne placéiert, géif dëst erschéngen wéi gewisen:

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

Beispill 1: Webserver a verschiddene Distros konfiguréieren

An dësem Beispill wäerte mir index.html Dateien erstellen déi Informatioun iwwer den Hostnumm & den OS vun 2 Webserver lafen CentOS & Ubuntu weisen.

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

Apache Webserver ass schonn op béide Server installéiert ginn.

Also loosst eis e Playbook erstellen test_server.yml wéi gewisen:

---

 - hosts: all
   become: yes

   tasks:

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

Eis Jinja Datei Schabloun ass index.html.j2 déi an d'index.html Datei op all Webserver gedréckt gëtt. Denkt ëmmer drun d'Extensioun .j2 um Enn ze setzen fir ze bezeechnen datt et eng jinja2 Datei ass.

Loosst eis elo d'Schabloundatei index.html.j2 erstellen.

<html>
<center>
   <h1> The hostname of this webserver is {{ ansible_hostname }}</h1>
   <h3> It is running on {{ ansible_os_family}}system </h3>
</center>
</html>

Dës Schabloun ass eng Basis HTML-Datei, wou den ansible_hostname an ansible_os_family agebaute Variablen sinn, déi mat de respektiven Hostnamen a Betribssystemer vun den eenzelne Webserver am Browser ersat ginn.

Elo, Loosst eis d'Spillbuch lafen.

# ansible-playbook test_server.yml

Loosst eis d'Websäite fir béid CentOS 7 an Ubuntu Webserver nei lueden.

Wéi Dir gesitt, sinn verschidden Informatioun iwwer den Hostnumm a Famill vum OS op all Server ugewisen. An dat ass wéi cool Jinja2 Template ass!

FILTER:

Heiansdo kënnt Dir décidéieren de Wäert vun enger Variabel mat engem String ze ersetzen, deen op eng gewësse Manéier erschéngt.

Zum Beispill, am virege Beispill kënne mir entscheeden d'Ansible Variabelen an der Groussregioun ze maachen. Fir dat ze maachen, fügen de Wäert uewen un d'Variabel. Op dës Manéier gëtt de Wäert an der Variabel an de Grousse Format ëmgewandelt.

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

Ähnlech kënnt Dir d'Stringoutput op kleng Buschtawen konvertéieren andeems Dir den ënneschten Argument bäidréit.

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

Zousätzlech kënnt Dir e String mat engem aneren ersetzen.

Zum Beispill:

De Filmtitel ass {{ movie_name }} => De Filmtitel ass Ring.

Fir den Ausgang mat enger anerer String ze ersetzen, benotzt d'Ersatz Argument wéi gewisen:

De Filmtitel ass {{ movie_name | ersetzen (\Ring\,,Heist) }} => De Filmtitel ass Heist.

Fir de klengste Wäert an enger Array z'erhalen, benotzt de min Filter.

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

Ähnlech, fir déi gréisst Zuel ze recuperéieren, benotzt de Max Filter.

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

Fir eenzegaarteg Wäerter ze weisen, benotzt den eenzegaartege Filter.

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

Benotzt den zoufälleg Filter fir eng zoufälleg Zuel tëscht 0 an dem Wäert ze kréien.

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

LOOPEN:

Just wéi a Programméierungssproochen hu mir Loops an Ansible Jinja2.

Zum Beispill, fir eng Datei ze generéieren déi eng Lëscht vun Zuelen enthält benotzt d'For Loop wéi am Beispill hei ënnen gewisen:

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

Dir kënnt och d'For Loop mat if-else Aussoen kombinéieren fir ze filteren a bestëmmte Wäerter ze kréien.

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

An dat ass et fir dës Virtrag. Maacht mat bei eis am nächsten Thema, wou mir wäerte mat ansible Variabelen a Fakten schaffen.