Zoeken op website

Sjablonen maken in Ansible om configuraties op beheerde knooppunten te maken - Deel 7


In dit Deel 7 van de Ansible-serie leert u hoe u sjablonen in Ansible kunt maken en gebruiken om aangepaste configuraties op beheerde knooppunten te maken. Templating in Ansible is een gemakkelijke en gebruiksvriendelijke manier om aangepaste configuraties naar beheerde knooppunten met verschillende systemen te pushen, met minimale bewerking van playbook-bestanden.

Wat is sjablonen in Ansible?

Laten we, om een beter idee te krijgen van wat een sjabloon is, een IT-manager bekijken die een e-mail opstelt om zijn afdeling uit te nodigen voor een cocktailparty. De e-mail wordt naar elk van de leden gestuurd en nodigt hen ook uit om samen met hun echtgenoten mee te doen.

De e-mail is zodanig aangepast dat de inhoud van de e-mail hetzelfde blijft, maar dat de geadresseerden en de namen van hun respectievelijke echtgenoten variëren. De e-mail wordt de sjabloon, terwijl de ontvangers en respectievelijke echtgenoten variabelen zijn.

Dat was een algemeen voorbeeld. Ansible gebruikt Jinja2, een moderne sjabloonengine voor Python-frameworks die wordt gebruikt om dynamische inhoud of expressies te genereren. Sjablonen zijn uiterst handig bij het maken van aangepaste configuratiebestanden voor meerdere servers, maar zijn uniek voor elk van hen.

Jinja2 gebruikt de dubbele accolades {{ ... }} om een gedefinieerde variabele te omsluiten. Gebruik voor commentaar {{# #} en voor voorwaardelijke uitspraken {% … %}.

Laten we aannemen dat u een datamodel van VLAN's in uw netwerk heeft met hostsystemen die u naar hun respectievelijke VLAN's wilt pushen, zoals weergegeven.

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

Om deze configuratie weer te geven, zou de overeenkomstige jinja2-sjabloon met de naam vlans.j2 verschijnen zoals weergegeven. Zoals u kunt zien, staan de variabelen vlan.id en vlan.name tussen accolades.

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

Als we alles samenvoegen in een draaiboek waarin verschillende hostmachines worden geplaatst, ziet dit eruit zoals weergegeven:

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

Voorbeeld 1: Webservers configureren in verschillende distributies

In dit voorbeeld zullen we index.html-bestanden maken die informatie weergeven over de hostnaam en het besturingssysteem van twee webservers waarop CentOS en Ubuntu draaien .

Opgericht

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

Op beide servers is Apache webserver al geïnstalleerd.

Voor CentOS 7

Voor Ubuntu 18.04

Laten we dus een playbook test_server.yml maken, zoals weergegeven:

---

 - hosts: all
   become: yes

   tasks:

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

Onze Jinja bestandssjabloon is index.html.j2 en wordt naar het index.html bestand op elke webserver gepusht. Vergeet niet om altijd de extensie .j2 aan het einde te plaatsen om aan te geven dat het een jinja2-bestand is.

Laten we nu het sjabloonbestand index.html.j2 maken.

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

Deze sjabloon is een eenvoudig HTML-bestand waarin de ansible_hostname en ansible_os_family ingebouwde variabelen zijn die worden vervangen door de respectieve hostnamen en besturingssystemen van de individuele webservers in de browser.

Laten we nu het draaiboek uitvoeren.

ansible-playbook test_server.yml

Laten we nu de webpagina's voor zowel CentOS 7 als Ubuntu webservers opnieuw laden.

Voor CentOS 7

Voor Ubuntu 18.04

Zoals u kunt zien, wordt op elke server verschillende informatie over de hostnaam en de besturingssysteemfamilie weergegeven. En zo cool is Jinja2-templates!

FILTERS:

Soms besluit u de waarde van een variabele te vervangen door een tekenreeks die op een bepaalde manier verschijnt.

Voorbeeld 1: Tekenreeksen in hoofdletters/kleine letters laten verschijnen

In het vorige voorbeeld kunnen we bijvoorbeeld besluiten om de Ansible-variabelen in hoofdletters weer te geven. Om dit te doen, voegt u de waarde bovenaan aan de variabele toe. Op deze manier wordt de waarde in de variabele omgezet naar hoofdletters.

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

Op dezelfde manier kunt u de tekenreeksuitvoer naar kleine letters converteren door het lagere argument toe te voegen.

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

Voorbeeld 2: Vervang een string door een andere

Bovendien kunt u een string vervangen door een andere.

Bijvoorbeeld:

De filmtitel is {{ movie_name }} => De filmtitel is Ring.

Om de uitvoer te vervangen door een andere tekenreeks, gebruikt u het vervangargument zoals weergegeven:

De filmtitel is {{ movie_name | vervangen (“Ring“, ”Heist ”) }} => De filmtitel is Heist.

Voorbeeld 3: Lijsten en sets van filters

Gebruik het min filter om de kleinste waarde in een array op te halen.

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

Op dezelfde manier kunt u het filter max gebruiken om het grootste aantal op te halen.

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

Gebruik het unieke filter om unieke waarden weer te geven.

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

Gebruik het filter willekeurig om een willekeurig getal tussen 0 en de waarde te verkrijgen.

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

LUSSEN:

Net als in programmeertalen hebben we loops in Ansible Jinja2.

Als u bijvoorbeeld een bestand met een lijst met getallen wilt genereren, gebruikt u de for-lus, zoals weergegeven in het onderstaande voorbeeld:

Voorbeeld 1:

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

Je kunt de for-lus ook combineren met if-else-instructies om te filteren en bepaalde waarden te verkrijgen.

Voorbeeld 2:

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

En dat was het voor deze lezing. Sluit u aan bij het volgende onderwerp, waar we ons zullen wagen aan het werken met weerwortvariabelen en feiten.