Skip to content

পাইথন দিয়ে ডাটা এক্সেস

কোড বোঝার জন্য

এই চ্যাপ্টারের কোডগুলো বোঝার জন্য, প্র্যাকটিস করার জন্য নয়। প্র্যাকটিসের কোড পাবেন "আমাদের কিছু 'ইউজড' কেস" চ্যাপ্টারে।

নেটওয়ার্ক ডিভাইস থেকে ডাটা সংগ্রহ

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

১. নেটওয়ার্ক ডিভাইসের সাথে সংযোগ স্থাপন

প্রথমে আমাদেরকে নেটওয়ার্ক ডিভাইসের সাথে সংযোগ স্থাপন করতে হবে। এটি করার জন্য পাইথনের Netmiko লাইব্রেরি খুবই জনপ্রিয়। Netmiko লাইব্রেরি ব্যবহার করে সহজেই বিভিন্ন ধরনের নেটওয়ার্ক ডিভাইসের সাথে SSH বা Telnet প্রোটোকল ব্যবহার করে সংযোগ স্থাপন করা যায়। আমি ধারনা করছি, আমাদের 'এসএসএইচ' কনফিগার করা আছে।

Netmiko ইন্সটল করা:

Netmiko ইন্সটল করার জন্য পিপি ইনস্টল কমান্ডটি ব্যবহার করা হয়:

pip install netmiko

২. ডিভাইসে সংযোগ এবং কমান্ড চালানো

নিচে একটা উদাহরণ দেওয়া হলো যেটি একটা সুইচে সংযোগ স্থাপন করবে এবং এর show ip interface brief কমান্ডটি চালাবে।

from netmiko import ConnectHandler

# নেটওয়ার্ক ডিভাইসের বিবরণ
device = {
    'device_type': 'cisco_ios',  # ডিভাইসের টাইপ
    'host': '192.168.1.1',  # ডিভাইসের IP অ্যাড্রেস
    'username': 'admin',  # ইউজারনেম
    'password': 'password',  # পাসওয়ার্ড
    'secret': 'secret',  # Enable পাসওয়ার্ড (যদি প্রয়োজন হয়)
}

# ডিভাইসে সংযোগ স্থাপন
net_connect = ConnectHandler(**device)

# প্রয়োজনীয় হলে enable মোডে স্যুইচ করা
net_connect.enable()

# একটা কমান্ড চালানো
output = net_connect.send_command('show ip interface brief')
print(output)

# সংযোগ বন্ধ করা
net_connect.disconnect()

৩. ব্যাপারটা বুঝতে চাই:

1. **লাইব্রেরি ইমপোর্ট করা**:
আমরা Netmiko লাইব্রেরি থেকে `ConnectHandler` ইমপোর্ট করেছি।

```python
from netmiko import ConnectHandler
```

2. **ডিভাইসের বিবরণ নির্ধারণ করা**:
একটা ডিকশনারি (dictionary) এর মাধ্যমে ডিভাইসের প্রয়োজনীয় ডাটা (যেমন: ডিভাইস টাইপ, IP অ্যাড্রেস, ইউজারনেম, পাসওয়ার্ড) নির্ধারণ করা হয়েছে।

```python
device = {
    'device_type': 'cisco_ios',
    'host': '192.168.1.1',
    'username': 'admin',
    'password': 'password',
    'secret': 'secret',
}
```

3. **ডিভাইসে সংযোগ স্থাপন করা**:
`ConnectHandler` ব্যবহার করে ডিভাইসে সংযোগ স্থাপন করা হয়েছে। আমরা net_connect = ConnectHandler(**device) মানে ডিভাইসে সংযোগ এবং কমান্ড চালানোর আগে এসএসএইচ কনফিগার করে নিতে হবে।

```python
net_connect = ConnectHandler(**device)
```

4. **Enable মোডে স্যুইচ করা**:
যদি ডিভাইসটি enable পাসওয়ার্ড চায়, তবে enable মোডে স্যুইচ করা হয়েছে।

```python
net_connect.enable()
```

5. **কমান্ড চালানো**:
`send_command` মেথড ব্যবহার করে `show ip interface brief` কমান্ডটি চালানো হয়েছে এবং এর আউটপুট প্রিন্ট করা হয়েছে।

```python
output = net_connect.send_command('show ip interface brief')
print(output)
```

6. **সংযোগ বন্ধ করা**:
কাজ শেষ হলে সংযোগ বন্ধ করা হয়েছে।

```python
net_connect.disconnect()
```

SSH কী ফাইল ব্যবহার করা:

