Com crear plantilles a Ansible per crear configuracions en nodes gestionats - Part 7


En aquesta part 7 de la sèrie Ansible, aprendràs a crear i utilitzar plantilles a Ansible per crear configuracions personalitzades als nodes gestionats. La plantilla a Ansible és una manera fàcil i amigable d'impulsar configuracions personalitzades als nodes gestionats que executen diferents sistemes amb una edició mínima dels fitxers del llibre de jocs.

Per tenir una millor idea de què és una plantilla, considerem que un gestor informàtic redacta un correu electrònic per convidar el seu departament a un còctel. El correu electrònic s'envia a cadascun dels membres i també els convida a etiquetar amb els seus cònjuges.

El correu electrònic s'ha personalitzat de manera que el cos del correu electrònic segueix sent el mateix, però els destinataris i els noms dels seus respectius cònjuges varien. El correu electrònic es converteix en la plantilla, mentre que els destinataris i els respectius cònjuges són variables.

Era un exemple genèric. Ansible utilitza Jinja2, que és un motor de plantilles modern per a marcs Python utilitzats per generar contingut o expressions dinàmiques. La plantilla és extremadament útil quan es creen fitxers de configuració personalitzats per a diversos servidors, però únics per a cadascun d'ells.

Jinja2 utilitza les claus dobles {{ ... }} per incloure una variable que s'ha definit. Per als comentaris, utilitzeu {{# #} i per a declaracions condicionals utilitzeu {% … %}.

Suposem que teniu un model de dades de VLAN a la vostra xarxa amb sistemes host que voleu enviar a les seves respectives VLAN tal com es mostra.

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

Per representar aquesta configuració, la plantilla jinja2 corresponent anomenada vlans.j2 apareixeria tal com es mostra. Com podeu veure, les variables vlan.id i vlan.name s'han tancat entre claus.

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

Ajuntant-ho tot en un llibre de jugades que col·loqui diferents màquines amfitriones, això apareixeria com es mostra:

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

Exemple 1: Configuració de servidors web en diferents distribucions

En aquest exemple, crearem fitxers index.html que mostraran informació sobre el nom d'amfitrió i el sistema operatiu de 2 servidors web que executen CentOS i Ubuntu.

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

El servidor web Apache ja s'ha instal·lat als dos servidors.

Així que creem un llibre de jugades test_server.yml tal com es mostra:

---

 - hosts: all
   become: yes

   tasks:

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

La nostra plantilla de fitxer Jinja és index.html.j2 que s'enviarà al fitxer index.html de cada servidor web. Recordeu sempre posar l'extensió .j2 al final per indicar que és un fitxer jinja2.

Ara creem el fitxer de plantilla 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>

Aquesta plantilla és un fitxer HTML bàsic on ansible_hostname i ansible_os_family són variables integrades que es substituiran pels respectius noms d'amfitrió i sistemes operatius dels servidors web individuals del navegador.

Ara, anem a executar el llibre de jugades.

# ansible-playbook test_server.yml

Ara tornem a carregar les pàgines web tant per als servidors web CentOS 7 com per a Ubuntu.

Com podeu veure, s'ha mostrat informació diferent sobre el nom d'amfitrió i la família del sistema operatiu a cada servidor. I així de genial és la plantilla Jinja2!

FILTRES:

De vegades, podeu decidir substituir el valor d'una variable per una cadena que apareix d'una manera determinada.

Per exemple, a l'exemple anterior, podem decidir que les variables Ansible apareguin en majúscules. Per fer-ho, afegiu el valor superior a la variable. D'aquesta manera, el valor de la variable es converteix al format de majúscules.

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

De la mateixa manera, podeu convertir la sortida de la cadena a minúscules afegint l'argument inferior.

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

A més, podeu substituir una cadena per una altra.

Per exemple:

El títol de la pel·lícula és {{ movie_name }} => El títol de la pel·lícula és Ring.

Per substituir la sortida per una altra cadena, utilitzeu l'argument substituir tal com es mostra:

El títol de la pel·lícula és {{ nom_pel·lícula | substituir (\Ring\,”Heist”) }} => El títol de la pel·lícula és Heist.

Per recuperar el valor més petit d'una matriu, utilitzeu el filtre min.

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

De la mateixa manera, per recuperar el nombre més gran, utilitzeu el filtre màxim.

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

Per mostrar valors únics, utilitzeu el filtre únic.

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

Utilitzeu el filtre aleatori per obtenir un nombre aleatori entre 0 i el valor.

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

LLOCS:

Igual que en els llenguatges de programació, tenim bucles a Ansible Jinja2.

Per exemple, per generar un fitxer que contingui una llista de números, utilitzeu el bucle for tal com es mostra a l'exemple següent:

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

També podeu combinar el bucle for amb les declaracions if-else per filtrar i obtenir determinats valors.

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

I això és tot per aquesta conferència. Uneix-te a nosaltres en el següent tema on ens aventurarem a treballar amb variables i fets ansibles.