1. Báza znalostí
  2. Cloud a servery
  3. Nástroje
  4. Ansible
  5. Ansible – 3. Premenné (facts, variables a Jinja)

Ansible – 3. Premenné (facts, variables a Jinja)

V predošlej časti sme definovaním obsahu konfiguračného súboru, zoznamu IP adries managed nodes a vytvorením jednoduchého playbooku dosiahli stav, v ktorom dokážeme automatizovanie v nástroji Ansible ovládať efektívne a rýchlo. Načrtli sme tak skutočnú silu automatizačného nástroja Ansible, na ktorej budeme stavať v ďalších častiach tohto seriálu.

V tejto časti predstavíme premenné, ktoré vytvárame pomocou rôznych funkcionalít nástroja Ansible. Premenné môžeme vytvárať na viacerých miestach, ale v tomto návode si predstavíme iba vytváranie premenných v externých súboroch. Oddelíme tak premenné od playbooku, aby sme v nich mohli ukladať aj citlivé údaje ako heslá, pričom playbook stále môžeme bezpečne zdieľať.

Kopírujeme facts pomocou variables

V rámci nástroja Ansible je možné nastavil premenné na úrovni celého systému (facts), a tiež na lokálnej úrovni iba pre control node (variables). Facts je potrebné z control node skopírovať na vybrané managed nodes, aby ich bolo možné používať v playbooku pre vybrané managed nodes.

Najskôr v priečinku ~/ansible-test vytvoríme súbor variables.yaml (prvý riadok), do ktorého vo formáte YAML zapíšeme hodnoty premenným remote_dir a facts_file (ostatné riadky):

nano ~/ansible-test/variables.yaml
remote_dir: /etc/ansible/facts.d
facts_file: custom.fact

Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X a následne stlačením klávesu y a potvrdením klávesom Enter.

Ďalej v priečinku ~/ansible-test vytvoríme súbor custom.fact (prvý riadok), do ktorého vo formáte INI (sekcia facts) zapíšeme hodnotu premennej s názvom web_server (druhý riadok):

nano ~/ansible-test/custom.fact
[facts]
web_server = apache2

Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X a následne stlačením klávesu y a potvrdením klávesom Enter.

Teraz potrebujeme vytvorený súbor ~/ansible-test/custom.fact dostať do vybraných managed nodes (v našom prípade na všetky 2 managed nodes, čiže hosts: all). Vytvoríme teda playbook (prvý riadok) s troma úlohami (ostatné riadky). V prvej vytvoríme priečinok (path: "{{ remote_dir }}"), v druhej doň skopírujeme súbor s faktami (facts_file: custom.fact) do oboch managed nodes (remote_dir: /etc/ansible/facts.d) a v tretej opäť do oboch managed nodes nainštalujeme webový server (web_server = apache2). Nastavenie state: present určuje, že sa má balík nainštalovať, state: absent zase znamená odinštalovanie. Vytvoríme si teda súbor playbooku copy_facts_install_web_server.yaml (prvý riadok) a vložíme doň obsah (ostatné riadky):

nano ~/ansible-test/copy_facts_install_web_server.yaml
- hosts: all
  become: True
  vars_files:
    - variables.yaml
  tasks:
  - name: Vytvorenie priečinka pre externý súbor s faktami
    file:
      path: "{{ remote_dir }}"
      state: directory
      recurse: yes
  - name: Kopírovanie externého súboru s faktami do vytvoreného priečinka
    copy:
      src: "{{ facts_file }}"
      dest: "{{ remote_dir }}"

- hosts: all
  become: True
  vars_files:
    - variables.yaml
  tasks:
  - name: Inštalácia webového servera
    package:
      name: "{{ ansible_local.custom.facts.web_server }}"
      state: present

Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X a následne stlačením klávesu y a potvrdením klávesom Enter.

Rozoberme si obsah playbooku. Všetky úlohy budeme vykonávať s právami správcu (become: True). Zo súboru s premennými (vars_files: variables.yaml) sa v priebehu vykonávania úloh načíta hodnota premenných ("{{ remote_dir }}" a "{{ facts_file }}"). V poslednej úlohe sa lokálne (ansible_local) načíta hodnota premennej už zo súboru custom.fact, ktorý bude skopírovaný na každom managed node. Za časťou ansible_local nasleduje názov súboru s faktami bez koncovky (custom), potom názov sekcie (facts) a nakoniec názov samotnej premennej (web_server). Oproti jednoduchému playbooku, ktorý sme si vytvorili v predošlej časti tohto seriálu, sa v tomto playbooku nachádza aj popis každej úlohy (tasks: name). Pri spustení playbooku budeme teda vždy presne vedieť, ktorá úloha sa práve vykonáva.

