Skip to content

Blokid ja veahaldus

Ansible block on võimas konstruktsioon, mis võimaldab loogiliselt grupeerida mitu taski üheks tervikuks. Sellel on kaks peamist eesmärki:

  • Grupeerimine: Rakendada ühiseid tingimusi (when) või seadeid (become, tags) mitmele taskile korraga, ilma koodi kordamata.
  • Veahaldus: Ehitada "Try / Catch / Finally" loogikat, et tegeleda ootamatute vigadega ilma playbooki peatamata.

Grupeerimine

Selle asemel, et kirjutada when: ansible_os_family == 'Debian' iga taski taha, saame need panna blokki:

- name: Seadista Debianipõhised asjad
  when: ansible_os_family == 'Debian'
  block:
    - name: Installi apache2
      apt:
        name: apache2
        state: present

    - name: Kopeeri konf
      template:
        src: apache.conf.j2
        dest: /etc/apache2/apache2.conf

Veahaldus

Keerulisemates süsteemides võib juhtuda vigu, mida me tahame kinni püüda (näiteks: teenuse restart ebaõnnestub, aga me tahame proovida teist meetodit, mitte peatada skripti).

Selleks on struktuur (sarnane programmeerimiskeeltele):

  • block (Try): Kood, mida üritame jooksutada.
  • rescue (Catch): Kood, mis käivitub ainult siis, kui block osas tekkis viga (failed staatus).
  • always (Finally): Kood, mis käivitub alati, olenemata sellest, kas tekkis viga või mitte. Üldiselt kasutusel cleanup-iks.

Praktiline ülesanne

Simuleerime olukorda, kus üritame paigaldada tarkvara, mis võib ebaõnnestuda (näiteks vale nimega pakk), ja tegeleme selle veaga viisakalt.

Complete

Loo uus playbook (või täienda olemasolevat) järgneva struktuuriga.

Me üritame installida pakki nimega kalahirv, mida ei eksisteeri. Kui see ebaõnnestub, püüame vea kinni ja prindime teate. Lõpuks teatame, et protsess on läbi.

- hosts: all
  tasks:
    - name: Riskantne tarkvara paigaldus
      block:
        - name: Ürita installida olematut pakki
          package:
            name: kalahirv
            state: present

        - name: See task ei tohiks kunagi käivituda
          debug:
            msg: "Seda teadet ei tohiks näha, kui eelmine task feilis!"

      rescue:
        - name: Püüa viga kinni
          debug:
            msg: "Paigaldus ebaõnnestus! Aga pole hullu, liigume edasi."

        # Siin võiks olla näiteks alternatiivne installimeetod (nt compile from source)

      always:
        - name: Koristustööd
          debug:
            msg: "See jookseb alati - olgu tulemus roheline või punane."

Verify

Jooksuta playbooki. Jälgi väljundit hoolikalt:

  1. Ürita installida... peaks olema punane (failed), aga Ansible ei peata tööd.
  2. See task ei tohiks kunagi käivituda jäetakse vahele.
  3. Püüa viga kinni (Rescue) käivitatakse ja on roheline/kollane.
  4. Koristustööd (Always) käivitatakse lõpus.

Lõpptulemusena peaks playbooki kokkuvõttes (Play Recap) olema failed=0, sest rescue blokk lahendas vea ära.