Hvordan jobbe med ansible variabler og fakta - del 8


Vi har nevnt variabler i denne Ansible-serien og bare for å jogge tankene dine litt. En variabel, akkurat som i mange programmeringsspråk, er i hovedsak en nøkkel som representerer en verdi.

Hva utgjør et gyldig variabelnavn?

Et variabelnavn inkluderer bokstaver, tall, understreker eller en blanding av enten 2 eller alle. Vær imidlertid oppmerksom på at et variabelnavn alltid må begynne med en bokstav og ikke skal inneholde mellomrom.

La oss ta en titt på noen eksempler på gyldige og uakseptable variabelnavn:

Eksempler på gyldige variabelnavn:

football 
foot_ball
football20 
foot_ball20

Eksempler på ugyldige variabelnavn:

foot ball
20 
foot-ball

La oss diskutere variabeltypene:

1. Playbook-variabler

Playbook-variabler er ganske enkle og greie. For å definere en variabel i en playbook, bruk bare søkeordet vars før du skriver variablene med innrykk.

For å få tilgang til verdien av variabelen, plasser den mellom de doble krøllete klammeparentesene omgitt av anførselstegn.

Her er et enkelt eksempel på en lekebok:

- hosts: all
  vars:
    greeting: Hello world! 

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

I spilleboken ovenfor erstattes hilsen-variabelen med verdien Hello world! når spilleboken kjøres. Spilleboken skriver ganske enkelt ut meldingen Hello world! når den utføres.

I tillegg kan du ha en liste eller en rekke variabler som vist:

Spilleboken nedenfor viser en variabel kalt kontinenter. Variabelen har 5 forskjellige verdier – kontinentnavn. Hver av disse verdiene kan enkelt nås ved å bruke indeks 0 som den første variabelen.

Eksempelet på spilleboken nedenfor henter og viser Asia (indeks 1).

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

Variabellisten kan på samme måte struktureres som vist:

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

For å liste opp alle elementene på listen, bruk modulen with_items. Dette vil gå gjennom alle verdiene i matrisen.

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

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

En annen type Ansible-variabel er ordbok-variabelen.

Ordbok-variabler støttes i tillegg i spilleboken. For å definere ordbokvariabelen, identifiserer du nøkkelverdi-paret rett under ordbokvariabelnavnet.

hosts: switch_f01

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

I eksemplet ovenfor er vlans ordbokvariabelen mens id og port er nøkkelverdi-parene.

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’]  }}

For port_id, siden vi starter verdien med tekst og ikke variabelen, er det ikke nødvendig med anførselstegn for å omgi de krøllete klammeparentesene.

2. Spesielle variabler

Ansible gir en liste over forhåndsdefinerte variabler som kan refereres til i Jinja2-maler og spillebøker, men som ikke kan endres eller defineres av brukeren.

Samlet blir listen over Ansible forhåndsdefinerte variabler referert til som Ansible fakta, og disse samles inn når en spillebok kjøres.

For å få en liste over alle Ansible-variablene, bruk oppsett-modulen i Ansible ad-hoc-kommandoen som vist nedenfor:

ansible -m setup hostname

Dette viser utdataene i JSON-format som vist:

ansible -m setup localhost

Fra utdataene kan vi se at noen av eksemplene på Ansible spesialvariabler inkluderer:

ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux

Det er mange andre spesialvariabler fra Ansible, dette er bare noen få eksempler.

Disse variablene kan brukes i en Jinja2-mal som vist:

<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. Lagervariabler

Til slutt, på listen, har vi Ansible inventarvariabler. En inventar er en fil i INI-format som inneholder alle vertene som skal administreres av Ansible.

I inventar kan du tilordne en variabel til et vertssystem og senere bruke den i en spillebok.

[web_servers]

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

Ovennevnte kan representeres i en playbook YAML-fil som vist:

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

web_server_2:
        ansible_user=ubuntu
	   http_port=8080

Hvis vertssystemene deler de samme variablene, kan du definere en annen gruppe i inventarfilen for å gjøre den mindre tungvint og unngå unødvendige repetisjoner.

For eksempel:

[web_servers]

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

Ovenstående kan struktureres som:

[web_servers]
web_server_1
web_server_2


[web_servers:vars]
ansible_user=centos
http_port=80

Og i Playbook YAML-filen vil dette bli definert som vist:

---
   web_servers:
    
     hosts: 
       web_server_1:
	  web_server_2:

     vars: 
        ansible_user=centos
   http_port=80

Ansible fakta

Når du kjører playbooks, er den første oppgaven som Ansible gjør utførelsen av oppsettoppgaven. Jeg er ganske sikker på at du må ha kommet over utgangen:

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

Ansible fakta er ingenting annet enn systemegenskaper eller deler av informasjon om eksterne noder som du har koblet til. Denne informasjonen inkluderer systemarkitekturen, OS-versjonen, BIOS-informasjon, systemtid og dato, systemoppetid, IP-adresse og maskinvareinformasjon for bare å nevne noen.

For å få fakta om et hvilket som helst system, bruk oppsett-modulen som vist i kommandoen nedenfor:

ansible -m setup hostname

For eksempel:

ansible -m setup database_server

Dette skriver ut et stort sett med data i JSON-format som vist:

Ansible fakta er nyttige for å hjelpe systemadministratorene hvilke operasjoner som skal utføres, for eksempel avhengig av operativsystemet, de kan vite hvilke programvarepakker som må installeres, og hvordan de skal konfigureres osv.

Egendefinerte fakta

Visste du også at du kan lage dine egne tilpassede fakta som kan samles inn av Ansible? Ja det kan du. Så hvordan går du frem? La oss skifte gir og se hvordan.

Det første trinnet er å opprette en /etc/ansible/facts.d-katalog på den administrerte eller eksterne noden.

Inne i denne katalogen, lag en fil(er) med filtypen .fact. Denne filen(e) vil returnere JSON-data når playbook kjøres på Ansible-kontrollnoden, som inkluderer de andre faktaene som Ansible henter etter en playbook-kjøring.

Her er et eksempel på en egendefinert faktafil kalt date_time.fact som henter dato og klokkeslett.

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

Legg til følgende linjer i den.

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

Lagre og avslutt filen.

Tildel nå utføringstillatelsene:

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

Nå har jeg laget en spillebok på Ansible-kontrollnoden kalt check_date.yml.

---

- hosts: webservers

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

Legg til faktafilen i ansible_local-variabelen. ansible_local lagrer alle tilpassede fakta.

Kjør nå playbook og observer Ansible hente informasjon lagret på faktafilen:

ansible_playbook check_date.yml

Konklusjon

Dette bringer oss til slutten av denne opplæringen om å jobbe med Ansible-variabler og fakta.