ကျွန်တော်တို့ ansible playbook မှာ ansible block, tasks တွေကို condition ပေါ်မူတည်ပြီး run လို့ရပါတယ်.
remote hosts မှာရှိတဲ့ facts ( variables ) တွေ, အရင် run ထားတဲ့ tasks တွေရဲ့ results ပေါ်မူတည်ပြီး လက်ရှိ task ကို run ဖို့ လုပ်တဲ့ နေရာမှာ ansible playbook conditionals ကိုသုံးပါတယ်.
tasks group လိုက်ကြီးကို ansible block ထဲမှာ ထည့်ပြီး conditionals နဲ့ condition check ပြီး run လို့လဲရပါတယ်.
ansible playbook condition က python conditional statement ( if/elif/else ) တို့ နဲ့ သဘောတရား တူပါတယ်.
ansible မှာ condition အတွက် Jinja2 tests and filters ကိုသုံးထားပါတယ်.
ansible control flow ( conditionals ) တွေကိုကြည့်ပါ.

basic conditionals with when
ansible playbook မှာ when statement ကို tasks, ansible block တွေကို condition check လုပ်ပြီး run တဲ့အခါမှာသုံးပါတယ်.
when statement မှာ JInja2 expression ကို သုံးထားပါတယ်, double curly-braces ” {{ variables }} “ ကိုတော့ထည့်ဖို့ မလိုပါဘူး.
Jinja2 expression ဆိုတာက အကြမ်းအားဖြင့် variables, operators တွေကိုပြောတာပါ.
Jinja2 operators တွေက python operators တွေနဲ့ သဘောတရားတူပါတယ်.


Jinja2 နဲ့ပါတ်သတ်ပြီး ကျွန်တော် အရင်က share ထားတဲ့ post ရှိပါတယ်.
ansible conditionals ( when ) ကို ansible playbook မှာ task တစ်ခုအတွက်သုံးတာကို နမူနာကြည့်ပါ.
vim when.yaml
---
- name: use when statement
hosts: all
tasks:
- name: use when statement for conditional checking
apt:
name: glances
state: latest
when: ansible_distribution == "Ubuntu"
ansible_distribution ( variables ) ကို comparison operators ( == ) နဲ့ OS Distribution check လုပ်တာပါ.
တစ်ကယ်လို့ OS Distribution က Ubuntu ဖြစ်ရင် condition check တာ pass ဖြစ်ပြီး task မှာသတ်မှတ်ထားတဲ့ package ကို remote hosts မှာ install လုပ်မှာပါ.
ansible-playbook when.yaml

ansible conditionals ( when ) ကို ansible block မှာသုံးတာကို နမူနာကြည့်ပါ.
ansible block ဆိုတာက tasks တွေကို block လိုက်စုပြီး python ( try / except / finally ) clause ပုံစံနဲ့ သုံးတာပါ.
vim when_block.yaml
---
- name: check when statement
hosts: all
tasks:
- name: install lamp stack on ubuntu
block:
- name: install apache server
yum:
name: httpd
state: latest
- name: install mysql
yum:
name: mysql-server
state: latest
- name: install php
yum:
name: php7.4
state: latest
rescue:
- name: install apache server
apt:
name: apache2
state: latest
- name: install mysql
apt:
name: mysql-server
state: latest
- name: install php
apt:
name: php7.4
state: latest
when: ansible_distribution == "Ubuntu"
when နဲ့ condition check လုပ်ထားလို့ rescue ပိုင်းက tasks တွေက block ပိုင်း က error တက်လဲ condition pass မဖြစ်ရင် မ run ပါဘူး.

conditionals based on ansible_facts
ကျွန်တော်တို့ conditionals statement ( when ) ကို ansible playbook မှာ ansible_facts ပေါ်မူတည်ပြီး သုံးလို့ရပါတယ်.
ansible_facts နဲ့ပါတ်သတ်ပြီး ကျွန်တော်အရင်က sharing လုပ်ထားတာရှိပါတယ်.
conditionals statement ( when ) မှာ အသုံးများတဲ့ ansible_facts တွေကိုကြည့်ပါ.
tasks:
- name: Shut down Debian flavored systems
ansible.builtin.command: /sbin/shutdown -t now
when: ansible_facts['os_family'] == "Debian"
conditionals statement ( when ) မှာ ansible_facts နဲ့ comparison operator ( == ) သုံးပြီး condition check လုပ်တာပါ.
တစ်ကယ်လို့ remote hosts ရဲ့ distribution က Debian ဖြစ်ရင် သတ်မှတ်ထားတဲ့ tasks က run မှာပါ.
tasks:
- name: Shut down CentOS 6 and Debian 7 systems
ansible.builtin.command: /sbin/shutdown -t now
when: (ansible_facts['distribution'] == "CentOS" and ansible_facts['distribution_major_version'] == "6") or
(ansible_facts['distribution'] == "Debian" and ansible_facts['distribution_major_version'] == "7")
တစ်ကယ်လို့ condition check က multiple ဖြစ်နေရင် parentheses ( ) ထဲထည့်ရေးပြီး group ဖွဲ့လို့ရပါတယ်.
(ansible_facts['distribution'] == "CentOS" and ansible_facts['distribution_major_version'] == "6")
multiple conditions တွေကို logical operator ( and, or ) သုံးပြီးပေါင်းရေးလို့ရပါတယ်.
(ansible_facts['distribution'] == "CentOS" and ansible_facts['distribution_major_version'] == "6") or
(ansible_facts['distribution'] == "Debian" and ansible_facts['distribution_major_version'] == "7")
logical operator ( and ) ကိုသုံးပြီး multiple condition ကို condition check လုပ်ရင် condition အကုန်လုံး pass ဖြစ်မှ tasks တွေက run မှာပါ.
---
- name: check multiple condition
hosts: all
tasks:
- name: use conditionals statement in tasks
command: /usr/bin/true
when:
- ansible_facts['distribution'] == 'Ubuntu'
- ansible_facts['distribution_major_version'] == "20"
logical operator ( and ) ကို yaml list ပုံစံနဲ့ ရေးလို့ရပါတယ်.
when:
- ansible_facts['distribution'] == 'Ubuntu'
- ansible_facts['distribution_major_version'] == "20"
vim check_condition.yaml
ansible-playbook --syntax-check check_condition.yaml

