Nkhani yokhudza kugwira ntchito ndi Junos PyEZ - "Python microframework yomwe imakuthandizani kuti muzitha kuyang'anira ndikusintha zida zomwe zikuyenda ndi Junos OS" ndi kasamalidwe, chilichonse chomwe timakonda. Kulemba zomwe zafotokozedwa m'nkhaniyi kunali ndi zolinga zingapo - kuphunzira Python ndi ntchito zodzipangira tokha kuti mutolere zambiri kapena kusintha masinthidwe pazida zomwe zikuyendetsa Junos OS. Kusankhidwa kwa kuphatikiza kwapadera kumeneku kwa Python + Junos PyEZ kudapangidwa chifukwa chotchinga pang'ono kulowa m'chinenero cha pulogalamu ya Python komanso kugwiritsa ntchito mosavuta laibulale ya Junos PyEZ, zomwe sizifuna chidziwitso cha akatswiri a Junos OS.
Cholinga
Kuwunika kwa ma subnet aulere a ipv4 akampani. Chomwe chimapangitsa kuti subnet ndi yaulere ndikusowa cholowera panjira pakusintha komwe kumakhala ngati rauta yomwe ikuyenda ndi Junos OS.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
Python + Junos PyEZ, ngakhale panali chiyeso chochita izi kudzera pa paramiko ndi ssh.exec_command,
Kuyika mtundu waposachedwa wa Junos PyEZ kuchokera ku PyPI kumachitika ndi lamulo ili:
$ pip install junos-eznc
Mutha kukhazikitsanso kuchokera kunthambi yayikulu ya polojekitiyi pa GitHub ndi lamulo ili:
$ pip install git+https://github.com/Juniper/py-junos-eznc.git
Ndipo njira inanso kudzera
$ pip install -r requirements.txt
Lamuloli lidzakhazikitsa malaibulale omwe akusowa padongosolo ndipo ndi ofunikira kuti agwire ntchito. Mu mtundu wanga zofunikira.txt Pali awiri okha aiwo, mitundu yaposachedwa ikuwonetsedwa panthawi yolemba script:
junos-eznc
netaddr
Mwachikhazikitso, script imatenga dzina la wogwiritsa ntchito panopa; mukhoza kulowa pansi pa dzina la wogwiritsa ntchito wina pogwiritsa ntchito kiyi ya show_route.py -u getpass.getpass imatenga mawu achinsinsi kuchokera ku stdin kuti mawu achinsinsi asakhalebe mudongosolo. Kuti mulumikizane ndi chipangizocho, muyeneranso kuyika dzina lake la hostname kapena adilesi ya IP mukafunsidwa. Deta yonse yofunikira kuti ivomerezedwe pa chipangizocho yalandiridwa.
Junos PyEZ imathandizira kulumikizana ndi zida zomwe zikuyenda ndi Junos OS pogwiritsa ntchito kontrakitala, telnet kapena netconf kudzera pa ssh. Nkhaniyi ikufotokoza njira yomalizayi.
Kuti mugwirizane ndi zipangizo, gwiritsani ntchito kalasi ya Chipangizo cha jnpr.junos module
with jnpr.junos.Device(host=router,
user=args.name,
passwd=password) as dev:
Pempho limapangidwa panjira zonse zodziwika ndi rauta kudzera pa foni yakutali kapena kuyimbira foni yakutali, chilichonse chomwe chili chosavuta.
data = dev.rpc.get_route_information()
Lamulo lofananalo pa Junos OS
user@router> show route | display xml
Powonjezera rpc kumapeto kwa lamulo, timapeza chizindikiro chopempha ndipo tikhoza kuchigwirizanitsa ndi dzina la njira ya RPC, mwa njira iyi tikhoza kupeza mayina ena okondweretsa. Ndizofunikira kudziwa kuti mawu olembera olembera ndi osiyana ndi dzina la njira, ndiye kuti, muyenera kusintha ma hyphens ndi ma underscores.
user@router> show route | display xml rpc
<rpc-reply >route_list = data.xpath("//rt-destination/text()")
Gawo lonselo linali litakulungidwa kwa nthawi yayitali, kuti musabwereze pempho kwa rauta ngati kunali koyenera kuyang'ana mu subnet ina kuchokera kwa omwe rauta akudziwa kale. Ndikoyenera kutchula kuti rauta yomwe ndikupempha pempho amadziwa njira zokha kudzera mu OSPF, kotero kuti rauta ya m'mphepete ndi bwino kusintha pempho pang'ono kuti muchepetse nthawi yolemba script.
data = dev.rpc.get_ospf_route_information()
Tsopano tiyeni tiwone zomwe zili mu nthawi loop
Pachiyambi, wogwiritsa ntchito adzafunsidwa kuti alowe mu subnet ndi chigoba ndipo osapitirira ma octets atatu kuchokera pa intaneti ya subnet yomweyo, izi ndizofunikira kuti muyike kusaka. Sindimakonda kwambiri kukhazikitsidwa uku kwakufotokozera zomwe mukufuna ndikusaka, koma mpaka pano sindinapeze yankho labwinoko. Chotsatira, kuchokera pamndandanda wotsatira wa subnets route_list, pogwiritsa ntchito chosinthika chomwe chili ndi ma octets osapitilira atatu, ndimasankha ma subnet omwe amandisangalatsa.
tmp = re.search(r'^%sS*' % subnet_search, route_list[i])
Kupyolera mu IPNetwork, gawo la netaddr, ndimalandira ma subnets ngati mndandanda wa ma adilesi a ipv4.
range_subnet = netaddr.IPNetwork(tmp.group(0))
Pogwiritsa ntchito IPNetwork, ndimapeza maadiresi osiyanasiyana kuchokera pa intaneti yomwe yalowetsedwa ndi ogwiritsa ntchito ndi chigoba ndikupanga mndandanda wa maadiresi onse kuchokera pamndandanda uwu poyerekeza ndi mndandanda wa maadiresi omwe ali nawo.
for i in set(net_list).difference(set(busyip)):
freeip.append(i)
Ndikuwonetsa mndandanda wazotsatira wamaadiresi aulere ngati ma subnets
print(netaddr.IPSet(freeip))
Pansipa pali zolemba zonse, zoyesedwa pa masiwichi omwe amagwiritsidwa ntchito ngati rauta, mitundu ya 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
Source: www.habr.com