Infrastructure as Code পরিচিতি — ডিক্লারেটিভ বনাম ইম্পারেটিভ
এই পাঠে যা শিখবেন
- Infrastructure as Code কী এবং ম্যানুয়াল কনসোল-ক্লিকিং কেন স্কেল করে না
- ইম্পারেটিভ ও ডিক্লারেটিভ IaC অ্যাপ্রোচের পার্থক্য
- কেন ডিক্লারেটিভ অ্যাপ্রোচ সাধারণত প্রেফার করা হয় — ইডেম্পোটেন্সির সাথে সংযোগ
- Python দিয়ে দুটো অ্যাপ্রোচের একটি ছোট্ট তুলনামূলক সিমুলেশন
১ · Infrastructure as Code কী
ঐতিহ্যবাহীভাবে একটি সার্ভার প্রভিশন করতে একজন ইঞ্জিনিয়ারকে ক্লাউড কনসোলে লগইন করে, বাটনে ক্লিক করে করে ম্যানুয়ালি ভিএম তৈরি করতে হতো — একই কাজ যদি আবার করতে হয় (যেমন একটি নতুন এনভায়রনমেন্টে), পুরো প্রক্রিয়া আবার হাতে করতে হয়, যা ধীর, ভুল-প্রবণ এবং কোনো রেকর্ড রাখে না ঠিক কী কনফিগার করা হয়েছিল। Infrastructure as Code (IaC)Infrastructure as Codeইনফ্রাস্ট্রাকচার (সার্ভার, নেটওয়ার্ক, স্টোরেজ) মেশিন-রিডেবল কনফিগারেশন ফাইলে সংজ্ঞায়িত ও ম্যানেজ করার প্র্যাকটিস, ম্যানুয়াল কনসোল-ক্লিকিং-এর বদলে। এই সমস্যার সমাধান দেয় — ইনফ্রাস্ট্রাকচার একটি টেক্সট ফাইলে সংজ্ঞায়িত থাকে, ঠিক অ্যাপ্লিকেশন কোডের মতোই।
প্রতিটি পরিবর্তন Git-এ ট্র্যাক হয় — কে, কখন, কী পরিবর্তন করেছে তার সম্পূর্ণ ইতিহাস।
ইনফ্রাস্ট্রাকচার পরিবর্তনও পুল রিকোয়েস্টের মাধ্যমে টিমমেট রিভিউ করতে পারে, ঠিক অ্যাপ কোডের মতো (M8-এ বিস্তারিত)।
একই কনফিগ ফাইল দিয়ে dev/staging/production — তিনটি এনভায়রনমেন্টে অভিন্ন ইনফ্রাস্ট্রাকচার তৈরি করা যায়।
ডেটা সেন্টার বা রিজিওন হারিয়ে গেলেও, একই কোড থেকে সম্পূর্ণ ইনফ্রাস্ট্রাকচার পুনর্নির্মাণ করা যায়।
২ · ইম্পারেটিভ বনাম ডিক্লারেটিভ অ্যাপ্রোচ
IaC টুলগুলো মূলত দুটো দর্শনের একটি অনুসরণ করে — কীভাবে আপনি ইনফ্রাস্ট্রাকচার বর্ণনা করেন তার ভিত্তিতে।
- ইম্পারেটিভImperativeএকটি নির্দিষ্ট চূড়ান্ত অবস্থায় পৌঁছাতে কোন কোন ধাপ ক্রমানুসারে সম্পাদন করতে হবে তা বলে দেওয়া — যেমন ক্লাউড CLI কমান্ড একটার পর একটা চালানো একটি শেল স্ক্রিপ্ট। অ্যাপ্রোচ — আপনি ধাপে ধাপে কী করতে হবে বলে দেন ("প্রথমে সার্ভার তৈরি করো, তারপর সিকিউরিটি গ্রুপ যোগ করো")। সমস্যা হলো — স্ক্রিপ্টটি নিজে জানে না already কী exists, তাই দ্বিতীয়বার চালালে প্রায়ই ডুপ্লিকেট রিসোর্স তৈরি হয় বা এরর দেয়।
- ডিক্লারেটিভDeclarativeশুধু কাঙ্ক্ষিত চূড়ান্ত অবস্থা (desired end state) বর্ণনা করা — টুল নিজেই বর্তমান অবস্থার সাথে তুলনা করে কী পরিবর্তন দরকার তা বের করে। অ্যাপ্রোচ (যেমন Terraform) — আপনি শুধু কী থাকা উচিত বর্ণনা করেন। টুল নিজে বর্তমান অবস্থা যাচাই করে এবং শুধু প্রয়োজনীয় পরিবর্তনগুলো প্রয়োগ করে — already সঠিক থাকা কিছু আবার তৈরি করে না।
ইনফ্রাস্ট্রাকচার ম্যানেজমেন্টের জন্য ডিক্লারেটিভ অ্যাপ্রোচ সাধারণত প্রেফার করা হয় কারণ এটি স্বাভাবিকভাবেই ইডেম্পোটেন্ট — একই কনফিগারেশন একবার প্রয়োগ করুন বা দশবার, ফলাফল একই থাকে (already কাঙ্ক্ষিত অবস্থায় থাকলে কিছুই পরিবর্তন হয় না)। L20-এ আমরা এই ইডেম্পোটেন্সি ও এর বিপরীত সমস্যা — কনফিগারেশন ড্রিফট — নিয়ে বিস্তারিত আলোচনা করব।
৩ · Python-এ দুটো অ্যাপ্রোচ সিমুলেট করা
নিচের সিমুলেশনে imperative_create_server() প্রতিবার ডাকা হলে unconditionally একটি নতুন সার্ভার
"তৈরি" করে (একটি লিস্টে যোগ করে) — দুইবার ডাকলে ডুপ্লিকেট তৈরি হয়। বিপরীতে
declarative_ensure_server(desired_state) প্রথমে বর্তমান অবস্থা যাচাই করে, এবং শুধু তখনই একটি
সার্ভার তৈরি করে যদি সেই স্পেকের একটি সার্ভার already exist না করে।
# toy সিমুলেশন — কোনো real cloud API কল হচ্ছে না, শুধু in-memory লিস্ট
servers = [] # সিমুলেটেড "লাইভ" ইনফ্রাস্ট্রাকচার
def imperative_create_server(name, size):
"""ইম্পারেটিভ: unconditionally একটি নতুন সার্ভার এন্ট্রি যোগ করে — already exist করলেও।"""
servers.append({"name": name, "size": size})
print(f"[imperative] সার্ভার তৈরি করা হলো: {name} ({size})")
def declarative_ensure_server(desired_state):
"""ডিক্লারেটিভ: প্রথমে বর্তমান অবস্থা যাচাই করে, শুধু প্রয়োজনে তৈরি করে।"""
for s in servers:
if s["name"] == desired_state["name"] and s["size"] == desired_state["size"]:
print(f"[declarative] '{desired_state['name']}' already কাঙ্ক্ষিত অবস্থায় আছে — কোনো পরিবর্তন নেই।")
return
servers.append(dict(desired_state))
print(f"[declarative] সার্ভার তৈরি করা হলো: {desired_state['name']} ({desired_state['size']})")
print("--- ইম্পারেটিভ: দুইবার একই কল ---")
servers.clear()
imperative_create_server("web-01", "medium")
imperative_create_server("web-01", "medium")
print(f"মোট সার্ভার সংখ্যা: {len(servers)} (প্রত্যাশিত ছিল ১টি, কিন্তু ডুপ্লিকেট তৈরি হয়েছে)")
print("\n--- ডিক্লারেটিভ: দুইবার একই ensure কল ---")
servers.clear()
desired = {"name": "web-01", "size": "medium"}
declarative_ensure_server(desired)
declarative_ensure_server(desired)
print(f"মোট সার্ভার সংখ্যা: {len(servers)} (কাঙ্ক্ষিত ১টি — ডুপ্লিকেট হয়নি)")
৪ · আসল Terraform-এ এই ধারণাগুলো কীভাবে প্রয়োগ হয়
বাস্তব জীবনে Terraform-এর মতো টুল এই ঠিক এই ডিক্লারেটিভ মডেল অনুসরণ করে — আপনি .tf ফাইলে কাঙ্ক্ষিত
অবস্থা লেখেন, টুল একটি state file-এ বর্তমান অবস্থা ট্র্যাক করে, এবং plan/
apply ধাপে দুটোর মধ্যে diff বের করে। এই কোর্সে আমরা কখনো real Terraform CLI চালাব না — বরং L18-L21
জুড়ে এই concept গুলো toy Python simulation দিয়ে শিখব, যাতে আপনি কোনো cloud account ছাড়াই মূল আইডিয়াগুলো
বুঝতে পারেন।
Infrastructure as Code ম্যানুয়াল কনসোল-ক্লিকিংকে প্রতিস্থাপন করে ইনফ্রাস্ট্রাকচারকে ভার্সন-কন্ট্রোলড, রিভিউযোগ্য কোডে পরিণত করে। ইম্পারেটিভ অ্যাপ্রোচ ধাপ বর্ণনা করে, ডিক্লারেটিভ অ্যাপ্রোচ চূড়ান্ত অবস্থা বর্ণনা করে — এবং ডিক্লারেটিভ অ্যাপ্রোচের স্বাভাবিক ইডেম্পোটেন্সিই কেন এটি আধুনিক IaC টুলগুলোর (Terraform-সহ) প্রধান দর্শন হয়ে উঠেছে তার মূল কারণ। পরের পাঠে আমরা Terraform-এর মূল বিল্ডিং ব্লক — provider, resource ও state — শিখব।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ একটি টিম যদি ম্যানুয়াল কনসোল-ক্লিকিং দিয়ে ইনফ্রাস্ট্রাকচার ম্যানেজ করে, ৬ মাস পর কী সমস্যা দেখা দিতে পারে?
কেউ ঠিক মনে রাখতে পারবে না কেন একটি নির্দিষ্ট সিকিউরিটি গ্রুপ রুল যোগ করা হয়েছিল, কোন সার্ভার কোন উদ্দেশ্যে তৈরি — কারণ কোনো লিখিত রেকর্ড নেই, সবকিছু কারো স্মৃতিতে বা কনসোলে ছড়িয়ে আছে। নতুন টিম মেম্বার অনবোর্ড করা কঠিন হয়ে যায়, ডিজাস্টার রিকভারি প্রায় অসম্ভব (কীভাবে পুনর্নির্মাণ করবেন যদি ঠিক কী ছিল তা না জানেন), এবং দুটো "একই রকম" এনভায়রনমেন্ট (dev vs prod) আসলে সময়ের সাথে ভিন্ন হয়ে যায়।
প্র ০২ একটি ইম্পারেটিভ স্ক্রিপ্টকে "already exists" চেক যোগ করে ডিক্লারেটিভের মতো আচরণ করানো কি সম্ভব? তাহলে ডিক্লারেটিভ টুল আলাদা কেন?
টেকনিক্যালি সম্ভব — কিন্তু প্রতিটি রিসোর্সের জন্য নিজে সেই চেক-লজিক লিখতে ও মেইনটেইন করতে হবে, যা জটিল ও ভুল-প্রবণ। ডিক্লারেটিভ টুল এই diffing লজিক একবার, সাধারণভাবে, সব ধরনের রিসোর্সের জন্য বিল্ট-ইন করে দেয় — আপনি শুধু কাঙ্ক্ষিত অবস্থা বর্ণনা করেন, বাকি জটিলতা টুল নিজে সামলায়। এটিই মূল মূল্য — repetitive, error-prone diffing-লজিক প্রতিটি টিমকে নিজে নিজে না লিখতে হওয়া।
প্র ০৩ ডিজাস্টার রিকভারির সাথে IaC-এর সম্পর্ক কী — কেন এটি L12-এর ব্যাকআপ/স্ন্যাপশট থেকে ভিন্ন একটি সুরক্ষা স্তর যোগ করে?
L12-এর ব্যাকআপ/স্ন্যাপশট ডেটা পুনরুদ্ধার করে (কোনো ভলিউম বা ডেটাবেসের কন্টেন্ট), কিন্তু IaC পুনরুদ্ধার করে ইনফ্রাস্ট্রাকচারের গঠন নিজেই — কোন সার্ভার, কোন নেটওয়ার্ক কনফিগ, কোন সিকিউরিটি গ্রুপ। একটি সম্পূর্ণ রিজিওন হারিয়ে গেলে, শুধু ডেটা ব্যাকআপ থাকলেই যথেষ্ট নয় — আপনাকে পুরো ইনফ্রাস্ট্রাকচার আবার তৈরি করতে হবে। IaC কোড থাকলে এই পুনর্নির্মাণ মিনিটের মধ্যে, নির্ভুলভাবে সম্ভব — দুটো একসাথে একটি সম্পূর্ণ DR স্ট্র্যাটেজি তৈরি করে।
অনুশীলন
-
চিন্তা করুন: আপনার পরিচিত কোনো প্রক্রিয়া (কোডিং-সম্পর্কিত হোক বা না হোক) খুঁজুন যা বর্তমানে ইম্পারেটিভভাবে (ধাপে ধাপে ম্যানুয়াল নির্দেশনা) করা হয় — সেটিকে ডিক্লারেটিভভাবে ("চূড়ান্ত অবস্থা বর্ণনা করুন, বাকিটা সিস্টেম বের করুক") রূপান্তর করলে কেমন হতো?
উদাহরণ: একটি রুম পরিষ্কার করার নির্দেশনা ইম্পারেটিভভাবে হতে পারে "প্রথমে বিছানা ঠিক করো, তারপর মেঝে ঝাড়ু দাও, তারপর জানালা মুছো" — কিন্তু ডিক্লারেটিভভাবে বলা যায় "রুমটি পরিষ্কার ও গোছানো থাকা উচিত" এবং যে কেউ (বা কোনো রোবট) নিজে বের করে নেয় কী কী করতে হবে বর্তমান অবস্থা দেখে — যদি বিছানা already ঠিক থাকে, সেটি আবার করার দরকার নেই।
-
পরীক্ষা করুন: উপরের কোড সেলে
declarative_ensure_server-কে একটি ভিন্নsizeসহ (যেমন"large") তৃতীয়বার কল করুন — কী ঘটে এবং কেন?যেহেতু
nameএকই থাকলেওsizeভিন্ন, ফাংশনের ভেতরের লুপ কোনো ম্যাচ খুঁজে পাবে না (কারণ চেকটি name এবং size দুটোই মিলতে হবে বলে করা), তাই এটি একটি নতুন এন্ট্রি যোগ করবে — একটি দ্বিতীয় "web-01" এন্ট্রি ভিন্ন size সহ তৈরি হবে। এটি দেখায় বাস্তব IaC টুলে diffing লজিক আরও সূক্ষ্ম হতে হয় — শুধু নাম নয়, প্রতিটি অ্যাট্রিবিউট আলাদাভাবে তুলনা করে বুঝতে হয় এটি নতুন রিসোর্স নাকি বিদ্যমান রিসোর্সের একটি আপডেট (L18-এ এই diffing লজিক আরও বিস্তারিতভাবে দেখব)।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পরের পাঠ — Terraform বেসিকস: প্রোভাইডার, রিসোর্স, স্টেট L18 এই পাঠের ডিক্লারেটিভ ধারণা কীভাবে Terraform-এর plan/apply ওয়ার্কফ্লোতে রূপ নেয় দেখুন।
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ Terraform মডিউল, ইডেম্পোটেন্সি, ড্রিফট ডিটেকশন ও IaC বেস্ট প্র্যাকটিস — মডিউল ৫-এর বাকি পাঠগুলো।
- System Design & Software Architecture কোর্স সঙ্গী কোর্স যে সিস্টেম আপনি IaC দিয়ে প্রভিশন করবেন তার আর্কিটেকচার ডিজাইন শিখতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity ও Cloud Computing & DevOps — সব এক জায়গায়।