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
- Loo
files/kausta kaks tühja faili:config_a.txtjaconfig_b.txt. - 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.