Junos PyEZ இலவச ipv4 சப்நெட்களைத் தேடும் பணியின் உதாரணத்தைப் பயன்படுத்துகிறது

Junos PyEZ உடன் பணிபுரிவது பற்றிய ஒரு கட்டுரை - “Python microframework, இது Junos OS இயங்கும் சாதனங்களை நிர்வகிக்கவும் தானியங்குபடுத்தவும் உங்களை அனுமதிக்கிறது” ஆட்டோமேஷன் மற்றும் மேலாண்மை, நாங்கள் விரும்பும் அனைத்தையும். இந்த கட்டுரையில் விவரிக்கப்பட்டுள்ள ஸ்கிரிப்டை எழுதுவது பல குறிக்கோள்களைக் கொண்டுள்ளது - பைத்தானைக் கற்றுக்கொள்வது மற்றும் தகவல்களைச் சேகரிப்பதற்கான பணிகளை தானியங்குபடுத்துவது அல்லது ஜூனோஸ் ஓஎஸ் இயங்கும் சாதனங்களில் உள்ளமைவுகளை மாற்றுவது. Python + Junos PyEZ இன் இந்த குறிப்பிட்ட கலவையின் தேர்வு, பைதான் நிரலாக்க மொழியில் நுழைவதற்கான குறைந்த தடையின் காரணமாகவும், Junos PyEZ நூலகத்தின் பயன்பாட்டின் எளிமை காரணமாகவும் செய்யப்பட்டது, இதற்கு ஜூனோஸ் OS பற்றிய நிபுணர் அறிவு தேவையில்லை.

பணி

நிறுவனத்திற்கு சொந்தமான இலவச ipv4 சப்நெட்களின் தணிக்கை. ஒரு சப்நெட் இலவசம் என்பதற்கான அளவுகோல், ஜூனோஸ் ஓஎஸ் இயங்கும் ரூட்டராக செயல்படும் சுவிட்சில் உள்ள வழித்தடங்களில் அதைப் பற்றிய நுழைவு இல்லாதது.

Реализация

Python + Junos PyEZ, paramiko மற்றும் ssh.exec_command மூலம் அதைச் செய்ய ஆசை இருந்தாலும், இதன் விளைவாக, நீங்கள் netconf சாதன நெட்வொர்க் மேலாண்மை நெறிமுறையை வாக்களிக்கப்படும் கருவியில் உள்ளமைக்க வேண்டும். Netconf தொலைநிலை செயல்முறை அழைப்பு RPC வழியாக வன்பொருளுடன் வேலை செய்கிறது மற்றும் இந்த எடுத்துக்காட்டில், அது பெறும் தகவலை வழங்க XML ஐப் பயன்படுத்துகிறது.

PyPI இலிருந்து Junos PyEZ இன் தற்போதைய பதிப்பை நிறுவுவது பின்வரும் கட்டளையுடன் செய்யப்படுகிறது:

$ pip install junos-eznc

பின்வரும் கட்டளையுடன் GitHub இல் உள்ள திட்டத்தின் பிரதான கிளையிலிருந்தும் நீங்கள் நிறுவலாம்:

$ pip install git+https://github.com/Juniper/py-junos-eznc.git

மேலும் ஒரு விருப்பம் வழியாக

$ pip install -r requirements.txt 

இந்த கட்டளை கணினியில் இல்லாத மற்றும் செயல்பாட்டிற்கு தேவையான நூலகங்களை நிறுவும். எனது பதிப்பில் අවශ්‍යතා. txt அவற்றில் இரண்டு மட்டுமே உள்ளன, ஸ்கிரிப்ட் எழுதும் நேரத்தில் சமீபத்திய பதிப்புகள் குறிக்கப்படுகின்றன:

junos-eznc
netaddr

