ကျွန်တော်တို့ ansible playbook မှာ တူညီတဲ့ tasks တွေကို ထပ်ခါ ထက်ခါ run တဲ့အခါမှာ ansible loops ကိုသုံးပါတယ်.
file, directory တို့ရဲ့ ownership ပြောင်းတာ, user, group အသစ်တွေကို create လုပ်တဲ့နေရာမှာသုံးတာများပါတယ်.
ansible loops က python ( for loop ) နဲ့ သဘောတရားတူပါတယ်.
python for loop ကို python ( list, tuple, dictionary, set, string ) data types တွေကို sequence အပေါ်မူတည်ပြီး iterate လုပ်တဲ့နေရာမှာ သုံးပါတယ်.
python for loop ကို list data type မှာသုံးတာကို နမူနာကိုကြည့်ပါ.
fruits = ["apple", "banana", "cherry"]
for x in fruits:
print(x)
fruits ( python list ) ကို for loop သုံးပြီး iterate လုပ်မှာပါ.
fruits က iterable object ဖြစ်ပါတယ်.
x က iteration variables ပါ.
for loop က fruits ( iterable object ) ထဲက ရှိတာအကုန်လုံးကို iterate လုပ်မှာပါ.

loop and with_*
ansible playbook မှာ အသုံးများတဲ့ loop keywords တွေက loop and with_* တို့ဖြစ်ပါတယ်.
with_* keyword ကို ansible version အဟောင်းမှာ အသုံးများပါတယ်.
loop keyword ကို ansible version အသစ်မှာ အသုံးများပါတယ်.
loop keyword နဲ့ with_* keyword က အသုံးပြုပုံက အတူတူပါဘဲ.
loop
loop keyword ကို ansible playbook မှာသုံးတာကိုကြည့်ပါ. list data types မှာသုံးထားတာပါ.
loop keyword နေရာမှာ with_items keyword ကိုသုံးလဲရပါတယ်.
ansible playbook အဟောင်းတွေမှာ with_items ကိုသုံးပါတယ်.
vim with_items.yaml
---
- name: use ansible loop
hosts: all
tasks:
- name: use ansible loop
user:
name: "{{ item }}"
state: present
group: "sudo"
loop:
- testuser1

item က loop variables ပါ, loop keyword မှာ သတ်မှတ်ထားတဲ့ object တွေကို loop ( iterate ) လုပ်မှာပါ.

yaml dictionary ( hash ) မှာ ansible loop သုံးတာကိုကြည့်ပါ.
---
- name: use ansible loop
hosts: all
tasks:
- name: use ansible loop
user:
name: "{{ item.name }}"
state: present
group: "{{ item.groups }}"
loop:
- name: 'testuser3'
groups: 'sudo'
- name: 'testuser4'
groups: 'sudo'

loop keyword ကိုသုံးပြီး yaml dictionary (or) hash ကို loop ပါတ်မယ်ဆိုရင် list of dictionary အနေနဲ့ သုံးရမှာပါ.
yaml dictionary ရဲ့ key ကို ansible loop variables ( item ) မှာ ပြန်ခေါ်သုံးတဲ့အခါမှာ item.key နဲ့ပြန်ခေါ်သုံးလို့ရပါတယ်.

တစ်ကယ်လို့ loop မှာ list of dictionary ကိုမသုံးချင်ရင် dict2items filter ကိုသုံးလဲရပါတယ်.

registering variables with loop
ကျွန်တော်တို့ ansible loop ရဲ့ output ကို register keyword သုံးပြီး variables အနေနဲ့ playbook မှာပြန်သုံးလို့ရပါတယ်.
ansible loop ရဲ့ output variables ကို playbook မှာပြန်သုံးတဲ့အခါမှာ results ( atrribute ) ကိုထည့်ပေးရပါတယ်.
loop variables ကို ansible playbook မှာသုံးတာကိုကြည့်ပါ.
vim register_loop.yaml
---
- name: use ansible loop
hosts: all
tasks:
- name: use ansible loop
user:
name: "{{ item.name }}"
state: present
group: "{{ item.groups }}"
loop:
- name: 'testuser3'
groups: 'sudo'
- name: 'testuser4'
groups: 'sudo'
register: echo
- name: use loop register variable
debug:
msg: "{{ echo.results[0].home }}"
ansible loop ရဲ့ output ကို register keyword သုံးပြီး echo ( variable ) မှာသိမ်းထားပါတယ်.
echo ( variable ) ကို ansible playbook မှာပြန်သုံးတဲ့ အခါမှာ results ( attribute ) ကိုထည့်ပေးရပါတယ်.
results[0] က results ထဲမှာ ပါတာတွေက JSON list data type ဖြစ်လို့ indexing ကိုသုံးပြီးခေါ်ရတာပါ.


ansible မှာ JSON အသုံးပြုပုံကို ကျွန်တော်အရင်က sharing လုပ်ထားတာရှိပါတယ်.
using conditionals in loops
ansible loop ကို conditionals ( when ) နဲ့လဲ တွဲသုံးလို့ရပါတယ်.
ansible conditionals ( when ) အသုံးပြုပုံကို ကျွန်တော်အရင်က sharing လုပ်ထားတာရှိပါတယ်.
ansible loop ကို conditionals ( when ) နဲ့တွဲသုံးတာကိုကြည့်ပါ.
vim conditional_loop.yaml
---
- name: use ansible loop
hosts: all
tasks:
- name: use ansible loop
user:
name: "{{ item.name }}"
state: present
group: "{{ item.groups }}"
loop:
- name: 'testuser3'
groups: 'sudo'
- name: 'testuser4'
groups: 'sudo'
when: ansible_facts['distribution'] == 'CentOS'
ansible loop ကို conditionals ( when ) နဲ့ condition check လုပ်ထားလို့ လိုအပ်တဲ့ condition pass ဖြစ်မှ task က run မှာပါ.
ansible loops ရဲ့ docs ကို အောက်ပါ link မှာကြည့်ပါ.
https://docs.ansible.com/ansible/latest/user_guide/playbooks_loops.html#playbooks-loops
ansible ကို ဆက်လေ့လာလိုလျှင်.
https://www.ansiblefordevops.com/
https://www.jeffgeerling.com/blog/2020/ansible-101-jeff-geerling-youtube-streaming-series