আপনি যদি SSH কী ফাইল ব্যবহার করতে চান, তাহলে ssh_config_file অপশন ব্যবহার করতে পারেন।

device = {
    'device_type': 'cisco_ios',
    'host': '192.168.1.1',
    'username': 'admin',
    'ssh_config_file': '/path/to/your/ssh_config'
}
ssh_config_file: এই অপশনটি ব্যবহার করে আপনি আপনার SSH কনফিগারেশন ফাইলটা কোথায় আছে সেটা বলতে পারেন। এই ফাইলে আপনি হোস্ট, ইউজারনেম, পাসওয়ার্ড, এবং অন্যান্য SSH সেটিংস সেভ করতে পারেন।

SSH Keys: পাসওয়ার্ডের পরিবর্তে SSH keys ব্যবহার করা আরও নিরাপদ। Netmiko লাইব্রেরি SSH keys ব্যবহার করার সুবিধাও দেয়।

৪. অন্যান্য লাইব্রেরি ব্যবহার

Netmiko ছাড়াও পাইথনে নেটওয়ার্ক অটোমেশন ও ডিভাইস ম্যানেজমেন্টের জন্য আরও কিছু জনপ্রিয় লাইব্রেরি রয়েছে:

  • Paramiko: SSH প্রোটোকল ব্যবহার করে ডিভাইসে সংযোগ স্থাপন করতে সাহায্য করে।
  • Napalm: এটি একটা মাল্টি-ভেন্ডর অটোমেশন টুল যা বিভিন্ন ধরনের নেটওয়ার্ক ডিভাইসের জন্য সমর্থিত।
  • Ansible: এটি একটা শক্তিশালী অটোমেশন টুল যা বিভিন্ন ডিভাইসের কনফিগারেশন ম্যানেজমেন্ট ও ডেপ্লয়মেন্টের জন্য ব্যবহৃত হয়।

পাইথনের এই লাইব্রেরিগুলো ব্যবহার করে আপনি সহজেই নেটওয়ার্ক ডিভাইসের সাথে ইন্টারঅ্যাক্ট করতে পারবেন এবং বিভিন্ন কাজ স্বয়ংক্রিয়ভাবে সম্পন্ন করতে পারবেন।

API ব্যবহার করে ডাটা সংগ্রহ

আমরা সহজ ভাষায় বুঝতে চেষ্টা করব কিভাবে Python ব্যবহার করে নেটওয়ার্ক ডিভাইসের সাথে যোগাযোগ করা যায়। এখানে, আমরা API ব্যবহার করে একটা ডিভাইসের কিছু ডাটা সংগ্রহ করব।

কীভাবে API কাজ করে?

API (Application Programming Interface) হলো একটা মাধ্যম যা বিভিন্ন সফটওয়্যার বা ডিভাইসকে একে অপরের সাথে কথা বলতে সাহায্য করে। আমরা API এর মাধ্যমে ডিভাইসকে বিভিন্ন নির্দেশনা পাঠাতে পারি এবং তার কাছ থেকে ডাটা নিতে পারি।

উদাহরণ

ধরুন, আপনার একটা সিসকো রাউটার আছে এবং আপনি তার বিভিন্ন ইন্টারফেসের ডাটা জানতে চান। আমরা Python ব্যবহার করে এই ডাটা API এর মাধ্যমে সংগ্রহ করতে পারি।

ধাপ

  1. লাইব্রেরি ইমপোর্ট করা: আমরা requests নামক একটা লাইব্রেরি ব্যবহার করব যা API এর সাথে যোগাযোগ করতে সাহায্য করে। json নামক আরেকটি লাইব্রেরি ব্যবহার করব JSON (যা একটা ডেটা ফরম্যাট) ডেটা পড়তে এবং লিখতে।

  2. ডিভাইসের ডাটা সেট করা: আমাদের ডিভাইসের IP অ্যাড্রেস, ইউজারনেম, পাসওয়ার্ড এবং পোর্ট নম্বর নির্ধারণ করতে হবে।

  3. URL সেট করা: API এর অ্যাড্রেস যেখানে আমরা অনুরোধ পাঠাব।

  4. হেডার সেট করা: API কে জানানো হবে যে আমরা কী ধরনের ডেটা চাই।

  5. API কল করা: Python এর মাধ্যমে API এর কাছে অনুরোধ পাঠানো এবং ডেটা গ্রহণ করা।

  6. রেসপন্স চেক করা: ডিভাইস থেকে প্রাপ্ত ডেটা প্রিন্ট করা।

উদাহরণ কোড: REST API দিয়ে সিসকো ডিভাইসের হোস্টনেম নেয়া: বিস্তারিত ব্যাখ্যা

