Junos PyEZ uchishandisa muenzaniso webasa rekutsvaga emahara ipv4 subnets

Chinyorwa nezve kushanda naJunos PyEZ - "Python microframework inoita kuti iwe ugone kubata uye otomatiki zvishandiso zvinomhanyisa Junos OS" otomatiki uye manejimendi, zvese zvatinoda. Kunyora script inotsanangurwa muchinyorwa ichi yaive nezvinangwa zvakati - kudzidza Python uye otomatiki mabasa ekuunganidza ruzivo kana kushandura masisitimu pamidziyo inoshandisa Junos OS. Sarudzo yeiyi chaiyo musanganiswa wePython + Junos PyEZ yakaitwa nekuda kweiyo yakaderera chipingamupinyi chekupinda muPython programming mutauro uye nyore kushandisa Junos PyEZ raibhurari, iyo isingade ruzivo rwenyanzvi yeJunos OS.

Basa

Kuongororwa kwemahara ipv4 subnets yekambani. Chiyero chekuti subnet yakasununguka kusavapo kwekupinda nezvayo mumigwagwa painochinja ichiita se router inomhanya Junos OS.

Kutevedzera

Python + Junos PyEZ, kunyangwe pakanga paine muedzo wekuzviita kuburikidza neparamiko uye ssh.exec_command, Nekuda kweizvozvo, iwe unozofanirwa kugadzirisa iyo netconf mudziyo network manejimendi protocol pamidziyo iri kuvhoterwa. Netconf inoshanda nehardware kuburikidza nekure nzira yekufona RPC uye inoshandisa XML, mumuenzaniso uyu, kupa ruzivo rwainogamuchira.

Kuisa iyo yazvino vhezheni yeJunos PyEZ kubva kuPyPI kunoitwa nemurairo unotevera:

$ pip install junos-eznc

Iwe unogona zvakare kuisa kubva kubazi guru repurojekiti paGitHub nemurairo unotevera:

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

Uye imwezve sarudzo kuburikidza

$ pip install -r requirements.txt 

Uyu murairo uchaisa maraibhurari ayo asipo kubva kuhurongwa uye anodiwa pakushanda. Mushanduro yangu zvinodiwa.txt Pane maviri chete azvo, iwo achangoburwa vhezheni anoratidzwa panguva yekunyora script:

junos-eznc
netaddr

Nekumisikidza, iyo script inotora zita remushandisi aripo muhurongwa; unogona kupinda pasi pezita remumwe mushandisi uchishandisa show_route.py -u kiyi. getpass.getpass inotora password kubva stdin kuti password isarambe iri muhurongwa. Kuti ubatanidze kumidziyo, iwe unozofanirwawo kuisa zita rayo rekutambira kana IP kero kana wakurudzirwa. Yese data inodiwa pakubvumidzwa pane mudziyo yakagamuchirwa.

Junos PyEZ inotsigira kubatanidza kumidziyo inoshandisa Junos OS uchishandisa koni, telnet kana netconf kuburikidza nessh. Chinyorwa chinokurukura sarudzo yekupedzisira.

Kuti ubatanidze kune midziyo, shandisa Dhidhiyo kirasi yejnpr.junos module

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

Chikumbiro chinoitwa kune ese nzira dzinozivikanwa kune router kuburikidza nekure nzira yekufona kana kure kure maitiro ekufona, chero ipi iri nyore.

data = dev.rpc.get_route_information()

Murairo wakafanana paJunos OS

user@router> show route | display xml

Nekuwedzera rpc kusvika kumagumo emurairo, tinowana chikwata chekukumbira uye tinogona kuchifananidza nezita reRPC nzira, nenzira iyi tinogona kuwana mamwe mazita ekufarira. Izvo zvakakosha kucherechedza kuti iyo syntax yekunyora iyo yekukumbira tag yakasiyana nezita renzira, kureva, iwe unofanirwa kutsiva ma hyphens nema underscores.

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

Chimwe chikamu chacho chakaputirwa nechinguva chiduku, kuitira kuti usadzokorora chikumbiro kune router kana zvaive zvakakodzera kutarisa mune imwe subnet kubva kune iyo router inotoziva nezvayo. Zvakakodzera kutaura kuti router pandiri kuita chikumbiro inoziva nzira chete kuburikidza neOSPF, saka kune kumucheto router zviri nani kushandura chikumbiro zvishoma kuderedza script nguva yekumhanya.

data = dev.rpc.get_ospf_route_information()

Zvino ngatitarisei zviri mukati menguva loop

Pakutanga, mushandisi achakumbirwa kuti apinde mu subnet ane mask uye asingasviki matatu octets kubva kunetiweki yeiyo subnet imwe chete, izvi zvinodikanwa kuti uise huwandu hwekutsvaga. Ini handisi kunyatsoda kuita uku kutsanangura maitiro uye huwandu hwekutsvaga, asi kusvika zvino handisati ndawana mhinduro iri nani. Tevere, kubva pane inokonzeresa rondedzero ye subnets route_list, ndichishandisa shanduko isina anopfuura matatu octets, ini ndinosarudza ma subnets anondifarira.

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

Kuburikidza neIPNetwork, iyo netaddr module, ini ndinogashira subnets muchimiro cherondedzero yepv4 kero.

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

Ndichishandisa IPNetwork, ndinowana huwandu hwekero kubva kune mushandisi-yakapinda netiweki ine mask uye ndinoburitsa rondedzero yemakero ese kubva pane ino renji kuti ndienzanise nerondedzero yemakero akagarwa.

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

Ini ndinoratidza rondedzero inobuda yemakero emahara muchimiro che subnets

print(netaddr.IPSet(freeip))

Pazasi pane script yakazara, yakaedzwa pama switch anoshandiswa se router, modhi 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

Voeg