Junos PyEZ ఉచిత ipv4 సబ్‌నెట్‌ల కోసం శోధించే పని యొక్క ఉదాహరణను ఉపయోగిస్తోంది

Junos PyEZతో పని చేయడం గురించిన కథనం - “Python microframework, ఇది Junos OSని అమలు చేసే పరికరాలను నిర్వహించడానికి మరియు ఆటోమేట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది” ఆటోమేషన్ మరియు మేనేజ్‌మెంట్, మేము ఇష్టపడే ప్రతిదీ. ఈ కథనంలో వివరించిన స్క్రిప్ట్‌ను వ్రాయడం అనేక లక్ష్యాలను కలిగి ఉంది - పైథాన్ నేర్చుకోవడం మరియు జూనోస్ OS అమలులో ఉన్న పరికరాలపై సమాచారాన్ని సేకరించడం లేదా కాన్ఫిగరేషన్‌లను మార్చడం కోసం టాస్క్‌లను ఆటోమేట్ చేయడం. పైథాన్ ప్రోగ్రామింగ్ లాంగ్వేజ్‌లోకి ప్రవేశించడానికి తక్కువ అవరోధం మరియు Junos PyEZ లైబ్రరీని ఉపయోగించడం సౌలభ్యం కారణంగా పైథాన్ + జూనోస్ పైఈజ్ యొక్క నిర్దిష్ట కలయిక ఎంపిక చేయబడింది, దీనికి జూనోస్ OS గురించి నిపుణుల జ్ఞానం అవసరం లేదు.

పని

కంపెనీకి చెందిన ఉచిత ipv4 సబ్‌నెట్‌ల ఆడిట్. జూనోస్ OSలో నడుస్తున్న రూటర్‌గా పనిచేసే స్విచ్‌లోని రూట్‌లలో సబ్‌నెట్ ఉచితం అనే ప్రమాణం.

అమలు

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 నుండి ఆమోదించబడదు. వ్యవస్థలో ఉంటాయి. పరికరానికి కనెక్ట్ చేయడానికి, ప్రాంప్ట్ చేసినప్పుడు మీరు దాని హోస్ట్ పేరు లేదా IP చిరునామాను కూడా నమోదు చేయాలి. పరికరంలో అధికారం కోసం అవసరమైన మొత్తం డేటా స్వీకరించబడింది.

Junos PyEZ ssh ద్వారా కన్సోల్, టెల్నెట్ లేదా నెట్‌కాన్ఫ్‌ను ఉపయోగించి జూనోస్ 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 లూప్‌లోని విషయాలను చూద్దాం

ప్రారంభంలో, వినియోగదారు ఒక మాస్క్‌తో సబ్‌నెట్‌ను నమోదు చేయమని అడగబడతారు మరియు అదే సబ్‌నెట్ యొక్క నెట్‌వర్క్ నుండి మూడు ఆక్టెట్‌ల కంటే ఎక్కువ ఉండకూడదు, శోధన పరిధిని సెట్ చేయడానికి ఇది అవసరం. ప్రమాణాలు మరియు శోధన పరిధిని పేర్కొనే ఈ అమలు నాకు నిజంగా ఇష్టం లేదు, కానీ ఇప్పటివరకు నేను మెరుగైన పరిష్కారాన్ని కనుగొనలేదు. తరువాత, సబ్‌నెట్‌ల రూట్_జాబితా జాబితా నుండి, మూడు ఆక్టెట్‌ల కంటే ఎక్కువ లేని వేరియబుల్‌ని ఉపయోగించి, నాకు ఆసక్తి ఉన్న సబ్‌నెట్‌లను నేను ఎంచుకుంటాను

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

ఒక వ్యాఖ్యను జోడించండి