ওয়াইএএমএল (YAML)¶
যে কোন সিস্টেমের কনফিগারেশন ফাইল ঠিকমত লিখতে গেলে YAML আমার লিস্টে প্রথম দিকেই থাকে। এই ফরমেটটা এতটাই হিউম্যান রিডেবল, যে সবাই এটাকে পছন্দ করে। যেকোনো মার্কআপ ল্যাঙ্গুয়েজ হিসেবে মার্ক ডাউন, ‘ইয়েট এনাদার মার্কআপ ল্যাঙ্গুয়েজ’ হিসেবে আসলেও এর রেজাল্ট খুবই ভালো। এই ফরম্যাট দিয়ে একদম জিরো থেকে একটা ফাংশনাল অটোমেশন ওয়ার্ক ফ্লু তৈরি করা যায় যার মাধ্যমে আপনি ডিফাইন করতে পারবেন কি ধরনের ডাটা আপনি ডিভাইসে পুশ করতে চাইছেন। দিন শেষে এই ধরনের ফরম্যাট আমাদেরকে সাহায্য করে কত সহজে বিভিন্ন কনফিগারেশন ডাটা ডিভাইসে দরকার মতো পুশ করতে। এটাকে অনেক সময় সিরিয়ালাইজেশন ল্যাঙ্গুয়েজ বলা হয় যাতে একটা ফাইল বা ডাটা স্ট্রিমে কিভাবে একটার পর একটা কনফিগারেশন পুশ করতে হয় সেটা দেখব সামনেই।
আমি কয়েকটা ছোট উদাহরণ নিয়ে আসি যাতে আপনাদের বুঝতে সুবিধা হয়। ওয়াইএএমএল ফাইলের শুরুতে তিনটা হাইফেন দিয়ে বোঝানো হয় যে ডকুমেন্ট শুরু হচ্ছে। তিনটা ডট দিয়ে একটা ডকুমেন্ট শেষ করার ইন্ডিকেশন দেওয়া হয় যদিও এখানে সেটা আমরা দেখাইনি কারণ এটা একটাই ডকুমেন্ট। ওয়াইএমএল ফাইল এর মধ্যে একটা বড় সুবিধা হচ্ছে এখানে কোটেশন বা ডাবল কোটেশন ব্যবহার নেই বললেই চলে। স্ট্রিং হিসেবে ডিক্লেয়ার করার জন্য কোন কোটেশন দরকার হয় না। পাই-ওয়াইএমএল পার্সার সুন্দরভাবে এগুলোকে পার্স করতে পারে। আমাদের এখানে একটা লিস্ট নিয়ে এসেছি, কয়েকটা আইটেম তবে কিছুটা ভিন্ন ধরনের। আইটেম শুরু করতে হয় হাইফেন দিয়ে, যাতে লিস্ট হিসেবে বোঝা যায়। নেম, ডেসক্রিপশন হচ্ছে স্ট্রিং টাইপ। সংখ্যাগুলো আসলে ইনটেজার টাইপ। এনাবলড একটা বুলিয়ান, যেটা ট্রু ফলস হতে পারে।
---
# yaml_example.yaml ফাইল
interface:
name: GigabitEthernet2
description: Wide Area Network
enabled: true
ipv4:
address:
- ip: 172.16.0.2
netmask: 255.255.255.0
পাইথনের কি ভ্যালু পেয়ারের মত করে ডিকশনারি¶
এখানে আমাদের ‘কি’ গুলোকে স্ট্রিং হিসেবে দেখানো আছে কোলনের বা পাশে। ডান পাশে তার করেসপন্ডিং ভ্যালু দেখানো আছে। আমরা যদি পাইথনে এই ভ্যালুগুলোকে লুকআপ করতে যেতাম তাহলে এটার সাথে করেসপন্ডিং কি কে রেফারেন্স করতাম। এই একই yaml dictionary যেটা লিস্ট এর মত দেখা যায় সেটাকে বেশ কয়েক ভাবে লেখা যেতে পারে। ডাটা রিপেজেনসন স্ট্যান্ড পয়েন্ট থেকে আগের উদাহরণ আমরা বেশ কয়েকভাবে লিখতে পারি। ইন্টারনেটে উদাহরণে সেটা দেখবেন।
সব পার্সার সবগুলোকে উদাহরণকেই ঠিক মতো রিড করবে, তবে উপরেরটা বেশি হিউম্যান রিডেবল। আমাদেরকে হিউম্যান রিডেবল অংশটাকে প্রায়োরিটি দিতে হয় কারণ নিজের কোড অন্যদেরকেও তো বুঝতে হবে। অন্য প্রোগ্রামিং ল্যাঙ্গুয়েজ এর মত এখানে হ্যাশ ব্যবহার করা হয় যদি কিছু কমেন্ট আকারে দিতে চাই। আমি যেহেতু বই লেখার সময় প্রচুর মার্ক ডাউন ব্যবহার করি সে কারণে ওয়াইমেল এটা একটা ফ্রেন্ডলি ওয়ে হতে পারে যাতে মানুষ বিভিন্ন অটোমেশন সিস্টেম ঠিকমতো বুঝতে পারে।
YAML: কনফিগারেশন ডাটা লেখার সহজ পদ্ধতি¶
নেটওয়ার্ক ইঞ্জিনিয়ার হিসেবে আমাদের প্রায়ই বিভিন্ন কনফিগারেশন লিখতে হয়। এই কনফিগারেশন লেখার জন্য YAML একটি চমৎকার টুল। এটা এত সহজে পড়া যায় যে মনে হয় আমরা সাধারণ টেক্সট লিখছি।
YAML এর বৈশিষ্ট্য¶
- সহজ পাঠ্য: কোন প্রোগ্রামিং না জেনেও YAML পড়া ও লেখা যায়
- স্ট্রাকচারড ডাটা: ডাটাকে সুন্দর করে সাজিয়ে রাখা যায়
- নেস্টেড ডাটা: একটা ডাটার ভিতরে আরেকটা ডাটা রাখা যায়
- স্পেশাল ক্যারেক্টার: যদি স্ট্রিং-এ স্পেস বা বিশেষ চিহ্ন থাকে, তখন কোটেশন (
'
বা"
) ব্যবহার করতে হয়
একটা উদাহরণ দেখি:¶
---
# রাউটার কনফিগারেশন
device:
name: 'Core Router-1' # স্পেস আছে, তাই কোটেশন
location: Head-Office
interfaces:
- name: GigabitEthernet0/1
ip: 192.168.1.1
enabled: true
- name: GigabitEthernet0/2
ip: 192.168.2.1
enabled: false
vlans:
management: 10
data: 20
voice: 30
এখানে দেখুন:
- device
হল মূল কনটেইনার
- তার ভিতরে name
, location
, interfaces
, vlans
- interfaces
একটা লিস্ট (হাইফেন দিয়ে শুরু)
- vlans
একটা ম্যাপ (কী-ভ্যালু পেয়ার)
পাইথনে YAML ব্যবহার¶
import yaml
# YAML ফাইল থেকে ডাটা লোড
with open("config.yaml", 'r') as file:
# safe_load ব্যবহার করি নিরাপদ পার্সিং এর জন্য
config = yaml.safe_load(file)
# ডাটা অ্যাক্সেস করা
router_name = config['device']['name']
first_interface = config['device']['interfaces'][0]['name']
# ডাটা পরিবর্তন
config['device']['vlans']['data'] = 25
# YAML এ ফিরে লেখা
with open("new_config.yaml", 'w') as file:
yaml.dump(config, file, default_flow_style=False)
YAML এর মূল কাজ¶
- কনফিগারেশন স্টোর: সিস্টেমের সেটিং সংরক্ষণ
- ডাটা স্ট্রাকচারিং: জটিল ডাটাকে সুন্দরভাবে সাজানো
- অটোমেশন: স্ক্রিপ্ট দিয়ে কনফিগারেশন পরিবর্তন
- ডকুমেন্টেশন: সিস্টেমের কনফিগারেশন ডকুমেন্ট করা
গুরুত্বপূর্ণ
safe_load()
ব্যবহার করুনload()
এর পরিবর্তে - এটা নিরাপদ- ইনডেন্টেশন সঠিক রাখুন - YAML এ এটা খুবই গুরুত্বপূর্ণ
- জটিল স্ট্রিং এ কোটেশন ব্যবহার করুন