Mallien luominen Ansible to Create Configurations On Managed Nodes -sovelluksessa - Osa 7


Tässä Ansible-sarjan osassa 7 opit luomaan ja käyttämään malleja Ansiblessa räätälöityjen määritysten luomiseen hallituissa solmuissa. Mallineen luominen Ansiblessa on helppo ja ystävällinen tapa siirtää mukautettuja määrityksiä eri järjestelmiä käyttäviin hallittuihin solmuihin minimaalisella leikkikirjatiedostojen muokkauksella.

Mitä on mallinnus Ansiblessa?

Saadaksesi paremman käsityksen mallista, harkitsemme IT-päällikön laativan sähköpostin kutsuakseen osastonsa cocktailtilaisuuteen. Sähköposti lähetetään jokaiselle jäsenelle, ja se myös kutsuu heitä merkitsemään yhdessä puolisonsa kanssa.

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

Se oli yleinen esimerkki. Ansible käyttää Jinja2:ta, joka on moderni Python-kehysten mallinnuskone, jota käytetään dynaamisen sisällön tai lausekkeiden luomiseen. Malli on erittäin hyödyllinen luotaessa mukautettuja määritystiedostoja useille palvelimille, mutta jokaiselle niistä on yksilöllinen.

Jinja2 käyttää kaksinkertaista kiharaa aaltosulkeet {{ ... }} sisällyttääkseen muuttujan, joka on määritetty. Käytä kommenteissa {{# #} ja ehtolausekkeissa {% … %}.

Oletetaan, että verkossasi on tietomalli VLAN-verkkoista isäntäjärjestelmistä, jotka haluat siirtää vastaaviin VLAN-verkkoihin kuvan mukaisesti.

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

Tämän määrityksen hahmontamiseksi vastaava jinja2-malli, nimeltään vlans.j2, tulee näkyviin kuvan mukaisesti. Kuten näet, muuttujat vlan.id ja vlan.name on suljettu aaltosulkeisiin.

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

Kun kaikki kootaan pelikirjaan, joka sijoittaa eri isäntäkoneet, tämä näyttäisi seuraavalta:

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

Esimerkki 1: Verkkopalvelimien määrittäminen eri jakeluissa

Tässä esimerkissä luomme index.html-tiedostoja, jotka näyttävät tietoja kahden verkkopalvelimen isäntänimestä ja käyttöjärjestelmästä, joissa on CentOS ja Ubuntu. .

Perustaa

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

Apache-verkkopalvelin on jo asennettu molemmille palvelimille.

CentOS 7:lle

Ubuntu 18.04

Luodaan siis pelikirja 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 välitetään kunkin verkkopalvelimen index.html-tiedostoon. Muista aina laittaa pääte .j2 loppuun, mikä tarkoittaa, 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ä.

Ajellaan nyt pelikirjaa.

ansible-playbook test_server.yml

Ladataan nyt verkkosivut uudelleen sekä CentOS 7- että Ubuntu -verkkopalvelimille.

CentOS 7:lle

Ubuntu 18.04

Kuten näet, kussakin palvelimessa on esitetty erilaisia tietoja isäntänimestä ja käyttöjärjestelmän perheestä. Ja näin siistiä Jinja2-mallinnus on!

SUODATIN:

Joskus saatat päättää korvata muuttujan arvon merkkijonolla, joka esiintyy tietyllä tavalla.

Esimerkki 1: Merkitse merkkijonot isoilla/pienillä kirjaimilla

Esimerkiksi edellisessä esimerkissä voimme päättää, että Ansible-muuttujat näkyvät isoilla kirjaimilla. Voit tehdä tämän lisäämällä muuttujan yläosan arvon. Tällä tavalla muuttujan arvo muunnetaan isojen kirjainten muotoon.

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

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

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

Esimerkki 2: Korvaa merkkijono toisella

Lisäksi voit korvata merkkijonon toisella.

Esimerkiksi:

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

Jos haluat korvata tulosteen toisella merkkijonolla, käytä korvausargumenttia kuvan mukaisesti:

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

Esimerkki 3: Listat ja suodattimet

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

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

Vastaavasti voit hakea suurimman luvun käyttämällä max-suodatinta.

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

Jos haluat näyttää yksilölliset arvot, käytä ainutlaatuista-suodatinta.

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

Käytä satunnaista-suodatinta saadaksesi satunnaisluvun 0:n ja arvon välillä.

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

SILMUKSET:

Aivan kuten ohjelmointikielissä, meillä on silmukat Ansiblessa Jinja2.

Jos haluat esimerkiksi luoda numeroluettelon sisältävän tiedoston, käytä for-silmukkaa alla olevan esimerkin mukaisesti:

Esimerkki 1:

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

Voit myös yhdistää for-silmukan if-else-lauseisiin suodattaaksesi ja saadaksesi tiettyjä arvoja.

Esimerkki 2:

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

Ja siinä se tälle luennolle. Liity meihin seuraavassa aiheessa, jossa lähdemme työskentelemään mahdollisten muuttujien ja tosiasioiden parissa.