Ansible এ শর্ত ভিত্তিক (Conditional) এবং লুপ (Loop) ফিচার দুটি প্লেবুকের কার্যকারিতা ও ফ্লেক্সিবিলিটি বাড়ানোর জন্য খুবই গুরুত্বপূর্ণ। এগুলির মাধ্যমে আপনি টাস্কগুলোকে কন্ডিশনাল বা পুনরাবৃত্তিমূলক করে তুলতে পারেন। আসুন, এই দুটি সম্পর্কে বিস্তারিত জানি।
১. শর্ত ভিত্তিক (Conditional)
Ansible এ টাস্কগুলোকে নির্দিষ্ট শর্তের উপর ভিত্তি করে চালানো যায়। শর্ত পূরণ না হলে সেই টাস্কটি স্কিপ করা হয়। এটি প্লেবুকে ডায়নামিক সিদ্ধান্ত নেওয়ার জন্য ব্যবহৃত হয়।
শর্ত ভিত্তিক কন্ডিশন ব্যবহার: when
whenকিওয়ার্ড ব্যবহার করে শর্ত নির্ধারণ করা হয়। এটি একটি লজিক্যাল এক্সপ্রেশন বা ভ্যারিয়েবলের মান চেক করে।- যদি
whenকন্ডিশনটি সত্য (True) হয়, তাহলে সেই টাস্কটি চালানো হবে। অন্যথায়, এটি স্কিপ করা হবে।
উদাহরণ:
---
- name: Conditional Task Example
hosts: localhost
tasks:
- name: Install Apache only on Debian systems
apt:
name: apache2
state: present
when: ansible_facts['os_family'] == 'Debian'
ব্যাখ্যা:
- এখানে
whenকন্ডিশন ব্যবহার করে চেক করা হয়েছে যে সিস্টেমের অপারেটিং সিস্টেম ফ্যামিলিDebianকিনা। - যদি সিস্টেম
Debianহয়, তাহলেapache2ইনস্টল করা হবে; নতুবা টাস্কটি স্কিপ হবে।
শর্ত হিসেবে ভ্যারিয়েবল বা রেজিস্টার ব্যবহার
---
- name: Example with registered variable
hosts: localhost
tasks:
- name: Check if a file exists
stat:
path: /etc/passwd
register: file_check
- name: Display message if file exists
debug:
msg: "The file exists!"
when: file_check.stat.exists
ব্যাখ্যা:
- প্রথম টাস্কে
statমডিউল দিয়ে ফাইল চেক করা হয়েছে এবং ফলাফলfile_checkএ সংরক্ষণ করা হয়েছে। - দ্বিতীয় টাস্ক তখনই চালানো হবে যখন
file_check.stat.existsসত্য হবে অর্থাৎ ফাইলটি সিস্টেমে বিদ্যমান।
২. লুপ (Loop)
Ansible এ loop ব্যবহার করে একই টাস্ককে একাধিক মানের উপর পুনরাবৃত্তি করে চালানো যায়। এটি তখনই কার্যকর, যখন আপনাকে একই ধরনের কাজ একাধিক মান বা আইটেমের উপর করতে হয়।
লুপ ব্যবহার: loop
loopকিওয়ার্ডের মাধ্যমে আপনি একটি লিস্ট বা আইটেম সেট নির্ধারণ করতে পারেন এবং সেই লিস্টের প্রতিটি আইটেমের উপর টাস্কটি চালানো হবে।
উদাহরণ:
---
- name: Install multiple packages
hosts: localhost
tasks:
- name: Install necessary packages
apt:
name: "{{ item }}"
state: present
loop:
- apache2
- mysql-server
- php
ব্যাখ্যা:
- এখানে
loopদিয়ে একটি লিস্ট ব্যবহার করা হয়েছে যাতে তিনটি প্যাকেজ (apache2,mysql-server,php) ইনস্টল করা হবে। - প্রতিটি আইটেমের জন্য টাস্কটি পুনরাবৃত্তি করে চালানো হবে।
আরও উদাহরণ: লুপ এবং ভ্যারিয়েবলের সাথে
---
- name: Add multiple users
hosts: localhost
tasks:
- name: Create users
user:
name: "{{ item.name }}"
state: present
shell: "{{ item.shell }}"
loop:
- { name: 'alice', shell: '/bin/bash' }
- { name: 'bob', shell: '/bin/zsh' }
ব্যাখ্যা:
- এখানে প্রতিটি লুপ আইটেমে একটি ডিকশনারি আছে যাতে
nameএবংshellকনফিগারেশন উল্লেখ করা আছে। userমডিউলটি প্রতিটি আইটেমের জন্য চালানো হচ্ছে এবং নতুন ইউজার তৈরি করা হচ্ছে।
with_items এবং লুপ কন্ট্রোল (লুপের আগের ফর্ম্যাট)
Ansible এর আগের সংস্করণে loop এর পরিবর্তে with_items ব্যবহার করা হতো। এটি এখন পুরনো ফর্ম্যাট হিসেবে বিবেচিত হলেও এখনো অনেক স্ক্রিপ্টে এটি দেখা যায়:
---
- name: Install packages with with_items
hosts: localhost
tasks:
- name: Install multiple packages
apt:
name: "{{ item }}"
state: present
with_items:
- apache2
- mysql-server
- php
লুপ কন্ট্রোল (Loop Control)
কখনও কখনও আপনি লুপের চলার প্রক্রিয়া নিয়ন্ত্রণ করতে চান, যেমন লুপের ইনডেক্স ব্যবহার করা বা প্রতিটি লুপের মধ্যে একটি নির্দিষ্ট সময় বিরতি দেওয়া। এর জন্য loop_control ব্যবহার করা যায়।
---
- name: Loop control example
hosts: localhost
tasks:
- name: Install packages with index
apt:
name: "{{ item }}"
state: present
loop:
- apache2
- mysql-server
- php
loop_control:
index_var: loop_index
- name: Display loop index
debug:
msg: "This is the {{ loop_index }} iteration."
সংক্ষেপে পার্থক্য:
| বৈশিষ্ট্য | শর্ত ভিত্তিক (Conditional) | লুপ (Loop) |
|---|---|---|
| কিভাবে কাজ করে | নির্দিষ্ট শর্তের উপর ভিত্তি করে টাস্ক চালায় | একটি লিস্টের প্রতিটি আইটেমের উপর টাস্ক পুনরাবৃত্তি করে চালায় |
| কিওয়ার্ড | when | loop, with_items |
| ব্যবহার | সিস্টেম স্টেট বা ভ্যারিয়েবলের মান চেক করা | একাধিক আইটেমের উপর একই ধরনের টাস্ক চালানো |
এই ফিচারগুলো Ansible প্লেবুককে আরও ডায়নামিক, ফ্লেক্সিবল এবং এফিশিয়েন্ট করে তোলে।
Ansible এ when কন্ডিশন ব্যবহার করে আপনি নির্দিষ্ট শর্ত (condition) মেনে টাস্ক নিয়ন্ত্রণ করতে পারেন। অর্থাৎ, আপনি টাস্ক বা টাস্কগুলিকে এমনভাবে কন্ডিশনাল করতে পারেন যেন তা শুধুমাত্র নির্দিষ্ট শর্ত পূরণ হলেই কার্যকর হয়। এটি Ansible প্লেবুককে ডাইনামিক এবং নমনীয় করতে সাহায্য করে।
when কন্ডিশন কীভাবে কাজ করে?
when কন্ডিশন সাধারণত একটি লজিক্যাল এক্সপ্রেশন গ্রহণ করে, যা সত্য (true) বা মিথ্যা (false) হতে পারে। যদি কন্ডিশন সত্য হয়, তাহলে টাস্কটি কার্যকর হয়; অন্যথায়, তা স্কিপ করা হয়।
when কন্ডিশন ব্যবহার করার সাধারণ ফরম্যাট
tasks:
- name: Task Name
module_name:
parameter: value
when: condition
উদাহরণ ১: অপারেটিং সিস্টেম ভিত্তিক টাস্ক
নিচের উদাহরণে আমরা দেখবো কিভাবে when কন্ডিশন ব্যবহার করে একটি টাস্ককে নির্দিষ্ট অপারেটিং সিস্টেমে কার্যকর করা যায়।
---
- name: Install Apache only on Ubuntu systems
hosts: all
become: yes
tasks:
- name: Install Apache on Ubuntu
apt:
name: apache2
state: present
when: ansible_distribution == "Ubuntu"
এখানে, when কন্ডিশন চেক করছে হোস্টের অপারেটিং সিস্টেম Ubuntu কিনা (ansible_distribution == "Ubuntu")। যদি হোস্টের অপারেটিং সিস্টেম Ubuntu হয়, তখন Apache ইনস্টল করা হবে।
উদাহরণ ২: ভ্যারিয়েবল ভিত্তিক কন্ডিশন
অনেক সময় প্লেবুকে ডিফাইন করা ভ্যারিয়েবল বা হোস্ট ভ্যারিয়েবলের উপর ভিত্তি করে টাস্ক নিয়ন্ত্রণ করতে হয়।
---
- name: Install Nginx based on variable
hosts: all
become: yes
vars:
install_nginx: true
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
when: install_nginx
এখানে, install_nginx নামে একটি ভ্যারিয়েবল তৈরি করা হয়েছে। যদি এর মান true হয়, তাহলে Nginx ইনস্টল করা হবে।
উদাহরণ ৩: মডিউল আউটপুট ভিত্তিক কন্ডিশন
কিছু কিছু ক্ষেত্রে, একটি টাস্কের আউটপুট বা রেজাল্টের উপর ভিত্তি করে পরবর্তী টাস্ক কার্যকর করা হয়।
---
- name: Check if a file exists and create if it doesn't
hosts: all
become: yes
tasks:
- name: Check if /tmp/testfile exists
stat:
path: /tmp/testfile
register: file_status
- name: Create the file if it doesn't exist
file:
path: /tmp/testfile
state: touch
when: not file_status.stat.exists
এখানে, প্রথম টাস্কটি /tmp/testfile ফাইলের স্ট্যাটাস চেক করে এবং আউটপুট file_status নামে রেজিস্টারে সংরক্ষণ করে। পরবর্তী টাস্কটি when কন্ডিশন ব্যবহার করে চেক করে যদি ফাইলটি না থাকে (not file_status.stat.exists), তখন এটি ফাইল তৈরি করবে।
when কন্ডিশন: অপারেটর এবং লজিক্যাল এক্সপ্রেশন
when কন্ডিশনে আপনি বিভিন্ন অপারেটর এবং লজিক্যাল এক্সপ্রেশন ব্যবহার করতে পারেন:
- সমান (==): দুটি মান সমান কিনা চেক করে।
- অসমান (!=): দুটি মান অসমান কিনা চেক করে।
- বৃহত্তর (>), ছোট (<): তুলনামূলক অপারেটর।
- and, or, not: লজিক্যাল অপারেটর যা একাধিক শর্ত একত্রে চেক করতে সাহায্য করে।
উদাহরণ:
- name: Install package if OS is Ubuntu and version is 20.04
apt:
name: apache2
state: present
when: ansible_distribution == "Ubuntu" and ansible_distribution_version == "20.04"
এখানে, Apache ইনস্টল করা হবে শুধুমাত্র যদি অপারেটিং সিস্টেম Ubuntu হয় এবং এর ভার্সন 20.04 হয়।
সংক্ষেপে
Ansible এ when কন্ডিশন ব্যবহার করে টাস্ক বা টাস্কগুলোকে নির্দিষ্ট শর্ত অনুযায়ী কার্যকর করা যায়। এটি প্লেবুককে ডাইনামিক এবং নমনীয় করে তোলে, যাতে বিভিন্ন হোস্ট বা ভ্যারিয়েবলের ভিত্তিতে স্বয়ংক্রিয়ভাবে কাজ সম্পন্ন করা যায়।
Ansible-এ লুপ ব্যবহার করা হয় একাধিক আইটেম বা উপাদানের উপর একই কাজ বারবার চালানোর জন্য। লুপ ব্যবহার করে আপনি একটি টাস্ককে পুনরাবৃত্তি করতে পারেন, যা প্লেবুককে আরও কার্যকর এবং সংক্ষিপ্ত করে তোলে। Ansible-এ লুপের জন্য প্রধানত দুটি পদ্ধতি ব্যবহৃত হয়: loop এবং with_items। Ansible 2.5 থেকে loop পদ্ধতিটি প্রচলিত এবং এটি নতুনতম ও আরও কার্যকর উপায়, যেখানে with_items পুরোনো এবং সামঞ্জস্য বজায় রাখার জন্য রাখা হয়েছে।
১. loop ব্যবহার
loop হলো Ansible-এ লুপ চালানোর আধুনিক পদ্ধতি। এটি সাধারণত এক বা একাধিক আইটেমের উপর টাস্ক পুনরাবৃত্তি করার জন্য ব্যবহার করা হয়। এটি সহজ, সরল এবং পড়তে সুবিধাজনক।
উদাহরণ
নিচে একটি সাধারণ উদাহরণ দেয়া হলো যেখানে একটি সার্ভার-এ একাধিক প্যাকেজ ইনস্টল করা হচ্ছে:
---
- name: Install multiple packages
hosts: all
become: yes
tasks:
- name: Install packages
yum:
name: "{{ item }}"
state: present
loop:
- httpd
- mariadb-server
- php
বিশ্লেষণ:
- এখানে
loopব্যবহার করে একাধিক প্যাকেজ (httpd,mariadb-server,php) ইনস্টল করা হচ্ছে। {{ item }}হলো লুপের প্রতিটি আইটেমের মান, যা প্রতিবার লুপ চলার সময় পরিবর্তিত হয়।
loop এর আরও উদাহরণ
একটি ফাইলের মালিকানা পরিবর্তন করতে নিচের মত লুপ ব্যবহার করা যেতে পারে:
---
- name: Change ownership of files
hosts: all
become: yes
tasks:
- name: Set ownership of files
file:
path: "{{ item.path }}"
owner: "{{ item.owner }}"
group: "{{ item.group }}"
mode: "{{ item.mode }}"
loop:
- { path: /var/www/html/index.html, owner: apache, group: apache, mode: '0644' }
- { path: /var/www/html/app.php, owner: apache, group: apache, mode: '0644' }
বিশ্লেষণ:
- এখানে লুপের মাধ্যমে একাধিক ফাইলের মালিকানা এবং অনুমতি সেট করা হচ্ছে।
- প্রতিটি আইটেম একটি ডিকশনারি হিসাবে উল্লেখ করা হয়েছে, যা ভিন্ন ভিন্ন মান ধরে রাখছে।
২. with_items ব্যবহার
with_items হলো লুপ চালানোর পুরোনো পদ্ধতি। এটি loop এর মত কাজ করে, তবে নতুন সংস্করণগুলোতে loop ব্যবহারে উৎসাহিত করা হয়। যদিও এটি এখনও কার্যকর, এটি মূলত পুরোনো প্লেবুকগুলোর সাথে সামঞ্জস্য বজায় রাখার জন্য রাখা হয়েছে।
উদাহরণ
নিচে একটি উদাহরণ দেয়া হলো যেখানে with_items ব্যবহার করে একাধিক প্যাকেজ ইনস্টল করা হচ্ছে:
---
- name: Install multiple packages
hosts: all
become: yes
tasks:
- name: Install packages
yum:
name: "{{ item }}"
state: present
with_items:
- httpd
- mariadb-server
- php
loop এবং with_items এর তুলনা
| বৈশিষ্ট্য | loop | with_items |
|---|---|---|
| আধুনিকতা | নতুন এবং প্রচলিত | পুরোনো এবং সামঞ্জস্য বজায় রাখার জন্য |
| সিনট্যাক্স | সহজ এবং সরল | কিছুটা বেশি লিখতে হয় |
| কার্যকারিতা | অধিক কার্যকর | সাধারণ কার্যকর, তবে পুরোনো পদ্ধতি |
লুপের ব্যবহার ক্ষেত্র
- একাধিক প্যাকেজ ইনস্টল: যেমন একটি টাস্কে একাধিক প্যাকেজ ইনস্টল করা।
- ফাইল মালিকানা ও অনুমতি পরিবর্তন: যেমন একাধিক ফাইলের মালিকানা বা অনুমতি পরিবর্তন করা।
- সার্ভিস ম্যানেজমেন্ট: যেমন একাধিক সার্ভিস চালু বা বন্ধ করা।
সারাংশ
loop: নতুন এবং আধুনিক পদ্ধতি, যা সাধারণত ব্যবহার করা উচিত।with_items: পুরোনো পদ্ধতি, যা পুরোনো প্লেবুকগুলোর সামঞ্জস্য রক্ষার জন্য রাখা হয়েছে।
Ansible প্লেবুক লেখার সময় loop ব্যবহার করা হলে কোড আরও সংক্ষিপ্ত এবং কার্যকর হয়। with_items ব্যবহার করা যায়, তবে নতুন কোড লেখার সময় loop ব্যবহারে উৎসাহিত করা হয়।
Ansible এ block এবং rescue ব্যবহার করে ত্রুটি নিয়ন্ত্রণ (Error Handling) খুব সহজ এবং কার্যকরী হয়। block এবং rescue কিওয়ার্ডগুলোর মাধ্যমে আপনি প্লেবুকে এমনভাবে টাস্ক লিখতে পারেন, যাতে কোনো টাস্ক ব্যর্থ হলেও আপনি সেগুলোর উপর নিয়ন্ত্রণ রাখতে পারেন এবং ব্যর্থতার পরবর্তী অ্যাকশন নির্ধারণ করতে পারেন। এটি প্রায় প্রোগ্রামিং ভাষার try-catch মেকানিজমের মতো।
Block, Rescue, এবং Always এর কাজ
Ansible এ block একটি ব্লক তৈরি করে যার মধ্যে একাধিক টাস্ক গ্রুপ করা যায়। এর সাথে rescue এবং always ব্যবহার করে ত্রুটি বা ব্যতিক্রম নিয়ন্ত্রণ করা যায়।
- block: একটি টাস্ক বা টাস্কের গ্রুপ যা একত্রে রান করবে। যদি এই ব্লকের কোনো টাস্ক ব্যর্থ হয়, তখন
rescueচালানো হবে। - rescue: যখন
blockএর কোনো টাস্ক ব্যর্থ হয়, তখনrescueব্লকটি চালানো হয়। এটি সাধারণত ব্যাকআপ প্ল্যান বা এরর হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়। - always:
alwaysব্লক সবসময় চালানো হয়, এটিblockবাrescueসফল বা ব্যর্থ যাই হোক না কেন। এটি পরিষ্কার করার কাজ বা ফাইনাল টাস্কের জন্য ব্যবহার করা হয়।
উদাহরণ: Block এবং Rescue ব্যবহার করা
---
- name: Example of block and rescue
hosts: localhost
tasks:
- name: Main block
block:
- name: Try to create a file
file:
path: /tmp/example.txt
state: touch
- name: Simulate a failure
command: /bin/false
rescue:
- name: Handle the failure by creating a different file
file:
path: /tmp/rescue_file.txt
state: touch
always:
- name: Always clean up
file:
path: /tmp/temp_cleanup.txt
state: touch
ব্যাখ্যা:
Main block:
blockএর মধ্যে দুটি টাস্ক আছে। প্রথম টাস্কটি/tmp/example.txtফাইল তৈরি করছে।- দ্বিতীয় টাস্কটি
/bin/falseকমান্ড চালাচ্ছে, যা ইচ্ছাকৃতভাবে ব্যর্থ হবে।
Rescue block:
- যখন
blockএর কোনো টাস্ক ব্যর্থ হবে, তখনrescueব্লকটি চালু হবে। এখানেrescueব্লকে/tmp/rescue_file.txtনামে একটি ফাইল তৈরি করা হয়েছে।
Always block:
alwaysব্লক সবসময় চালানো হবে, চূড়ান্ত কাজ বা ক্লিনআপ কাজ করার জন্য। এখানে/tmp/temp_cleanup.txtফাইলটি তৈরি করা হয়েছে।
ব্লক, রেসকিউ, এবং অলওয়েজের ব্যবহার কৌশল:
- Block: যখন আপনি একসাথে একাধিক টাস্ক চালাতে চান যা পরস্পরের উপর নির্ভরশীল, তখন ব্লক ব্যবহার করা হয়।
- Rescue: কোনো টাস্ক ব্যর্থ হলে আপনি তৎক্ষণাৎ বিকল্প ব্যবস্থা নিতে চান, তখন রেসকিউ ব্লক ব্যবহার করেন।
- Always: প্লেবুক বা টাস্কের শেষে ক্লিনআপ বা চূড়ান্ত পদক্ষেপ নিতে Always ব্লক ব্যবহার করা হয়। এটি একটি ব্লকের শেষ পদক্ষেপ হিসেবে ব্যবহৃত হয়।
একটি বাস্তব উদাহরণ: প্যাকেজ ইনস্টলেশন
---
- name: Install a package with error handling
hosts: localhost
tasks:
- name: Install nginx package
block:
- name: Try to install nginx
apt:
name: nginx
state: present
register: install_result
ignore_errors: yes
- name: Verify if nginx was installed
command: nginx -v
register: verify_result
rescue:
- name: Log installation failure
debug:
msg: "Nginx installation failed. Attempting to fix or clean up."
- name: Remove partially installed nginx
apt:
name: nginx
state: absent
always:
- name: Clean up temporary files if any
file:
path: /tmp/nginx_install.log
state: absent
ব্যাখ্যা:
- Block: এই ব্লকে
nginxপ্যাকেজ ইনস্টল করা হয়েছে এবং ইনস্টলেশন যাচাই করা হয়েছে।ignore_errors: yesদিয়ে ইনস্টলেশনের ত্রুটি উপেক্ষা করা হয়েছে যাতে ব্লকের পরবর্তী টাস্ক চালানো যায়। - Rescue: যদি ইনস্টলেশন ব্যর্থ হয়, তাহলে
rescueব্লক চালানো হবে যেখানে ইনস্টলেশনের ব্যর্থতার কারণে কিছু পরিষ্কার বা ফিক্স করার ব্যবস্থা করা হয়েছে। - Always: শেষে,
/tmp/nginx_install.logফাইল (যদি কোনো লোগ সংরক্ষণ করা হয়) ক্লিনআপ করা হয়েছে।
সংক্ষেপে:
| বৈশিষ্ট্য | বর্ণনা |
|---|---|
| Block | টাস্কগুলিকে গ্রুপ করে একসাথে চালায়। |
| Rescue | Block ব্যর্থ হলে বিকল্প টাস্ক চালায়। |
| Always | Block এবং Rescue সফল বা ব্যর্থ যাই হোক, সবসময় চালায়। |
Ansible এ block, rescue, এবং always ব্যবহার করে প্লেবুকগুলোকে আরও ফ্লেক্সিবল এবং রেসিলিয়েন্ট করা যায়, যাতে টাস্ক ব্যর্থ হলেও উপযুক্তভাবে হ্যান্ডেল করা সম্ভব হয়।
Read more