Junos PyEZ pogwiritsa ntchito chitsanzo cha ntchito yofufuza ma subnets aulere a ipv4

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, Zotsatira zake, mudzafunika kukonza protocol yoyang'anira netconf pazida zomwe zikufunsidwa. Netconf imagwira ntchito ndi ma hardware kudzera pa njira yakutali ya RPC ndipo imagwiritsa ntchito XML, mu chitsanzo ichi, kuti ipereke zambiri zomwe imalandira.

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

Kuwonjezera ndemanga