Junos PyEZ duke përdorur shembullin e detyrës për të kërkuar nënrrjeta falas ipv4

Një artikull rreth punës me Junos PyEZ - "Mikrokorniza Python që ju mundëson të menaxhoni dhe automatizoni pajisjet që përdorin automatizimin dhe menaxhimin e Junos OS", gjithçka që duam. Shkrimi i skriptit të përshkruar në këtë artikull kishte disa qëllime - mësimin e Python dhe automatizimin e detyrave për mbledhjen e informacionit ose ndryshimin e konfigurimeve në pajisjet që funksionojnë Junos OS. Zgjedhja e këtij kombinimi specifik të Python + Junos PyEZ u bë për shkak të pengesës së ulët për hyrjen në gjuhën e programimit Python dhe lehtësisë së përdorimit të bibliotekës Junos PyEZ, e cila nuk kërkon njohuri eksperte të Junos OS.

Detyrë

Auditimi i nën-rrjeteve falas ipv4 që i përkasin kompanisë. Kriteri që një nënrrjet është i lirë është mungesa e një hyrjeje në lidhje me të në rrugët në ndërprerës që vepron si një ruter që ekzekuton Junos OS.

Zbatimi

Python + Junos PyEZ, megjithëse kishte një tundim për ta bërë atë përmes paramiko dhe ssh.exec_command, Si rezultat, do t'ju duhet të konfiguroni protokollin e menaxhimit të rrjetit të pajisjes netconf në pajisjen që po anketohet. Netconf punon me harduer përmes thirrjes së procedurës në distancë RPC dhe përdor XML, në këtë shembull, për të ofruar informacionin që merr.

Instalimi i versionit aktual të Junos PyEZ nga PyPI bëhet me komandën e mëposhtme:

$ pip install junos-eznc

Ju gjithashtu mund të instaloni nga dega kryesore e projektit në GitHub me komandën e mëposhtme:

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

Dhe një opsion tjetër nëpërmjet

$ pip install -r requirements.txt 

Kjo komandë do të instalojë bibliotekat që mungojnë nga sistemi dhe janë të nevojshme për funksionim. Në versionin tim kërkesat.txt Ka vetëm dy prej tyre, versionet më të fundit tregohen në kohën e shkrimit të skenarit:

junos-eznc
netaddr

Skripti si parazgjedhje merr emrin e përdoruesit aktual në sistem, mund të identifikoheni nën emrin e një përdoruesi tjetër duke përdorur tastin show_route.py -u getpass.getpass merr fjalëkalimin nga stdin kështu që fjalëkalimi nuk do të mbetet në sistem. Për t'u lidhur me pajisjen, do t'ju duhet gjithashtu të shkruani emrin e hostit ose adresën IP të tij kur të kërkohet. Të gjitha të dhënat e nevojshme për autorizimin në pajisje janë marrë.

Junos PyEZ mbështet lidhjen me pajisjet që funksionojnë Junos OS duke përdorur konsolën, telnet ose netconf nëpërmjet ssh. Artikulli diskuton opsionin e fundit.

Për t'u lidhur me pajisjet, përdorni klasën Device të modulit jnpr.junos

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

Bëhet një kërkesë për të gjitha rrugët e njohura për ruterin nëpërmjet thirrjes së procedurës në distancë ose thirrjes së procedurës në distancë, cilado që është më e përshtatshme.

data = dev.rpc.get_route_information()

Komandë e ngjashme në Junos OS

user@router> show route | display xml

Duke shtuar rpc në fund të komandës, marrim një etiketë kërkesë dhe mund ta përputhim me emrin e metodës RPC, në këtë mënyrë mund të zbulojmë emra të tjerë me interes. Vlen të përmendet se sintaksa për të shkruar etiketën e kërkesës është e ndryshme nga emri i metodës, përkatësisht, duhet të zëvendësoni vizat me vija nënvizore.

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

Pjesa tjetër e pjesës ishte e mbështjellë në një lak, në mënyrë që të mos përsëritej kërkesa për ruterin nëse ishte e nevojshme të kontrollohej në një nënrrjet tjetër nga ato për të cilat ruteri tashmë di. Vlen të përmendet se ruteri në të cilin po bëj kërkesën i njeh rrugët vetëm përmes OSPF, kështu që për një ruter skajor është më mirë ta ndryshoni pak kërkesën për të zvogëluar kohën e ekzekutimit të skriptit.

data = dev.rpc.get_ospf_route_information()

Tani le të shohim përmbajtjen e ciklit while

Në fillim, përdoruesit do t'i kërkohet të futë një nënrrjet me një maskë dhe jo më shumë se tre oktete nga rrjeti i të njëjtit nënrrjet, kjo është e nevojshme për të vendosur gamën e kërkimit. Nuk më pëlqen shumë ky zbatim i specifikimit të kritereve dhe gamës së kërkimit, por deri më tani nuk kam gjetur një zgjidhje më të mirë. Më pas, nga lista rezultuese e nënrrjeteve route_list, duke përdorur një variabël që përmban jo më shumë se tre oktete, unë zgjedh nënrrjetet që më interesojnë

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

Nëpërmjet IPNetwork, modulit netaddr, unë marr nënrrjeta në formën e një liste adresash ipv4

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

Duke përdorur IPNetwork, marr një sërë adresash nga një rrjet i futur nga përdoruesi me një maskë dhe gjeneroj një listë të të gjitha adresave nga ky varg për krahasim me listën e adresave të zëna.

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

Unë shfaq listën rezultuese të adresave të lira në formën e nënrrjeteve

print(netaddr.IPSet(freeip))

Më poshtë është skripti i plotë, i testuar në çelsat e përdorur si ruter, modelet 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

Burimi: www.habr.com

Shto një koment