Skip to content

Kordused (loop, with_*)

Üks põhilisi automaatika printsiipe on DRY (Don't Repeat Yourself). Kui soovid paigaldada 10 paketti, ei ole mõistlik kirjutada 10 korda package moodulit. Selleks on Ansiblel korduste mehhanismid.

loop vs with_*

Ansibles on ajalooliselt olnud palju erinevaid korduseid: with_items, with_fileglob, with_dict jne.

Alates versioonist 2.5 on soovituslik kasutada ühtset märksõna loop.

  • with_items: See on vana standard. Selle eripära on see, et ta teeb nimekirjad "lamedaks" (flattening). Kui annad talle nimekirja nimekirjadest, teeb ta sellest ühe pika jada.
  • loop: See on uus standard. See ei tee midagi automaatselt "lamedaks". See võtab sisendi täpselt nii nagu on.

Tänapäeval on lihtsate nimekirjade puhul need kaks identsed. Keerulisemate struktuuride puhul eelistatakse loop-i koos filtritega, aga tegelikult töötavad mõlemad.

Erinevuse kontroll:

vars:
  my_nested_list:
    - [ 'a', 'b' ]
    - [ 'c', 'd' ]

tasks:
  - debug:
      msg: "{{ item }}"
    with_items: "{{ my_nested_list }}"

  - debug:
      msg: "{{ item }}"
    loop: "{{ my_nested_list }}"

  - debug:
      msg: "{{ item }}"
    loop: "{{ my_nested_list | flatten(levels=1) }}"

Lihtne nimekiri (with_items)

Kõige klassikalisem näide sellest kasutusest on pakkide paigaldus.

Complete

Loo uus playbook (või täienda olemasolevat). Kirjuta task, mis paigaldab kolm tarkvara: git, wget ja htop.

Kasuta selleks package moodulit ja with_items märksõna. Selles sammus kirjuta pakkide nimed otse taski sisse.

- name: Paigalda vajalikud tööriistad
  package:
    name: "{{ item }}"
    state: present
  with_items:
    - git
    - wget
    - htop

Jooksuta playbooki.

Verify

Ansible väljundis peaksid nägema, et see task jookseb kolm korda (või korra, näidates kõiki itemeid, sõltuvalt Ansible versioonist ja väljundi pluginast).

Nimekiri muutujas

Sellised konstruktsioonid töötavad ka koos muutujatega. Kuidas täpselt, oleneb mida kasutada - soovitan enne testida debug mooduliga, aga andmetüübid jälgivad Pythoni loogikat.

Complete

Tõsta pakkide nimekiri ümber muutujasse packages_to_install. Võid selle defineerida playbooki vars: sektsioonis.

Seejärel muuda taski, et see kasutaks seda uut muutujat.

vars:
  packages_to_install:
    - git
    - wget
    - htop

tasks:
  - name: Paigalda tööriistad muutujast
    package:
        name: "{{ item }}"
        state: present
    with_items: 
     - "{{ packages_to_install }}"

Verify

Tulemus peaks olema sama, mis eelmises punktis.

NB! Võid proovida ka näiteks kahe nimekirja muutujaga. Mis juhtub?

Keerulisemad objektid (Sõnastikud)

Tihti ei piisa ainult stringide (teksti) iteratsioonist. Näiteks failide kopeerimisel on vaja teada nii faili nime kui ka sihtkohta ja õiguseid.

Sellisel juhul koosneb meie nimekiri sõnastikest (dictionaries). Iga item on objekt, millel on omadused (nt item.src, item.dest).

Complete

  1. Loo files/ kausta kaks tühja faili: config_a.txt ja config_b.txt.
  2. Kirjuta playbooki task, mis kopeerib need failid erinevatesse kohtadesse erinevate õigustega, kasutades ühte taski.
tasks:
  - name: Kopeeri failid parameetritega
    copy:
      src: "{{ item.src }}"
      dest: "{{ item.dest }}"
      mode: "{{ item.mode }}"
    with_items:
      - { src: 'config_a.txt', dest: '/tmp/config_a.txt', mode: '0644' }
      - { src: 'config_b.txt', dest: '/tmp/config_b.txt', mode: '0600' }

Verify

Jooksuta playbooki. Seejärel kontrolli sihtmasinas: ls -l /tmp/config_*.txt

Peaksid nägema, et config_a.txt on õigustega -rw-r--r-- (644) ja config_b.txt on -rw------- (600).

Boonus: kasutajate loomine

Üks levinumaid kohti kordusteks on kasutajate haldus.

Complete

Loo task, mis teeb süsteemi kolm kasutajat: arendaja1, arendaja2, testija1.

Lisa testija1 gruppi wheel (või sudo), aga teised mitte. See eeldab tingimuslauset korduse sees või andmestruktuuri, mis defineerib grupid.

vars:
  users:
    - name: arendaja1
      groups: []
    - name: arendaja2
      groups: []
    - name: testija1
      groups: [wheel] # CentOS puhul wheel, Debiani puhul sudo

tasks:
  - name: Loo kasutajad
    user:
      name: "{{ item.name }}"
      groups: "{{ item.groups }}"
      state: present
      append: yes # Et mitte eemaldada olemasolevaid gruppe
    loop: "{{ users }}"

Verify

Kontrolli masinas käsuga id testija1, kas ta kuulub administraatorite gruppi.