Junos PyEZ a’ cleachdadh an eisimpleir den obair a bhith a’ lorg subnets ipv4 an-asgaidh

Artaigil mu bhith ag obair le Junos PyEZ - “Python microframework a leigeas leat innealan a tha a’ ruith Junos OS a riaghladh agus a dhèanamh fèin-ghluasadach" fèin-ghluasad agus riaghladh, a h-uile dad a tha sinn dèidheil air. Bha grunn amasan aig sgrìobhadh an sgriobt a tha air a mhìneachadh san artaigil seo - ionnsachadh Python agus gnìomhan fèin-ghluasadach airson fiosrachadh a chruinneachadh no atharrachadh rèiteachaidhean air uidheamachd a tha a’ ruith Junos OS. Chaidh an taghadh den mheasgachadh sònraichte seo de Python + Junos PyEZ a dhèanamh air sgàth a’ chnap-starra ìosal a thaobh faighinn a-steach do chànan prògramadh Python agus cho furasta sa tha leabharlann Junos PyEZ a chleachdadh, nach eil feumach air eòlas eòlach air Junos OS.

Amas

Sgrùdadh air subnets ipv4 an-asgaidh a bhuineas don chompanaidh. Is e an slat-tomhais gu bheil subnet an-asgaidh às aonais inntrigeadh mu dheidhinn anns na slighean air an suidse ag obair mar router a’ ruith Junos OS.

Реализация

Python + Junos PyEZ, ged a bha buaireadh ann a dhèanamh tro paramiko agus ssh.exec_command, Mar thoradh air an sin, feumaidh tu protocol stiùireadh lìonra inneal netconf a rèiteachadh air an uidheamachd a thathar a’ sgrùdadh. Bidh Netconf ag obair le bathar-cruaidh tro mhodhan iomallach cuir fios gu RPC agus a’ cleachdadh XML, san eisimpleir seo, gus am fiosrachadh a gheibh e a thoirt seachad.

Tha stàladh an tionndadh làithreach de Junos PyEZ bho PyPI air a dhèanamh leis an òrdugh a leanas:

$ pip install junos-eznc

Faodaidh tu cuideachd stàladh bho phrìomh mheur a ’phròiseict air GitHub leis an àithne a leanas:

$ pip install git+https://github.com/Juniper/py-junos-eznc.git

Agus aon roghainn eile tro

$ pip install -r requirements.txt 

Stàlaichidh an àithne seo leabharlannan a tha a dhìth bhon t-siostam agus a tha riatanach airson obrachadh. Anns an dreach agam riatanasan.txt Chan eil ann ach dhà dhiubh, tha na dreachan as ùire air an comharrachadh aig àm sgrìobhaidh an sgriobt:

junos-eznc
netaddr

Bidh an sgriobt gu gnàthach a’ toirt ainm a’ chleachdaiche làithreach san t-siostam, faodaidh tu logadh a-steach fo ainm neach-cleachdaidh eile a’ cleachdadh an iuchair show_route.py -u getpass.getpass a’ toirt am facal-faire bho stdin gus nach fuirich am facal-faire anns an t-siostam. Gus ceangal ris an uidheamachd, feumaidh tu cuideachd an t-ainm aoigheachd no an seòladh IP aige a chuir a-steach nuair a thèid iarraidh ort. Chaidh a h-uile dàta a tha riatanach airson cead air an inneal fhaighinn.

Tha Junos PyEZ a’ toirt taic do bhith a’ ceangal ri uidheamachd a tha a’ ruith Junos OS a’ cleachdadh a’ chonsail, telnet no netconf tro ssh. Tha an artaigil a’ beachdachadh air an roghainn mu dheireadh.

Gus ceangal ri uidheamachd, cleachd an clas inneal den mhodal jnpr.junos

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

Thèid iarrtas a dhèanamh airson a h-uile slighe as aithne don router tro ghairm modh iomallach no gairm modh-obrach iomallach, ge bith dè as freagarraiche.

data = dev.rpc.get_route_information()

Òrdugh coltach ris air Junos OS

user@router> show route | display xml

Le bhith a’ cur rpc gu deireadh na h-àithne, gheibh sinn taga iarrtas agus is urrainn dhuinn a mhaidseadh le ainm an dòigh RPC, san dòigh seo gheibh sinn a-mach ainmean eile anns a bheil ùidh. 'S fhiach toirt fa-near gu bheil an co-chòrdadh airson sgrìobhadh an taga iarrtas eadar-dhealaichte bhon dòigh-ainm,' se sin, bu chòir a chur an àite an tàthan le underscores.

user@router> show route | display xml rpc
<rpc-reply >route_list = data.xpath("//rt-destination/text()")

Chaidh an còrr den phàirt a phasgadh ann an lùb ùine, gus nach dèanadh tu an t-iarrtas a-rithist don router ma bha e riatanach sgrùdadh a dhèanamh ann an subnet eile bhon fheadhainn a tha fios aig an router mu thràth. Is fhiach a ràdh gu bheil fios aig an router air a bheil mi a’ dèanamh an iarrtais slighean a-mhàin tro OSPF, agus mar sin airson router iomaill tha e nas fheàrr an t-iarrtas atharrachadh beagan gus ùine ruith an sgriobt a lughdachadh

data = dev.rpc.get_ospf_route_information()

A-nis leig dhuinn sùil a thoirt air na tha anns an lùb fhad

Aig an toiseach, thèid iarraidh air an neach-cleachdaidh subnet a chuir a-steach le masg agus gun a bhith nas fhaide na trì octets bhon lìonra den aon subnet, feumar seo gus an raon sgrùdaidh a shuidheachadh. Cha toil leam am buileachadh seo de bhith a’ sònrachadh nan slatan-tomhais agus an raon sgrùdaidh, ach gu ruige seo cha do lorg mi fuasgladh nas fheàrr. An ath rud, bhon liosta subnets route_list a thig às, a’ cleachdadh caochladair anns nach eil barrachd air trì octets, taghaidh mi na subnets anns a bheil ùidh agam

tmp = re.search(r'^%sS*' % subnet_search, route_list[i])

Tro IPNetwork, am modal netaddr, gheibh mi subnets ann an cruth liosta de sheòlaidhean ipv4

range_subnet = netaddr.IPNetwork(tmp.group(0))

A’ cleachdadh IPNetwork, bidh mi a’ faighinn raon de sheòlaidhean bho lìonra a chaidh a-steach don neach-cleachdaidh le masg agus a’ gineadh liosta de na seòlaidhean uile bhon raon seo airson coimeas a dhèanamh ris an liosta de sheòlaidhean còmhnaidh.

for i in set(net_list).difference(set(busyip)):
        freeip.append(i)

Bidh mi a’ taisbeanadh an liosta de sheòlaidhean an-asgaidh a thig às ann an cruth subnets

print(netaddr.IPSet(freeip))

Gu h-ìosal tha an sgriobt iomlan, air a dhearbhadh air suidsichean air an cleachdadh mar router, modalan 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

Cuir beachd ann