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.