Zoeken op website

Hoe te werken met Ansible-variabelen en feiten - Deel 8


We hebben variabelen genoemd in deze Ansible-serie, gewoon om je geest een beetje op te frissen. Een variabele is, net als in veel programmeertalen, in wezen een sleutel die een waarde vertegenwoordigt.

Wat is een geldige variabelenaam?

Een variabelenaam bevat letters, cijfers, onderstrepingstekens of een combinatie van 2 of allemaal. Houd er echter rekening mee dat een variabelenaam altijd met een letter moet beginnen en geen spaties mag bevatten.

Laten we een paar voorbeelden bekijken van geldige en onaanvaardbare namen van variabelen:

Voorbeelden van geldige variabelenamen:

football 
foot_ball
football20 
foot_ball20

Voorbeelden van niet-geldige variabelennamen:

foot ball
20 
foot-ball

Laten we de typen variabelen bespreken:

1. Playbook-variabelen

Playbook-variabelen zijn vrij eenvoudig en duidelijk. Om een variabele in een playbook te definiëren, gebruikt u eenvoudig het trefwoord vars voordat u uw variabelen met inspringing schrijft.

Om toegang te krijgen tot de waarde van de variabele, plaatst u deze tussen de dubbele accolades tussen aanhalingstekens.

Hier is een eenvoudig voorbeeld van een draaiboek:

- hosts: all
  vars:
    greeting: Hello world! 

  tasks:
  - name: Ansible Basic Variable Example
    debug:
      msg: "{{ greeting }}"

In het bovenstaande playbook wordt de variabele greeting vervangen door de waarde Hallo wereld! wanneer het playbook wordt uitgevoerd. Het playbook drukt eenvoudigweg het bericht Hallo wereld! af wanneer het wordt uitgevoerd.

Bovendien kunt u een lijst of een reeks variabelen hebben, zoals weergegeven:

Het onderstaande draaiboek toont een variabele met de naam continenten. De variabele bevat 5 verschillende waarden: continentnamen. Elk van deze waarden is eenvoudig toegankelijk door index 0 als eerste variabele te gebruiken.

In het voorbeeld van het onderstaande draaiboek wordt Azië (Index 1) opgehaald en weergegeven.

- hosts: all
  vars:
    continents:
      - Africa
      - Asia
      - South America
      - North America
      - Europe
      
  tasks:
  - name: Ansible List variable Example
    debug:
      msg: "{{ continents [1] }}"

De variabelenlijst kan op dezelfde manier worden gestructureerd zoals weergegeven:

vars:
    Continents: [Africa, Asia, South America, North America, Europe]

Om alle items op de lijst weer te geven, gebruikt u de module with_items. Hierdoor worden alle waarden in de array doorlopen.

- hosts: all
  vars:
    continents: [Africa, Asia, South America, North America, Europe]

  tasks:
  - name: Ansible array variables example
    debug: 
      msg: "{{ item }}"
    with_items:
      - "{{ continents }}"

Een ander type Ansible-variabele is de woordenboek variabele.

Woordenboek variabelen worden bovendien ondersteund in het draaiboek. Om de woordenboekvariabele te definiëren, identificeert u eenvoudigweg het sleutel-waardepaar net onder de naam van de woordenboekvariabele.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 10.200.50.1
   vlans:
       id: 10
       port: 2

In het bovenstaande voorbeeld is vlans de woordenboekvariabele, terwijl id en port de sleutel-waardeparen zijn.

hosts: switch_f01

vars:
   http_port: 8080
   default_gateway: 
   vlans:
      id: 10
      port: 20

 tasks:
   name: Configure default gateway
   system_configs:
   default_gateway_ip: “{{ default_gateway  }}“


   name: Label port on vlan 10
   vlan_config:
	vlan_id: “{{ vlans[‘id’]  }}“
     port_id: 1/1/ {{ vlans[‘port’]  }}

Voor port_id zijn aanhalingstekens niet nodig om de accolades te omringen, omdat we de waarde beginnen met tekst en niet met de variabele.

2. Speciale variabelen

Ansible biedt een lijst met vooraf gedefinieerde variabelen waarnaar kan worden verwezen in Jinja2-sjablonen en playbooks, maar die niet door de gebruiker kunnen worden gewijzigd of gedefinieerd.

Gezamenlijk wordt naar de lijst met vooraf gedefinieerde Ansible-variabelen verwezen als Ansible-feiten en deze worden verzameld wanneer een draaiboek wordt uitgevoerd.

