Ansible – 4. Vault, bloky a role

V predošlej č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.

V tejto časti predstavíme šifrovanie citlivých údajov pomocou nástroja Ansible Vault. Ďalej ukážeme, ako viacero úloh spojiť do bloku a ako tak môžeme prispôsobiť chybové hlásenia pre jednotlivé úlohy. Nakoniec pomocou rolí prehľadne rozdelíme playbooky, premenné, súbory a šablóny do priečinkov, aby bolo možné jednoducho ich kedykoľvek opakovane použiť.

Zabezpečujeme citlivé údaje

Systém Ansible ponúka hneď po inštalácii nástroj Vault, vďaka ktorému môžeme zašifrovať citlivé údaje. Najskôr ale musíme vytvoriť silné náhodné heslo (openssl rand -base64 128) a uložiť ho mimo priečinka s playbookmi do skrytého súboru ~/.ansible_vault_key:

openssl rand -base64 128 > ~/.ansible_vault_key

Presvedčíme sa, či sa heslo naozaj vytvorilo a úspešne uložilo do súboru:

cat ~/.ansible_vault_key

Je veľmi dôležité, aby prístup k obsahu súboru ~/.ansible_vault_key mal iba jeho autor, inak generované heslo nebude bezpečné použiť. Z tohto dôvodu súboru nastavíme prístupové údaje tak, aby jedine vlastník súboru mohol súbor čítať a zapisovať doň:

chmod 600 ~/.ansible_vault_key

Do súboru s premennými (tu ~/ansible-test/variables.yaml) zapíšeme heslo, ktoré neskôr použijeme ako jeden s prihlasovacích údajov. Aby heslo neuniklo, zašifrujeme celý súbor pomocou nástroja Ansible Vault, pričom ako heslo určíme obsah súboru s heslom (--vault-password-file ~/.ansible_vault_key):

ansible-vault encrypt --vault-password-file ~/.ansible_vault_key ~/ansible-test/variables.yaml

Pri spustení playbooku stačí opäť zadať cestu k súboru s heslom (--vault-password-file ~/.ansible_vault_key), aby Ansible mohol zašifrovaný súbor s premennými (~/ansible-test/variables.yaml) ešte pred spustením playbooku dešifrovať a načítať z neho hodnoty premenných:

ansible-playbook --vault-password-file ~/.ansible_vault_key ~/ansible-test/change_index.yaml

Spájame úlohy do blokov

Ansible umožňuje zoskupiť úlohy do blokov. Môžeme tak na jednom mieste určiť nastavenia spoločné pre všetky zoskupené úlohy, a tiež efektívne ošetriť chybové hlásenia jednotlivých úloh. Z predošlej časti si playbook copy_facts_install_web_server.yaml upravíme takto:

nano ~/ansible-test/copy_facts_install_web_server.yaml
- hosts: all
  become: True
  vars_files:
    - variables.yaml
  tasks:
    - block:
      - 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 }}"
      when: ansible_facts['distribution'] == 'Ubuntu'
      ignore_errors: yes

- 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.

Prvé dve úlohy sme zoskupili do bloku (block), pričom na konci bloku sme určili, že sa úlohy vykonajú iba vtedy, keď na managed nodes bude zistená linuxová distribúcia Ubuntu (when: ansible_facts['distribution'] == 'Ubuntu'). No a úlohy v bloku sa vykonajú všetky bez ohľadu na to, či nastane alebo nenastane chyba (ignore_errors: yes), inak by Ansible pri prvej chybe zastavil vykonávanie ďalších úloh.

Playbook spustíme a overíme očakávaný výpis so skutočnosťou:

ansible-playbook --vault-password-file ~/.ansible_vault_key ~/ansible-test/copy_facts_install_web_server.yaml

Súčasťou bloku sú aj rescue (úlohy spustené po chybnej úlohe v bloku) a always (úlohy spúšťané po každej úlohe v bloku). Playbook copy_facts_install_web_server.yaml upravíme takto:

nano ~/ansible-test/copy_facts_install_web_server.yaml
- hosts: all
  become: True
  vars_files:
    - variables.yaml
  tasks:
    - block:
      - 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 }}"
      when: ansible_facts['distribution'] == 'Ubuntu'
      ignore_errors: yes
    
      rescue:
        - name: Vyskytla sa chyba!
          debug:
            msg: "Toto je správa, ktorá sa zobrazí pri chybe úlohy v bloku."
    
      always:
        - name: Po každej úlohe bloku
          debug:
            msg: "Toto je správa, ktorá sa zobrazí po vykonaní každej úlohy v bloku."

