Ansible 101 – Conditionals Usage In Ansible Playbook

ကျွန်တော်တို့ 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 ) တွေကိုကြည့်ပါ.

Image by Ansible Docs

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 တွေနဲ့ သဘောတရားတူပါတယ်.

Image by www.techbeamers.com

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

Thanks

Leave a Reply

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