Jak pracovat s Ansible proměnnými a fakty – 8. část
Zmínili jsme se o proměnných v této sérii Ansible a jen proto, abychom si trochu pohnuli mysl. Proměnná, stejně jako v mnoha programovacích jazycích, je v podstatě klíč, který představuje hodnotu.
Co tvoří platný název proměnné?
Název proměnné obsahuje písmena, čísla, podtržítka nebo kombinaci dvou nebo všech z nich. Mějte však na paměti, že název proměnné musí vždy začínat písmenem a neměl by obsahovat mezery.
Podívejme se na několik příkladů platných a nepřijatelných názvů proměnných:
Příklady platného názvu proměnné:
football
foot_ball
football20
foot_ball20
Příklady neplatného názvu proměnné:
foot ball
20
foot-ball
Pojďme diskutovat o typech proměnných:
1. Proměnné příručky
Proměnné Příručky jsou poměrně snadné a přímočaré. Chcete-li definovat proměnnou v příručce, jednoduše použijte klíčové slovo vars, než začnete psát proměnné s odsazením.
Chcete-li získat přístup k hodnotě proměnné, umístěte ji mezi dvojité složené závorky uzavřené v uvozovkách.
Zde je jednoduchý příklad playbooku:
- hosts: all
vars:
greeting: Hello world!
tasks:
- name: Ansible Basic Variable Example
debug:
msg: "{{ greeting }}"
Ve výše uvedené příručce je proměnná pozdrav při spuštění příručky nahrazena hodnotou Hello world!. Příručka po spuštění jednoduše vytiskne zprávu Ahoj světe!.
Kromě toho můžete mít seznam nebo pole proměnných, jak je znázorněno:
Níže uvedená příručka ukazuje proměnnou nazvanou kontinenty. Proměnná obsahuje 5 různých hodnot – názvy kontinentů. Ke každé z těchto hodnot lze snadno přistupovat pomocí indexu 0 jako první proměnné.
Níže uvedený příklad příručky načte a zobrazí Asie (index 1).
- hosts: all
vars:
continents:
- Africa
- Asia
- South America
- North America
- Europe
tasks:
- name: Ansible List variable Example
debug:
msg: "{{ continents [1] }}"
Seznam proměnných může být strukturován podobně jako na obrázku:
vars:
Continents: [Africa, Asia, South America, North America, Europe]
Chcete-li vypsat všechny položky v seznamu, použijte modul with_items. Tím se projdou všechny hodnoty v poli.
- hosts: all
vars:
continents: [Africa, Asia, South America, North America, Europe]
tasks:
- name: Ansible array variables example
debug:
msg: "{{ item }}"
with_items:
- "{{ continents }}"
Dalším typem proměnné Ansible je proměnná dictionary.
V příručce jsou navíc podporovány proměnné Slovník. Chcete-li definovat proměnnou slovníku, jednoduše identifikujte pár klíč–hodnota těsně pod názvem proměnné slovníku.
hosts: switch_f01
vars:
http_port: 8080
default_gateway: 10.200.50.1
vlans:
id: 10
port: 2
Ve výše uvedeném příkladu je vlans proměnnou slovníku, zatímco id a port jsou páry klíč–hodnota.
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’] }}
V případě id_portu, protože hodnotu začínáme textem a nikoli proměnnou, nejsou uvozovky nutné k ohraničení složených závorek.
2. Speciální proměnné
Ansible poskytuje seznam předdefinovaných proměnných, na které lze odkazovat v šablonách a příručkách Jinja2, ale nelze je měnit nebo definovat uživatelem.
Souhrnně se seznam předdefinovaných proměnných Ansible nazývá Fakta Ansible a ty se shromažďují při spuštění playbooku.
Chcete-li získat seznam všech proměnných Ansible, použijte modul setup v příkazu Ansible ad-hoc, jak je uvedeno níže:
ansible -m setup hostname
Toto zobrazí výstup ve formátu JSON, jak je znázorněno:
ansible -m setup localhost
Z výstupu můžeme vidět, že některé příklady speciálních proměnných Ansible zahrnují:
ansible_architecture
ansible_bios_date
ansible_bios_version
ansible_date_time
ansible_machine
ansible_memefree_mb
ansible_os_family
ansible_selinux
Existuje mnoho dalších speciálních proměnných Ansible, to je jen několik příkladů.
Tyto proměnné lze použít v šabloně Jinja2, jak je znázorněno:
<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. Proměnné zásob
Nakonec na seznamu máme proměnné inventáře Ansible. Inventář je soubor ve formátu INI, který obsahuje všechny hostitele, které má Ansible spravovat.
V inventářích můžete přiřadit proměnnou hostitelskému systému a později ji použít v playbooku.
[web_servers]
web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=ubuntu http_port=8080
Výše uvedené může být znázorněno v souboru YAML playbooku, jak je znázorněno:
---
web_servers:
web_server_1:
ansible_user=centos
http_port=80
web_server_2:
ansible_user=ubuntu
http_port=8080
Pokud hostitelské systémy sdílejí stejné proměnné, můžete v souboru inventáře definovat další skupinu, aby byl méně těžkopádný a předešlo se zbytečnému opakování.
Například:
[web_servers]
web_server_1 ansible_user=centos http_port=80
web_server_2 ansible_user=centos http_port=80
Výše uvedené může být strukturováno takto:
[web_servers]
web_server_1
web_server_2
[web_servers:vars]
ansible_user=centos
http_port=80
A v souboru YAML příručky to bude definováno takto:
---
web_servers:
hosts:
web_server_1:
web_server_2:
vars:
ansible_user=centos
http_port=80
Ansible fakta
Při spouštění playbooků je první úlohou, kterou Ansible provede, provedení úlohy nastavení. Jsem si docela jistý, že jste museli narazit na výstup:
TASK: [Gathering facts] *********
Dostupná fakta nejsou nic jiného než systémové vlastnosti nebo informace o vzdálených uzlech, ke kterým jste se připojili. Tyto informace zahrnují architekturu systému, verzi operačního systému, informace o systému BIOS, systémový čas a datum, dobu provozu systému, adresu IP a informace o hardwaru, abychom zmínili jen některé.
Chcete-li získat fakta o jakémkoli systému, jednoduše použijte modul nastavení, jak je znázorněno v příkazu níže:
ansible -m setup hostname
Například:
ansible -m setup database_server
Tím se vytiskne velká sada dat ve formátu JSON, jak je znázorněno:
Dostupná fakta pomáhají správcům systému, které operace mají provádět, například v závislosti na operačním systému mohou vědět, které softwarové balíčky je třeba nainstalovat a jak se mají nakonfigurovat atd.
Vlastní fakta
Věděli jste také, že si můžete vytvořit svá vlastní fakta, která může Ansible shromáždit? Ano můžeš. Tak jak na to? Zařadíme rychlostní stupně a uvidíme jak.
Prvním krokem je vytvoření adresáře /etc/ansible/facts.d na spravovaném nebo vzdáleném uzlu.
Uvnitř tohoto adresáře vytvořte soubor(y) s příponou .fact
. Tento soubor(y) vrátí data JSON, když je playbook spuštěn v ovládacím uzlu Ansible, což zahrnuje další skutečnosti, které Ansible načte po spuštění playbooku.
Zde je příklad vlastního souboru faktů s názvem date_time.fact, který načítá datum a čas.
mkdir -p /etc/ansible/facts.d
vim /etc/ansible/facts.d/date_time.fact
Přidejte do něj následující řádky.
#!/bin/bash
DATE=`date`
echo "{\"date\" : \"${DATE}\"}"
Uložte a ukončete soubor.
Nyní přidělte oprávnění ke spuštění:
chmod +x /etc/ansible/facts.d/date_time.fact
Nyní jsem vytvořil playbook na ovládacím uzlu Ansible s názvem check_date.yml.
---
- hosts: webservers
tasks:
- name: Get custom facts
debug:
msg: The custom fact is {{ansible_local.date_time}}
Připojte soubor faktů k proměnné ansible_local. ansible_local ukládá všechny vlastní údaje.
Nyní spusťte playbook a sledujte, jak Ansible získává informace uložené v souboru faktů:
ansible_playbook check_date.yml
Závěr
Tím se dostáváme na konec tohoto tutoriálu o práci s proměnnými a fakty Ansible.