- 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.

Playbook spustíme a overíme očakávaný výpis so skutočnosťou:

ansible-playbook --vault-password-file ~/.ansible_vault_key ~/ansible-test/copy_facts_install_web_server.yaml

Triedime súbory do priečinkov

Aktuálne sa všetky súbory, ktoré sme doteraz v jednotlivých častiach tohto seriálu použili, nachádzajú v jednom priečinku ~/ansible-test/. Vďaka rolám (roles) si v týchto súboroch môžeme vytvoriť prehľadnejší systém. Jednotlivé playbooky, premenné, súbory a šablóny premiestnime do priečinkov. Vytvoríme priečinok s názvom roles a premiestnime sa doň (prvý riadok). V priečinku roles pomocou nástroja Ansible Galaxy vytvoríme štruktúru súborov a priečinkov pre rolu s názvom web (druhý riadok):

mkdir ~/ansible-test/roles && cd roles
ansible-galaxy role init web

Názov roly web tvorí zároveň názov priečinka, v ktorom bola vytvorená štruktúra súborov a priečinkov. Po nainštalovaní nástroja tree (prvý riadok) štruktúru súborov a priečinkov môžeme overiť (druhý riadok):

sudo apt install tree
tree ~/ansible-test/roles/web

Súbor README.md obsahuje informácie o role a je písaný vo formáte markdown, ako je to obvyklé napríklad aj v rámci služby GitHub. Tento súbor ponúka štruktúru informácií, vďaka ktorej nezabudnete zaznačiť dôležité informácie o použitých súboroch.

Z priečinkov budeme používať files, tasks, templates a vars, do ktorých postupne skopírujeme jednotlivé súbory:

cp ~/ansible-test/custom.fact ~/ansible-test/roles/web/files/custom.fact
cp ~/ansible-test/copy_facts_install_web_server.yaml ~/ansible-test/roles/web/tasks/main.yml
cp ~/ansible-test/index.html.j2 ~/ansible-test/roles/web/templates/index.html.j2
cp ~/ansible-test/variables.yaml ~/ansible-test/roles/web/vars/main.yml

Playbook skopírovaný ako ~/ansible-test/roles/web/tasks/main.yml upravíme tak, aby obsahoval iba úlohy, keďže sa nachádza v priečinku tasks:

nano ~/ansible-test/roles/web/tasks/main.yml
- 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 }}"

- name: Inštalácia webového servera
  package:
    name: "{{ ansible_local.custom.facts.web_server }}"
    state: present

- 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.

Servery, ku ktorým sa pripájame, teraz ešte rozdelíme v súbore inventory (prvý riadok) do dvoch skupín (ostatné riadky):

nano ~/ansible-test/inventory
[web_1]
10.1.1.5

[web_2]
10.1.1.9

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.

V priečinkoch roly web je všetko pripravené. Ostáva ešte vytvoriť playbook role-web.yaml (prvý riadok), ktorý si údaje automaticky načíta (ostatné riadky) s jednotlivých priečinkov role web:

nano ~/ansible-test/role-web.yaml
- hosts: web_1
  become: true
  roles:
    - web

Vo vyššie vytvorenom playbooku chceme zasiahnuť iba servery zo skupiny, ktorá je definovaná v súbore inventory pod názvom web_1 (čiže len IP adresa 10.1.1.5). Úlohy sa budú vykonávať s právami správcu (become: true) a všetky potrebné údaje Ansible načíta zo štruktúry súborov a priečinkov roly web (roles: web). Teraz už len stačí spustiť playbook:

ansible-playbook --vault-password-file ~/.ansible_vault_key ~/ansible-test/role-web.yaml

Zhrnutie

V poslednej časti sme predstavili šifrovanie citlivých údajov pomocou nástroja Ansible Vault. Ďalej sme ukázali, ako viacero úloh spojiť do bloku a ako tak prispôsobiť chybové hlásenia pre jednotlivé úlohy. Nakoniec sme pomocou rolí roztriedili úlohy, premenné, súbory a šablóny do priečinkov, aby ich bolo možné jednoducho kedykoľvek opakovane použiť.

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