Ansible 101 – Ansible Loops

ကျွန်တော်တို့ 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 ကိုသုံးလဲရပါတယ်.

Image by ansible docs

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

Thanks

Leave a Reply

Your email address will not be published. Required fields are marked *