Om een lijst met alle Ansible-variabelen te krijgen, gebruikt u de setup-module in het Ansible ad-hoc-commando, zoals hieronder weergegeven:

ansible -m setup hostname

Hierdoor wordt de uitvoer in JSON-indeling weergegeven, zoals weergegeven:

ansible -m setup localhost

Uit de uitvoer kunnen we zien dat enkele voorbeelden van speciale Ansible-variabelen het volgende omvatten:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

Er zijn nog veel meer speciale Ansible-variabelen. Dit zijn slechts enkele voorbeelden.

Deze variabelen kunnen worden gebruikt in een Jinja2-sjabloon, zoals weergegeven:

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

3. Voorraadvariabelen

Ten slotte hebben we op de lijst Ansible-inventarisvariabelen. Een inventaris is een bestand in INI-formaat dat alle hosts bevat die door Ansible moeten worden beheerd.

In inventarissen kunt u een variabele aan een hostsysteem toewijzen en deze later in een draaiboek gebruiken.

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080

Het bovenstaande kan worden weergegeven in een playbook YAML-bestand, zoals weergegeven:

---
   web_servers:
     web_server_1:
        ansible_user=centos
	   http_port=80

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

Als de hostsystemen dezelfde variabelen delen, kunt u een andere groep in het inventarisbestand definiëren om het minder omslachtig te maken en onnodige herhaling te voorkomen.

Bijvoorbeeld:

[web_servers]

web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80

Het bovenstaande kan als volgt worden gestructureerd:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

En in het playbook YAML-bestand wordt dit gedefinieerd zoals weergegeven:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Ansible-feiten

Bij het uitvoeren van draaiboeken is de eerste taak die Ansible uitvoert het uitvoeren van de installatietaak. Ik ben er vrij zeker van dat je de uitvoer moet zijn tegengekomen:

TASK:  [Gathering facts] *********

Ansible-feiten zijn niets anders dan systeemeigenschappen of stukjes informatie over externe knooppunten waarmee u verbonden bent. Deze informatie omvat de systeemarchitectuur, de versie van het besturingssysteem, BIOS-informatie, systeemtijd en -datum, systeemuptime, IP-adres en hardware-informatie om er maar een paar te noemen.

Om de feiten over welk systeem dan ook te krijgen, gebruikt u eenvoudigweg de setup-module, zoals weergegeven in de onderstaande opdracht:

ansible -m setup hostname

Bijvoorbeeld:

ansible -m setup database_server

Hierdoor wordt een grote set gegevens afgedrukt in JSON-indeling, zoals weergegeven:

Ansible-feiten zijn handig om de systeembeheerders te helpen bij het uitvoeren van handelingen. Afhankelijk van het besturingssysteem kunnen ze bijvoorbeeld weten welke softwarepakketten moeten worden geïnstalleerd en hoe ze moeten worden geconfigureerd, enz.

Aangepaste feiten

Wist u ook dat u uw eigen feiten op maat kunt creëren die door Ansible kunnen worden verzameld? Ja, dat kan. Dus hoe ga je ermee om? Laten we schakelen en kijken hoe.

De eerste stap is het maken van een map /etc/ansible/facts.d op het beheerde of externe knooppunt.

Maak in deze map een bestand(en) met de extensie .fact. Deze bestanden retourneren JSON-gegevens wanneer het draaiboek wordt uitgevoerd op het Ansible-besturingsknooppunt, inclusief de andere feiten die Ansible ophaalt na het uitvoeren van een draaiboek.

Hier is een voorbeeld van een aangepast feitenbestand met de naam date_time.fact dat de datum en tijd ophaalt.

mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact

Voeg daarin de volgende regels toe.

#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"

Sla het bestand op en sluit het af.

Wijs nu de uitvoeringsrechten toe:

chmod +x /etc/ansible/facts.d/date_time.fact

Nu heb ik een draaiboek gemaakt op het Ansible-controleknooppunt met de naam check_date.yml.

---

- hosts: webservers

  tasks:
   - name: Get custom facts
     debug:
      msg: The custom fact is {{ansible_local.date_time}}

Voeg het feitenbestand toe aan de ansible_local variabele. De ansible_local slaat alle aangepaste feiten op.

Voer nu het draaiboek uit en kijk hoe Ansible informatie ophaalt die is opgeslagen in het feitenbestand:

ansible_playbook check_date.yml

Conclusie

Dit brengt ons aan het einde van deze tutorial over het werken met Ansible-variabelen en feiten.