Ricerca nel sito web

Come creare modelli in Ansible per creare configurazioni su nodi gestiti - Parte 7


In questa Parte 7 della serie Ansible imparerai come creare e utilizzare modelli in Ansible per creare configurazioni personalizzate sui nodi gestiti. La creazione di modelli in Ansible è un modo semplice e intuitivo per inviare configurazioni personalizzate a nodi gestiti che eseguono sistemi diversi con una modifica minima dei file del playbook.

Cos'è il template in Ansible?

Per avere un'idea migliore di cosa sia un modello, consideriamo un manager IT che redige un'e-mail per invitare il suo dipartimento a un cocktail party. L'e-mail viene inviata a ciascuno dei membri e li invita anche a unirsi ai loro coniugi.

L'e-mail è stata personalizzata in modo che il corpo dell'e-mail rimanga lo stesso, ma variano i destinatari e i nomi dei rispettivi coniugi. L'email diventa il modello, mentre i destinatari e i rispettivi coniugi sono variabili.

Quello era un esempio generico. Ansible utilizza Jinja2 che è un moderno motore di modelli per framework Python utilizzato per generare contenuti o espressioni dinamici. Il template è estremamente utile quando si creano file di configurazione personalizzati per più server ma unici per ciascuno di essi.

Jinja2 utilizza le doppie parentesi graffe {{ ... }} per racchiudere una variabile che è stata definita. Per i commenti, usa {{# #} e per le istruzioni condizionali usa {% … %}.

Supponiamo che tu abbia un modello di dati di VLAN nella tua rete con sistemi host che desideri inviare alle rispettive VLAN come mostrato.

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

Per eseguire il rendering di questa configurazione, il modello jinja2 corrispondente chiamato vlans.j2 apparirà come mostrato. Come puoi vedere, le variabili vlan.id e vlan.name sono state racchiuse tra parentesi graffe.

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

Mettendo tutto insieme in un playbook che posiziona diverse macchine host, questo apparirebbe come mostrato:

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

Esempio 1: configurazione di server Web in diverse distribuzioni

In questo esempio, creeremo file index.html che visualizzeranno informazioni sul nome host e sul sistema operativo di 2 server Web che eseguono CentOS e Ubuntu .

Impostare

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

Il webserver Apache è già installato su entrambi i server.

Per CentOS7

Per Ubuntu 18.04

Creiamo quindi un playbook test_server.yml come mostrato:

---

 - hosts: all
   become: yes

   tasks:

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

Il nostro modello di file Jinja è index.html.j2 che verrà inviato al file index.html su ciascun server web. Ricorda sempre di mettere l'estensione .j2 alla fine per indicare che è un file jinja2.

Creiamo ora il file modello 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>

Questo modello è un file HTML di base in cui ansible_hostname e ansible_os_family sono variabili integrate che verranno sostituite con i rispettivi nomi host e sistemi operativi dei singoli server web sul browser.

Ora eseguiamo il playbook.

ansible-playbook test_server.yml

Ora ricarichiamo le pagine web sia per i server web CentOS 7 che Ubuntu.

Per CentOS7

Per Ubuntu 18.04

Come puoi vedere, su ciascun server sono state visualizzate informazioni diverse sul nome host e sulla famiglia del sistema operativo. Ed è proprio fantastico il template Jinja2!

FILTRI:

A volte potresti decidere di sostituire il valore di una variabile con una stringa che appare in un certo modo.

Esempio 1: far apparire le stringhe in maiuscolo/minuscolo

Ad esempio, nell'esempio precedente, possiamo decidere di far apparire le variabili Ansible in Maiuscolo. Per fare ciò, aggiungi il valore superiore alla variabile. In questo modo il valore nella variabile viene convertito in formato maiuscolo.

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

Allo stesso modo, puoi convertire l'output della stringa in minuscolo aggiungendo l'argomento inferiore.

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

Esempio 2: sostituire una stringa con un'altra

Inoltre, puoi sostituire una stringa con un'altra.

Per esempio:

Il titolo del film è {{ movie_name }} => Il titolo del film è Ring.

Per sostituire l'output con un'altra stringa, utilizzare l'argomento replace come mostrato:

Il titolo del film è {{ movie_name | sostituisci (“Ring“, ”Heist ”) }} => Il titolo del film è Heist.

Esempio 3: elenca e imposta filtri

Per recuperare il valore più piccolo in un array, utilizza il filtro min.

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

Allo stesso modo, per recuperare il numero più grande, utilizza il filtro max.

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

Per visualizzare valori univoci, utilizza il filtro unico.

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

Utilizza il filtro casuale per ottenere un numero casuale compreso tra 0 e il valore.

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

LOOP:

Proprio come nei linguaggi di programmazione, in Ansible Jinja2 abbiamo loop.

Ad esempio, per generare un file contenente un elenco di numeri utilizza il ciclo for come mostrato nell'esempio seguente:

Esempio 1:

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

Puoi anche combinare il ciclo for con le istruzioni if-else per filtrare e ottenere determinati valori.

Esempio 2:

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

E questo è tutto per questa conferenza. Unisciti a noi nel prossimo argomento in cui ci avventureremo nel lavorare con variabili e fatti ansible.