Junos PyEZ د وړیا ipv4 فرعي نیټونو لټون کولو دندې مثال په کارولو سره

د Junos PyEZ سره د کار کولو په اړه یوه مقاله - "د پایتون مایکرو فریم ورک چې تاسو ته وړتیا درکوي د جونوس OS چلولو وسیلو اداره او اتومات کړئ" اتومات او مدیریت ، هرڅه چې موږ یې خوښوو. په دې مقاله کې د بیان شوي سکریپټ لیکل څو موخې درلودې - د Python زده کړه او د معلوماتو راټولولو لپاره د کارونو اتومات کول یا د جونوس OS چلولو تجهیزاتو کې تشکیلات بدلول. د Python + Junos PyEZ د دې ځانګړي ترکیب انتخاب د Python برنامې ژبې ته د ننوتلو د ټیټ خنډ او د جونوس PyEZ کتابتون کارولو اسانتیا له امله رامینځته شوی ، کوم چې د جونوس OS متخصص پوهې ته اړتیا نلري.

موخه

د وړیا ipv4 فرعي نیټونو پلټنه چې شرکت پورې اړه لري. هغه معیار چې فرعي نیټ وړیا دی د سویچ په لارو کې د هغې په اړه د ننوتلو نشتوالی دی چې د روټر په توګه کار کوي چې جونوس OS چلوي.

پلي کول

Python + Junos PyEZ، که څه هم د پارامیکو او ssh.exec_command له لارې دا کولو لپاره لیوالتیا وه، د پایلې په توګه، تاسو به اړتیا ولرئ د netconf آلې شبکې مدیریت پروتوکول په هغه تجهیزاتو کې تنظیم کړئ چې رایه ورکول کیږي. Netconf د ریموټ پروسیجر کال RPC له لارې د هارډویر سره کار کوي او XML کاروي، پدې مثال کې، هغه معلومات چمتو کولو لپاره چې ترلاسه کوي.

د PyPI څخه د جونوس 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 له لارې د کنسول، telnet یا netconf په کارولو سره د Junos OS چلولو تجهیزاتو سره وصل ملاتړ کوي. مقاله د وروستي اختیار په اړه بحث کوي.

د تجهیزاتو سره د نښلولو لپاره، د jnpr.junos ماډل وسیله ټولګي وکاروئ

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

د ریموټ پروسیجر کال یا ریموټ پروسیجر کال له لارې روټر ته پیژندل شوي ټولو لارو لپاره غوښتنه کیږي ، کوم چې ډیر مناسب وي.

data = dev.rpc.get_route_information()

په جونوس 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()

اوس راځئ چې د وخت لوپ مینځپانګې وګورو

په پیل کې ، له کارونکي څخه به وغوښتل شي چې د ماسک سره فرعي نیټ ته ننوځي او د ورته فرعي شبکې شبکې څخه له دریو څخه ډیر نه وي ، دا د لټون حد تنظیم کولو لپاره اړین دی. زه واقعیا د معیارونو او لټون رینج مشخص کولو دا پلي کول نه خوښوم ، مګر تر دې دمه ما غوره حل ندی موندلی. بیا، د subnets route_list د نتیجې لیست څخه، د یو متغیر په کارولو سره چې له دریو څخه زیات نه وي، زه هغه فرعي نیټونه غوره کوم چې زما سره علاقه لري

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

Add a comment