logical operator ( or ) ကိုသုံးပြီး multiple condition ကို condition check လုပ်ရင် condition တစ်ခု pass ဖြစ်မှ tasks တွေက run မှာပါ.
---
- name: check multiple condition
hosts: all
tasks:
- name: use conditionals statement in tasks
command: /usr/bin/true
when: ansible_facts['distribution'] == 'CentOS' or ansible_facts['distribution_major_version'] == "19"

တစ်ကယ်လို့ condition check လုပ်တာ fail ဖြစ်ရင် ansible က tasks ကို skipped လုပ်မှာပါ.

တစ်ကယ်လို့ ကျွန်တော်တို့ condition check လုပ်မဲ့ facts ( variables ) က string ဖြစ်ပြီး integer နဲ့ check ဖို့လိုရင် filter plugin ကိုသုံးလို့ရပါတယ်.
---
- name: check multiple condition
hosts: all
tasks:
- name: use conditionals statement in tasks
shell: echo "This playbook run only on ubuntu 20.04"
when: ansible_facts['distribution'] == "Ubuntu" and ansible_facts['distribution_major_version'] | int == 20
conditionals based on registered var
ကျွန်တော်တို့ ansible playbook မှာ အရင် run ထားတဲ့ task ရဲ့ results ပေါ်မူတည်ပြီး နောက် task ကို run လို့ရပါတယ်.
အရင် run ထားတဲ့ task ရဲ့ result ( variables ) ကို register keyword သုံးပြီး နောက် task မှာ ပြန်သုံးတာပါ.
register လုပ်ထားတဲ့ variables ကို when statement နဲ့ condition check ပြီး ကိုယ်လိုချင်တဲ့ result ဖြစ်ရင် task ကို run မှာပါ.
ansible playbook မှာ register နဲ့ when statement တွဲသုံးတာကို နမူနာကြည့်ပါ.
---
- name: use register keyword
hosts: all
tasks:
- name: use register key for condition
command: /usr/bin/true
register: command
- name: check command rc
shell: echo "rc of command is 0"
when: command.rc == 0

ansible modules တွေရဲ့ return values နဲ့ပါတ်သက်ပြီး ကျွန်တော် sharing လုပ်ထားတာရှိပါတယ်.
conditionals base on variables
ansible playbook, inventory file မှာသတ်မှတ်ထားတဲ့ variables ပေါ်မူတည်ပြီး conditionals ကို သုံးလို့ရပါတယ်.
ansible variables ပါတ်သတ်ပြီး ကျွန်တော် အရင်က sharing လုပ်ထားတဲ့ post ရှိပါတယ်.
ansible playbook မှာ variables ကို conditionals ( when ) နဲ့တွဲသုံးတာကိုကြည့်ပါ.
conditionals ( when ) မှာ variables ကိုသုံးချင်ရင် Jinja2 Syntax ” {{ variables }} “ မလိုပါဘူး.
variables ကို conditionals နဲ့သုံးတဲ့အခါ boolean, Jinja2’s defined test တွေကိုသုံးပြီး condition ကို check လုပ်ပါတယ်.
boolean values တွေကိုကြည့်ပါ.
- true ( variable တစ်ခုထဲ သတ်မှတ်ပြီး true ဖြစ်ရင် condition က pass ဖြစ်မှာပါ )
- false ( variable တစ်ခုထဲ သတ်မှတ်ပြီး false ( not true ) ဖြစ်ရင် condition က pass ဖြစ်မှာပါ )
Jinja2’s defined test တွေကိုကြည့်ပါ.
- is defined ( variable သတ်မှတ်ထားတာရင် condition က pass ဖြစ်မှာပါ )
- is not defined ( variable မသတ်မှတ်ထားတာရင် condition က pass ဖြစ်မှာပါ )
ansible playbook conditionals ( when ) မှာ boolean values သုံးတာကို နမူနာကြည့်ပါ.
vim condition_var.yaml
---
- name: use variables in conditionals
hosts: all
vars:
foo: true
bar: false
tasks:
- name: use variables in conditionals
shell: echo "foo variable is defined"
when: foo
- name: use variables in conditionals
shell: echo "bar variable is not defined"
when: not bar

ansible playbook conditionals ( when ) မှာ Jinja2’s defined test သုံးတာကို နမူနာကြည့်ပါ.
vim condition_var_jinja.yaml
---
- name: use variables in conditionals
hosts: all
vars:
foo: true
tasks:
- name: use variables in conditionals
shell: echo "foo variable is defined"
when: foo is defined
- name: use variables in conditionals
shell: echo "bar variable is not defined"
when: bar is not defined

ansible ကိုဆက်လေ့လာလိုလျှင်.
https://www.ansiblefordevops.com/
https://www.jeffgeerling.com/blog/2020/ansible-101-jeff-geerling-youtube-streaming-series