Teraz už len playbook spustíme a necháme vykonať všetky tri úlohy na všetkých managed nodes:

ansible-playbook ~/ansible-test/copy_facts_install_web_server.yaml

Vysvetlenie zhrňujúcich informácií Play Recap

Po dokončení všetkých úloh Ansible nakoniec vypíše informácie o tom, ako sa úlohy podarilo vykonať. Čo tieto informácie znamenajú, popisujeme nižšie:

  • ok – ak zmeny navrhované v playbooku už sú realizované, Ansible iba zapíše stav ok a ukončí vykonávanie úlohy, pretože požadovaný stav už je dosiahnutý, a teda nie je čo meniť.
  • changed – ak navrhované zmeny v playbooku ešte nie sú realizované, Ansible ich zrealizuje a zapíše stav changed.
  • unreachable – ak je managed node nedostupný, Ansible zapíše stav unreachable.
  • failed – ak sa z nejakého dôvodu nepodarilo vykonať úlohu (napr. kvôli neexistujúcemu súboru na strane managed node), Ansible zapíše stav failed a ukončí vykonávanie nasledujúcich úloh. V prípade povolenia ignore_errors (viac v ďalšej časti tohto seriálu) Ansible nasledujúce úlohy napriek stavu failed vykoná.
  • skipped – ak v playbooku bola určená podmienka when (viac v ďalšej časti tohto seriálu), ktorá v rámci úlohy nebola splnená, Ansible takúto úlohu preskočí a zapíše stav skipped.
  • rescued – ak bol spolu s block použitý aj rescue (viac v ďalšej časti tohto seriálu) a došlo k chybe pri vykonávaní úlohy.
  • ignored – ak je zapísaný stav failed, no Ansible aj napriek chybe pokračuje vo vykonávaní ďalších úloh, pretože bol povolený ignore_errors (viac v ďalšej časti tohto seriálu).

Používame premenné pri nasadení šablóny Jinja2

Nástroj Ansible používa textový šablónovací systém jazyka Python, ktorý sa nazýva Jinja2. Pomocou tohto šablónovacie systému zmeníme HTML súbor index.html, ktorý webový server Apache zobrazuje hneď po inštalácii a spustení. Vytvoríme teda nový súbor index.html.j2 (prvý riadok), do ktorého zapíšeme obsah s premennými (ostatné riadky):

nano ~/ansible-test/index.html.j2
<html>
	<head>
		<title>index.html skopírovaný pomocou Ansible</title>
	</head>
	
	<body>
		<h1>Tento obsah bol zmenený pomocou nástroja Ansible</h1>
		<p>Hostname: {{ ansible_hostname }}</p>
		<p>Package: {{ ansible_local.custom.facts.web_server }}</p>
		<p>Facts file: {{ facts_file }}</p>
	</body>
</html>

Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X a následne stlačením klávesu y a potvrdením klávesom Enter.

Premenná {{ ansible_hostname }} je fact, ktorý poskytuje priamo systém Ansible v rámci svojej základnej výbavy hneď po nainštalovaní. Množstvo takýchto factov je možné zistiť týmto príkazom:

ansible localhost -m setup

Na zmenu súboru index.html vytvoríme playbook (prvý riadok), do ktorého zapíšeme úlohu na zavedenie šablóny (src: index.html.j2). Súbor index.html sa tak prepíše na každom managed node (dest: /var/www/html/index.html). Oprávnenia súboru nastavíme tak, aby webový server súbor index.html mohol zobraziť (mode: 0775):

nano ~/ansible-test/change_index.yaml
- hosts: all
  become: True
  vars_files:
    - variables.yaml
  tasks:
  - name: Prepísanie súboru index.html
    template:
      src: index.html.j2
      dest: /var/www/html/index.html
      mode: 0775

Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X a následne stlačením klávesu y a potvrdením klávesom Enter.

Playbook spustíme a necháme vykonať úlohu na všetkých managed nodes:

ansible-playbook ~/ansible-test/change_index.yaml

Skontrolujeme, či sa súbor index.html naozaj prepísal a webový server zobrazuje jeho obsah (vaše IP adresy sa môžu líšiť):

curl 10.1.1.5
curl 10.1.1.9

Zhrnutie

V tejto časti seriálu o nástroji Ansible sme vysvetlili, čo sú to premenné a ako sa môžu použiť. Ansible rozoznáva globálne premenné (facts) a lokálne premenné (variables). Facts alebo aj variables tvoria zároveň základnú súčasť šablónovacieho systému Jinja2, ktorý Ansible vďaka Pythonu tiež používa.

Aktualizované 22. marca 2022

Bol pre vás tento návod nápomocný?

Mohlo by vás tiež zaujímať:

Spýtajte sa nás, radi poradíme
Po - Ne 8:00-22:00
Kontaktovať podporu