ஸ்கிரிப்ட் முன்னிருப்பாக கணினியில் உள்ள தற்போதைய பயனரின் பெயரை எடுக்கும், நீங்கள் மற்றொரு பயனரின் பெயரில் உள்நுழைய முடியும் show_route.py -u getpass.getpass விசையைப் பயன்படுத்தி கடவுச்சொல்லை stdin இலிருந்து எடுக்கிறது, எனவே கடவுச்சொல் இருக்காது. அமைப்பில். சாதனத்துடன் இணைக்க, கேட்கும் போது அதன் ஹோஸ்ட்பெயர் அல்லது ஐபி முகவரியையும் உள்ளிட வேண்டும். சாதனத்தில் அங்கீகாரத்திற்கு தேவையான அனைத்து தரவுகளும் பெறப்பட்டுள்ளன.

Junos PyEZ ஆனது கன்சோல், டெல்நெட் அல்லது netconf ஐப் பயன்படுத்தி ssh வழியாக Junos OS இல் இயங்கும் உபகரணங்களுடன் இணைவதை ஆதரிக்கிறது. கட்டுரை பிந்தைய விருப்பத்தைப் பற்றி விவாதிக்கிறது.

உபகரணங்களுடன் இணைக்க, jnpr.junos தொகுதியின் சாதன வகுப்பைப் பயன்படுத்தவும்

with jnpr.junos.Device(host=router,
                           user=args.name,
                           passwd=password) as dev:

தொலைநிலை நடைமுறை அழைப்பு அல்லது தொலைநிலை நடைமுறை அழைப்பு மூலம் திசைவிக்குத் தெரிந்த அனைத்து வழிகளுக்கும் ஒரு கோரிக்கை செய்யப்படுகிறது, எது மிகவும் வசதியானது.

data = dev.rpc.get_route_information()

Junos OS இல் இதே போன்ற கட்டளை

user@router> show route | display xml

கட்டளையின் முடிவில் rpc ஐச் சேர்ப்பதன் மூலம், நாம் ஒரு கோரிக்கை குறிச்சொல்லைப் பெறுகிறோம், அதை RPC முறையின் பெயருடன் பொருத்தலாம், இந்த வழியில் ஆர்வமுள்ள பிற பெயர்களைக் கண்டறியலாம். கோரிக்கை குறிச்சொல்லை எழுதுவதற்கான தொடரியல் முறையின் பெயரிலிருந்து வேறுபட்டது என்பது கவனிக்கத்தக்கது, அதாவது, நீங்கள் ஹைபன்களை அடிக்கோடிட்டு மாற்ற வேண்டும்.

user@router> show route | display xml rpc
<rpc-reply >route_list = data.xpath("//rt-destination/text()")

ரூட்டருக்கு ஏற்கனவே தெரிந்தவற்றிலிருந்து மற்றொரு சப்நெட்டில் சரிபார்க்க வேண்டிய அவசியம் ஏற்பட்டால், திசைவிக்கான கோரிக்கையை மீண்டும் செய்யாமல் இருக்க, மீதமுள்ள பகுதி சிறிது நேர வளையத்தில் மூடப்பட்டிருக்கும். நான் கோரிக்கை வைக்கும் ரூட்டருக்கு OSPF மூலம் மட்டுமே வழிகள் தெரியும் என்பது குறிப்பிடத்தக்கது, எனவே ஒரு விளிம்பு திசைவிக்கு ஸ்கிரிப்ட்டின் இயங்கும் நேரத்தை குறைக்க கோரிக்கையை சிறிது மாற்றுவது நல்லது.

data = dev.rpc.get_ospf_route_information()

இப்போது while loop இன் உள்ளடக்கங்களைப் பார்ப்போம்

