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