Skip to content

নেটমিকো/ওয়াইএমএল দিয়ে কনফিগারেশন পুশ

অনেক বড় নেটওয়ার্ক ম্যানেজমেন্ট করার সময়, প্রতিটি ডিভাইসে আলাদাভাবে কনফিগারেশন করা খুব কষ্টকর এবং সময়সাপেক্ষ হতে পারে। তাই আমরা নেটওয়ার্ক অটোমেশন ব্যবহার করি, যা কাজকে দ্রুত এবং সঠিকভাবে করতে সাহায্য করে। এখানে আমি অ্যান্সিবল ব্যবহার করে কিভাবে নেটওয়ার্ক ডিভাইস কনফিগারেশন করা যায় তা ব্যাখ্যা করব, যেন প্রোগ্রামিং না জানলেও সহজে বুঝতে পারেন।

টেমপ্লেট ব্যবহার করে লুপব্যাক ইন্টারফেস যোগ

এই কাজে আমরা YAML, Jinja2 এবং Netmiko একসাথে ব্যবহার করে লুপব্যাক ইন্টারফেস কনফিগার করব,

কল্পনা করুন

  1. প্রথমে ভাবুন, আপনার কাছে একটা বড় নেটওয়ার্ক আছে যেখানে অনেকগুলো রাউটার রয়েছে। আপনি প্রতিটি রাউটারে কিছু নতুন সেটিং যোগ করতে চান।

  2. এই কাজটা হাতে করতে গেলে অনেক সময় লাগবে, আর ভুল হওয়ার সম্ভাবনাও থাকবে। তাই আমরা একটা স্মার্ট উপায় ব্যবহার করব।

আমরা যা যা ব্যবহার করব

  1. আমরা তিনটে জিনিস ব্যবহার করব:
  2. YAML ফাইল: এটা হল একটা সাধারণ টেক্সট ফাইল যেখানে আমরা ডাটা সাজিয়ে রাখব।
  3. Jinja2 টেমপ্লেট: এটা হল একটা ছক, যেখানে আমরা বলে দেব কীভাবে সেটিং লিখতে হবে।
  4. পাইথন স্ক্রিপ্ট: এটা সব কিছু একসাথে কাজ করাবে।

প্রথম ধাপ: YAML ফাইল তৈরি করা

  1. প্রথমে, আমরা দুটো YAML ফাইল তৈরি করব:
  2. hosts.yml: এখানে রাউটারগুলোর ডাটা থাকবে (যেমন: আইপি, পাসওয়ার্ড)।
  3. interfaces.yml: এখানে নতুন সেটিংয়ের ডাটা থাকবে।
hosts.yml
hosts:
  - name: 192.168.1.1
    username: admin
    password: admin
    port: 22
    type: cisco_ios
interfaces.yml
interfaces:
  - name: GigabitEthernet0/1
    description: Uplink to Router
    ip_address: 192.168.1.1
    subnet_mask: 255.255.255.0

দ্বিতীয় ধাপ: Jinja2 টেমপ্লেট তৈরি করা

  1. আমরা একটা Jinja2 টেমপ্লেট বানাব। এটা আসলে একটা ফর্ম, যেখানে আমরা বলে দিচ্ছি কীভাবে সেটিং লিখতে হবে।
interfaces_config_template.j2
interface {{ data.interfaces[0].name }}
 description {{ data.interfaces[0].description }}
 ip address {{ data.interfaces[0].ip_address }} {{ data.interfaces[0].subnet_mask }}
 no shutdown

তৃতীয় ধাপ: পাইথন স্ক্রিপ্ট তৈরি করা

  1. এবার আসল কাজটা করবে পাইথন স্ক্রিপ্ট। এটা কী করবে:
  2. YAML ফাইল থেকে ডাটা পড়বে।
  3. Jinja2 টেমপ্লেট ব্যবহার করে সেটিং তৈরি করবে।
  4. প্রতিটি রাউটারে লগ ইন করবে।
  5. নতুন সেটিং পাঠাবে।
  6. আমাদের জানাবে কাজটা ঠিকমতো হয়েছে কিনা।
পাইথন স্ক্রিপ্ট (deploy_config.py)

এই পাইথন কোড ব্লকটি একটি নেটওয়ার্ক অটোমেশন স্ক্রিপ্ট যা YAML ফাইল থেকে ডাটা পড়ে, Jinja2 টেমপ্লেট ব্যবহার করে কনফিগারেশন তৈরি করে, এবং Netmiko লাইব্রেরি ব্যবহার করে রাউটারে লগ ইন করে সেই কনফিগারেশন পাঠায়। চলুন লাইনের পর লাইন ব্যাখ্যা করি:

import yaml
from jinja2 import Environment, FileSystemLoader
from netmiko import Netmiko

এখানে তিনটা লাইব্রেরি ইমপোর্ট করা হয়েছে:

  • yaml: YAML ফাইল পড়ার জন্য।

  • jinja2: টেমপ্লেট তৈরি এবং ব্যবহার করার জন্য।

  • netmiko: নেটওয়ার্ক ডিভাইসে SSH এর মাধ্যমে কনফিগারেশন পাঠানোর জন্য।

# প্রথমে সব ডাটা লোড করা
hosts = yaml.load(open('hosts.yml'), Loader=yaml.SafeLoader)
interfaces = yaml.load(open('interfaces.yml'), Loader=yaml.SafeLoader)

