Kuinka luoda malleja hallittavien solmujen kokoonpanojen luomiseen - osa 7


Tässä Ansible-sarjan tässä osassa 7 opit luomaan ja käyttämään Ansible-malleja mukautettujen kokoonpanojen luomiseen hallituille solmuille. Templating in Ansible on helppo ja ystävällinen tapa työntää mukautetut kokoonpanot hallittuihin solmuihin, joissa on eri järjestelmät, ja pelikirjatiedostojen muokkaus on vähäistä.

Ottaaksemme paremman käsityksen siitä, mikä malli on, harkitsemme IT-johtajaa, joka laatii sähköpostin kutsumaan osastonsa cocktailjuhliin. Sähköposti lähetetään jokaiselle jäsenelle, ja kutsuu heidät myös merkitsemään puolisonsa kanssa.

Sähköposti on räätälöity siten, että sähköpostin runko pysyy samana, mutta vastaanottajat ja heidän puolisonsa nimet vaihtelevat. Sähköpostista tulee malli, kun taas vastaanottajat ja puolisot ovat muuttujia.

Se oli yleinen esimerkki. Ansible käyttää Jinja2: ta, joka on moderni mallimoottori Python-kehyksille, jota käytetään dynaamisen sisällön tai lausekkeiden luomiseen. Mallinnus on erittäin hyödyllistä, kun luot mukautettuja kokoonpanotiedostoja useille palvelimille, mutta ainutlaatuinen jokaiselle palvelimelle.

Jinja2 käyttää kaksinkertaisia kiharaisia aaltosulkeita {{...}} määrittääkseen muuttujan. Käytä kommentteihin {{# #} ja ehdollisiin lauseisiin {%…%} .

Oletetaan, että verkossa on VLAN-verkkojen tietomalli isäntäjärjestelmillä, jotka haluat siirtää vastaaviin VLAN-verkkoihin kuvan osoittamalla tavalla.

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

Tämän kokoonpanon hahmottamiseksi vastaava jinja2-malli nimeltä vlans.j2 ilmestyy kuvan osoittamalla tavalla. Kuten näette, muuttujat vlan.id ja vlan.name on liitetty kiharaisiin aaltosulkeisiin.

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

Yhdistämällä kaikki pelikirjaan, joka sijoittaa erilaisia isäntäkoneita, tämä näyttäisi olevan esitetty:

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

Esimerkki 1: Verkkopalvelinten määrittäminen erilaisissa distroissa

Tässä esimerkissä luomme index.html-tiedostot, jotka näyttävät tietoja kahden CentOSia ja Ubuntua käyttävän verkkopalvelimen isäntänimestä ja käyttöjärjestelmästä.

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

Apache-verkkopalvelin on jo asennettu molemmille palvelimille.

Joten luodaan playbook test_server.yml kuvan mukaisesti:

---

 - hosts: all
   become: yes

   tasks:

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

Jinja-tiedostomallimme on index.html.j2, joka työnnetään jokaisen verkkopalvelimen index.html-tiedostoon. Muista aina laittaa loppu .j2 loppuun merkitsemään, että kyseessä on jinja2-tiedosto.

Luodaan nyt mallitiedosto 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>

Tämä malli on HTML-perustiedosto, jossa ansible_hostname ja ansible_os_family ovat sisäänrakennettuja muuttujia, jotka korvataan selaimen yksittäisten verkkopalvelimien vastaavilla isäntänimillä ja käyttöjärjestelmillä.

Suoritetaan nyt playbook.

# ansible-playbook test_server.yml

Lataa nyt sekä CentOS 7: n että Ubuntun verkkopalvelimien verkkosivut uudelleen.

Kuten näette, kullakin palvelimella on näytetty erilaisia tietoja käyttöjärjestelmän isäntänimestä ja -perheestä. Ja niin hienoa Jinja2-mallinnus on!

SUODATTIMET:

Joskus voit päättää korvata muuttujan arvon merkkijonolla, joka näkyy tietyllä tavalla.

Esimerkiksi edellisessä esimerkissä voimme päättää, että Ansible-muuttujat näkyvät isoissa kirjaimissa. Liitä arvo lisäämällä muuttujaan ylempi. Tällä tavalla muuttujan arvo muunnetaan isojen kirjainten muotoon.

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

Vastaavasti voit muuntaa merkkijonon pieniksi kirjaimiksi liittämällä pienemmän argumentin.

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

Voit myös korvata merkkijonon toisella.

Esimerkiksi:

Elokuvan nimi on {{movie_name}} => Elokuvan nimi on Ring.

Jos haluat korvata lähdön toisella merkkijonolla, käytä korvausargumenttia kuvan osoittamalla tavalla:

Elokuvan nimi on {{elokuvan_nimi | korvaa (”Ring”, ”Heist”)} => Elokuvan nimi on Heist.

Jos haluat hakea matriisin pienimmän arvon, käytä min-suodatinta.

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

Vastaavasti, jos haluat hakea suurimman määrän, käytä max-suodatinta.

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

Voit näyttää yksilölliset arvot käyttämällä yksilöllistä suodatinta.

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

Käytä satunnaissuodatinta saadaksesi satunnaisluvun välillä 0 ja arvo.

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

KATSELUT:

Aivan kuten ohjelmointikielillä, meillä on silmukoita Ansible Jinja2: ssa.

Voit esimerkiksi luoda numeroluettelon sisältävän tiedoston for -silmukalle alla olevan esimerkin mukaisesti:

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

Voit myös yhdistää for-silmukan if-else-käskyihin suodattaa ja saada tiettyjä arvoja.

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

Ja se on tälle luennolle. Liity seuraavaan aiheeseen, jossa ryhdymme työskentelemään mahdollisten muuttujien ja tosiseikkojen kanssa.