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.