தொடக்கத்தில், பயனர் ஒரு முகமூடியுடன் ஒரு சப்நெட்டை உள்ளிடும்படி கேட்கப்படுவார் மற்றும் அதே சப்நெட்டின் நெட்வொர்க்கில் இருந்து மூன்று ஆக்டெட்டுகளுக்கு மேல் இல்லை, இது தேடல் வரம்பை அமைக்க அவசியம். அளவுகோல் மற்றும் தேடல் வரம்பைக் குறிப்பிடும் இந்தச் செயலாக்கம் எனக்கு உண்மையில் பிடிக்கவில்லை, ஆனால் இதுவரை நான் ஒரு சிறந்த தீர்வைக் கண்டுபிடிக்கவில்லை. அடுத்து, சப்நெட்களின் ரூட்_லிஸ்ட் பட்டியலிலிருந்து, மூன்று ஆக்டெட்டுகளுக்கு மேல் இல்லாத மாறியைப் பயன்படுத்தி, எனக்கு விருப்பமான சப்நெட்களைத் தேர்ந்தெடுக்கிறேன்.

tmp = re.search(r'^%sS*' % subnet_search, route_list[i])

IPNetwork, netaddr தொகுதி மூலம், ipv4 முகவரிகளின் பட்டியலின் வடிவத்தில் சப்நெட்களைப் பெறுகிறேன்

range_subnet = netaddr.IPNetwork(tmp.group(0))

IPNetwork ஐப் பயன்படுத்தி, முகமூடியுடன் பயனர் உள்ளிட்ட நெட்வொர்க்கிலிருந்து முகவரிகளின் வரம்பை நான் பெறுகிறேன் மற்றும் ஆக்கிரமிக்கப்பட்ட முகவரிகளின் பட்டியலுடன் ஒப்பிடுவதற்காக இந்த வரம்பிலிருந்து அனைத்து முகவரிகளின் பட்டியலையும் உருவாக்குகிறேன்.

for i in set(net_list).difference(set(busyip)):
        freeip.append(i)

இதன் விளைவாக வரும் இலவச முகவரிகளின் பட்டியலை சப்நெட் வடிவில் காட்டுகிறேன்

print(netaddr.IPSet(freeip))

கீழே உள்ள முழுமையான ஸ்கிரிப்ட், ரூட்டராகப் பயன்படுத்தப்படும் சுவிட்சுகளில் சோதிக்கப்பட்டது, மாதிரிகள் ex4550, ex4600


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import getpass
import netaddr
import re
import sys

import jnpr.junos

parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user',
                    action='store',
                    dest='name',
                    help='Enter login from tacacs if it differs from the '
                         'username in the system.')
args = parser.parse_args()

if not args.name:
    args.name = getpass.getuser()    # Return the “login name” of the user.
router = input("Full routers name: ")
password = getpass.getpass("Password: ")

try:
    # Authenticates to a device running Junos, for get information about routs
    # into xml format and selects by tag.
    route_list = []
    with jnpr.junos.Device(host=router,
                           user=args.name,
                           passwd=password) as dev:
        data = dev.rpc.get_route_information()
    route_list = data.xpath("//rt-destination/text()")
except (jnpr.junos.exception.ConnectRefusedError,
        jnpr.junos.exception.ConnectUnknownHostError) as err:
    print("Equipment name or password wrong.")
    sys.exit(1)

while True:
    subnet = input("Net with mask: ")
    subnet_search = input("Input no more three octet: ")
    # Gets a list of busy IP addresses from the received subnets.
    busyip = []
    for i in range(len(route_list)):
        tmp = re.search(r'^%sS*' % subnet_search, route_list[i])
        if tmp:
            range_subnet = netaddr.IPNetwork(tmp.group(0))
            for ip in range_subnet:
                busyip.append("%s" % ip)
    range_subnet = netaddr.IPNetwork(subnet)
    # Gets list ip adresses from subnetworks lists.
    net_list = []
    for ip in range_subnet:
        net_list.append("%s" % ip)
    # Сomparing lists.
    freeip = []
    for i in set(net_list).difference(set(busyip)):
        freeip.append(i)
    print(netaddr.IPSet(freeip))

    request = input("To run request again enter yes or y, "
                    "press 'enter', complete request: ")
    if request in ("yes", "y"):
        continue
    else:
        print('Bye')
        break

ஆதாரம்: www.habr.com

கருத்தைச் சேர்