Vyhledávání na webu

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.