এই অংশে দুটি YAML ফাইল থেকে ডাটা পড়া হচ্ছে:

  • hosts.yml: যেখানে রাউটারের ডাটা (যেমন: আইপি, পাসওয়ার্ড) রাখা আছে।

  • interfaces.yml: যেখানে ইন্টারফেস কনফিগারেশনের ডাটা রাখা আছে।

# টেমপ্লেট থেকে কনফিগারেশন তৈরি করা
env = Environment(loader=FileSystemLoader('.'), trim_blocks=True, autoescape=True)
template = env.get_template('interfaces_config_template.j2')
interface_config = template.render(data=interfaces)
পরের ব্লক;

এই অংশে Jinja2 টেমপ্লেট থেকে কনফিগারেশন তৈরি করা হচ্ছে: - env = Environment(loader=FileSystemLoader('.'), trim_blocks=True, autoescape=True): Jinja2 এনভায়রনমেন্ট সেট-আপ করা হচ্ছে, যেখানে বর্তমান ডিরেক্টরি থেকে টেমপ্লেট লোড করা হচ্ছে।

  • template = env.get_template('interfaces_config_template.j2'): interfaces_config_template.j2 নামে একটি টেমপ্লেট লোড করা হচ্ছে।

  • interface_config = template.render(data=interfaces): interfaces.yml থেকে পড়া ডাটা ব্যবহার করে টেমপ্লেট রেন্ডার করা হচ্ছে, যা থেকে কনফিগারেশন তৈরি হচ্ছে।

পরের ব্লক,

# প্রতিটি রাউটারে লগ ইন করে কনফিগারেশন পাঠানো
for host in hosts["hosts"]:
    net_connect = Netmiko(host=host["name"], username=host["username"], password=host["password"], port=host["port"], device_type=host["type"])
    print(f"Logged into {host['name']} successfully")
    output = net_connect.send_config_set(interface_config.split("\n"))
    print(f"Pushed config into {host['name']} successfully")
    net_connect.disconnect()

এই অংশে প্রতিটি রাউটারে লগ ইন করে কনফিগারেশন পাঠানো হচ্ছে: - for host in hosts["hosts"]: প্রতিটি রাউটারের ডাটার জন্য লুপ চালানো হচ্ছে। - net_connect = Netmiko(...): Netmiko ব্যবহার করে রাউটারে লগ ইন করা হচ্ছে। - print(f"Logged into {host['name']} successfully"): সফল লগ ইন হলে মেসেজ প্রিন্ট করা হচ্ছে। - output = net_connect.send_config_set(interface_config.split("\n")): রেন্ডার করা কনফিগারেশনটি রাউটারে পাঠানো হচ্ছে। - print(f"Pushed config into {host['name']} successfully"): কনফিগারেশন সফলভাবে পাঠানো হলে মেসেজ প্রিন্ট করা হচ্ছে। - net_connect.disconnect(): রাউটারের সাথে সংযোগ বিচ্ছিন্ন করা হচ্ছে।

print("Done!")

এই লাইনটি স্ক্রিপ্টটি শেষ হওয়ার পর একটি শেষ মেসেজ প্রিন্ট করছে।

এই কোডটি YAML ফাইল থেকে ডাটা পড়ে, Jinja2 টেমপ্লেট ব্যবহার করে কনফিগারেশন তৈরি করে, এবং Netmiko ব্যবহার করে রাউটারে সেই কনফিগারেশন প্রয়োগ করে। এটি পুরো প্রক্রিয়াটি অটোমেশন করে দেয়, ফলে কাজ দ্রুত এবং নির্ভুলভাবে সম্পন্ন হয়।

স্ক্রিপ্ট চালানো

  1. এই স্ক্রিপ্ট চালালে, এটা কয়েক সেকেন্ডের মধ্যে সব রাউটারে নতুন সেটিং যোগ করে দেবে। যা হাতে করলে ঘণ্টার পর ঘণ্টা লাগত।
python deploy_config.py

সুবিধাগুলো

  1. এর সুবিধা হল:
  2. সময় বাঁচে: হাতে করতে যা অনেক সময় লাগত, তা কয়েক সেকেন্ডে হয়ে যায়।
  3. ভুল হওয়ার সম্ভাবনা কমে: একই কনফিগারেশন একাধিক ডিভাইসে প্রয়োগ করতে হলে, ম্যানুয়াল এন্ট্রি ভুল হওয়ার ঝুঁকি কমে।
  4. বড় পরিবর্তন সহজে করা যায়: YAML ফাইল বা টেমপ্লেট বদলালে সহজেই বড় পরিবর্তন করা যায়।
  5. প্রোগ্রামিং দক্ষতা ছাড়াই ব্যবহারযোগ্য: কোডের জটিলতা বুঝতে না পারলেও YAML ফাইল পরিবর্তন করে সহজেই কাজ করা যায়।

এভাবে, প্রোগ্রামিং ব্যবহার করে আমরা জটিল নেটওয়ার্ক কাজগুলোকে সহজ ও দ্রুত করে তুলতে পারি। এটা যেন একটা রোবট, যাকে আমরা বলে দিচ্ছি কী করতে হবে, আর সে সেই কাজ দ্রুত ও নির্ভুলভাবে করে ফেলছে।