আসুন একটা সহজ উদাহরণ দিয়ে শুরু করি। আমরা সিস্কোর একটা পাবলিক ল্যাব ডিভাইস থেকে হোস্টনেম বের করব REST API দিয়ে। একটু একটু করে দেখি কীভাবে করতে হয়।

import requests
requests.packages.urllib3.disable_warnings()
USER = 'admin'
PASS = 'C1sco12345'
uri = 'https://devnetsandboxiosxe.cisco.com:443/restconf/data/Cisco-IOS-XE-native:native/hostname'
headers = {
      "Accept" : "application/yang-data+json"
   }
response = requests.get(
    url=uri,
    headers=headers,
    auth=(USER, PASS),
    verify=False)

print(response.json())

স্টেপ ১: প্রয়োজনীয় লাইব্রেরি নেওয়া

import requests
requests.packages.urllib3.disable_warnings()
এখানে requests লাইব্রেরি নিয়েছি API কল করার জন্য। আর দ্বিতীয় লাইনে SSL সার্টিফিকেট ওয়ার্নিং বন্ধ করে দিয়েছি।

স্টেপ ২: ক্রেডেনশিয়াল সেট করা

USER = 'admin'
PASS = 'C1sco12345'
এখানে ডিভাইসে লগইন করার জন্য ইউজারনেম আর পাসওয়ার্ড সেট করেছি।

স্টেপ ৩: API এনডপয়েন্ট URI সেট করা

uri = 'https://devnetsandboxiosxe.cisco.com:443/restconf/data/Cisco-IOS-XE-native:native/hostname'
এই লাইনে বলে দিচ্ছি: - কোন ডিভাইসে যাব (devnetsandboxiosxe.cisco.com) - কোন পোর্টে যাব (443) - কী ডাটা চাই (hostname)

স্টেপ ৪: হেডার সেট করা

headers = {
    "Accept" : "application/yang-data+json"
}
এখানে বলে দিচ্ছি আমরা JSON ফরম্যাটে ডাটা চাই।

স্টেপ ৫: API কল করা

response = requests.get(
    url=uri,
    headers=headers,
    auth=(USER, PASS),
    verify=False)
এখানে: - get মেথড ব্যবহার করছি (ডাটা দেখার জন্য) - URL, হেডার দিয়েছি - ইউজারনেম-পাসওয়ার্ড দিয়েছি - SSL চেক বন্ধ রেখেছি (verify=False)

স্টেপ ৬: রেজাল্ট দেখা

print(response.json())
API থেকে যে JSON ডাটা আসবে সেটা প্রিন্ট করে দেখাচ্ছি।

{'Cisco-IOS-XE-native:hostname': 'Cat8000V'}

ব্যাপারটা বুঝতে চাই

মনে করুন, আপনি CLI-তে show hostname কমান্ড দিচ্ছেন। কিন্তু এখানে সেটা করছেন API দিয়ে। এতে করে আপনি প্রোগ্রামাটিক্যালি ডিভাইসের তথ্য পেতে পারছেন।

কেন API ব্যবহার করব?

  1. অটোমেশন: একই কমান্ড ১০০টা ডিভাইসে চালাতে হলে CLI-তে ১০০ বার টাইপ করতে হবে। API দিয়ে একবারে হয়ে যাবে।

  2. ডাটা প্রসেসিং: CLI-তে আউটপুট কপি-পেস্ট করে পার্স করতে হয়। API-তে JSON ফরম্যাটে পাই, সহজে প্রসেস করা যায়।

  3. ইন্টিগ্রেশন: অন্য সিস্টেমের সাথে ইন্টিগ্রেট করা সহজ। যেমন - মনিটরিং টুল বা টিকেটিং সিস্টেম।

সাধারণ সমস্যা ও সমাধান:

  1. SSL সার্টিফিকেট এরর:

    # এজন্যই আমরা শুরুতে লিখেছি:
    requests.packages.urllib3.disable_warnings()
    # এবং verify=False দিয়েছি
    

  2. অথেনটিকেশন এরর:

  3. ইউজারনেম-পাসওয়ার্ড ঠিক আছে কি না
  4. ডিভাইসে REST API এনাবল আছে কি না

  5. URI এরর:

  6. পোর্ট নম্বর ঠিক আছে কি না (443 বা 8443)
  7. পাথ ঠিক আছে কি না

টিপস

আপনি যখন CLI কমান্ড বুঝতে পারেন, তখন API বোঝাও সহজ। শুধু মনে রাখবেন: - CLI = মানুষের সাথে কথা বলা - API = প্রোগ্রামের সাথে কথা বলা