vi har nævnt variabler i denne Ansible serie og bare for at jogge dit sind lidt. En variabel, ligesom i mange programmeringssprog, er i det væsentlige en nøgle, der repræsenterer en værdi.
hvad udgør et gyldigt Variabelnavn?
et variabelnavn indeholder bogstaver, tal, understregninger eller en blanding af enten 2 eller dem alle. Husk dog, at et variabelnavn altid skal begynde med et bogstav og ikke bør indeholde mellemrum.
lad os se et par eksempler på gyldige og uacceptable variabelnavne:
eksempler på gyldige variabelnavne:
football foot_ballfootball20 foot_ball20
eksempler på ikke-gyldige variabelnavne:
foot ball20 foot-ball
lad os diskutere variabeltyperne:
Playbook-variabler
Playbook-variabler er ret lette og ligetil. For at definere en variabel i en playbook skal du blot bruge nøgleordet vars, før du skriver dine variabler med indrykning.
for at få adgang til værdien af variablen skal du placere den mellem de dobbelte krøllede seler, der er vedlagt anførselstegn.
her er et simpelt playbook eksempel:
- hosts: all vars: greeting: Hello world! tasks: - name: Ansible Basic Variable Example debug: msg: "{{ greeting }}"
i ovenstående playbook erstattes hilsenvariablen med værdien Hej verden! når playbook køres. Playbook udskriver simpelthen beskeden Hej verden! når henrettet.
derudover kan du have en liste eller en række variabler som vist:
playbook nedenfor viser en variabel kaldet kontinenter. Variablen indeholder 5 forskellige værdier-kontinentnavne. Hver af disse værdier kan let fås ved hjælp af indeks 0 som den første variabel.
eksemplet på playbook nedenfor henter og viser Asien (indeks 1).
variabellisten kan ligeledes struktureres som vist:
vars: Continents:
hvis du vil liste alle elementerne på listen, skal du bruge modulet med_items. Dette vil løbe gennem alle værdierne i arrayet.
en anden type Ansible variabel er ordbogsvariablen.
ordbog variabler understøttes desuden i playbook. For at definere ordbogsvariablen skal du blot identificere nøgleværdiparret lige under ordbogsvariabelnavnet.
hosts: switch_f01vars: http_port: 8080 default_gateway: 10.200.50.1 vlans: id: 10 port: 2
i eksemplet ovenfor er VLAN ‘ er ordbogsvariablen, mens id og port er nøgleværdiparrene.
for port_id, da vi starter værdien med tekst og ikke variablen, er anførselstegn ikke nødvendige for at omringe de krøllede seler.
særlige variabler
Ansible indeholder en liste over foruddefinerede variabler, der kan refereres til i Jinja2 skabeloner og playbooks, men kan ikke ændres eller defineres af brugeren.
samlet betegnes listen over Ansible foruddefinerede variabler som Ansible fakta, og disse indsamles, når en playbook udføres.
for at få en liste over alle de Ansible variabler, brug opsætningsmodulet i kommandoen Ansible ad hoc som vist nedenfor:
# ansible -m setup hostname
dette viser output i JSON-format som vist:
# ansible -m setup localhost
fra output kan vi se, at nogle af eksemplerne på Ansible specialvariabler inkluderer:
der er mange andre Ansible specialvariabler disse er blot nogle få eksempler.
disse variabler kan bruges i en Jinja2-skabelon som vist:
Lagervariabler
endelig har vi på listen Ansible lagervariabler. En beholdning er en fil i ini-format, der indeholder alle værter, der skal administreres af Ansible.
i varebeholdninger kan du tildele en variabel til et værtssystem og senere bruge den i en playbook.
web_server_1 ansible_user=centos http_port=80web_server_2 ansible_user=ubuntu http_port=8080
ovenstående kan repræsenteres i en playbook YAML-fil som vist:
--- web_servers: web_server_1: ansible_user=centos http_port=80web_server_2: ansible_user=ubuntu http_port=8080
hvis værtssystemerne deler de samme variabler, kan du definere en anden gruppe i inventarfilen for at gøre den mindre besværlig og undgå unødvendig gentagelse.
for eksempel:
web_server_1 ansible_user=centos http_port=80web_server_2 ansible_user=centos http_port=80
ovenstående kan struktureres som:
web_server_1web_server_2ansible_user=centoshttp_port=80
og i playbook YAML-filen vil dette blive defineret som vist:
--- web_servers: hosts: web_server_1: web_server_2: vars: ansible_user=centos http_port=80
Ansible Facts
når du kører playbooks, er den første opgave, som Ansible udfører, udførelsen af opsætningsopgaven. Jeg er temmelig sikker på, at du skal have stødt på output:
TASK: *********
Ansible fakta er intet andet end Systemegenskaber eller stykker information om eksterne noder, som du har oprettet forbindelse til. Disse oplysninger inkluderer systemarkitekturen, OS-versionen, BIOS-oplysninger, systemtid og dato, system oppetid, IP-adresse og udstyrsoplysninger for blot at nævne nogle få.
for at få fakta om ethvert system skal du blot bruge opsætningsmodulet som vist i kommandoen nedenfor:
# ansible -m setup hostname
for eksempel:
# ansible -m setup database_server
dette udskriver et stort sæt data i JSON-format som vist:
Ansible facts er nyttige til at hjælpe systemadministratorer, hvilke operationer der skal udføres, for eksempel afhængigt af operativsystemet, kan de vide, hvilke programpakker der skal installeres, og hvordan de skal konfigureres osv.
brugerdefinerede fakta
vidste du også, at du kan oprette dine egne brugerdefinerede fakta, der kan indsamles af Ansible? Jo, du kan. Så hvordan gør du det? Lad os skifte gear og se hvordan.
det første skridt er at skabe en /etc/ansible/fakta.d mappe på den administrerede eller eksterne node.
i denne mappe skal du oprette en fil(er) med en .fact
udvidelse. Denne fil(er) returnerer JSON-data, når playbook køres på Ansible control node, som inkluderer de andre fakta, som Ansible henter efter en playbook-kørsel.
her er et eksempel på en brugerdefineret faktafil kaldet date_time.fakta, der henter dato og tid.
# mkdir -p /etc/ansible/facts.d# vim /etc/ansible/facts.d/date_time.fact
tilføj følgende linjer i den.
#!/bin/bashDATE=`date`echo "{\"date\" : \"${DATE}\"}"
Gem og afslut filen.
Tildel nu køretilladelserne:
# chmod +x /etc/ansible/facts.d/date_time.fact
nu oprettede jeg en playbook på Ansible control node kaldet check_date.yml.
---- hosts: webservers tasks: - name: Get custom facts debug: msg: The custom fact is {{ansible_local.date_time}}
Tilføj faktafilen til variablen ansible_local. Den ansible_local gemmer alle de brugerdefinerede fakta.
Kør nu playbook og observer Ansible hentning af oplysninger gemt på faktafilen:
# ansible_playbook check_date.yml
konklusion
dette bringer os til slutningen af denne tutorial om at arbejde med Ansible variabler og fakta.