Junos PyEZ mampiasa ny ohatry ny asa fitadiavana subnets ipv4 maimaim-poana

Lahatsoratra momba ny fiaraha-miasa amin'i Junos PyEZ - "Mikroframework Python izay ahafahanao mitantana sy manao automatique ny fitaovana mandeha amin'ny automatique sy fitantanana Junos OS", izay rehetra tiantsika. Ny fanoratana ny script voalaza ato amin'ity lahatsoratra ity dia nanana tanjona maromaro - ny fianarana Python sy ny asa automatique amin'ny fanangonana vaovao na ny fanovana ny fanamafisana amin'ny fitaovana mandeha amin'ny Junos OS. Ny safidy amin'ity fitambarana manokana amin'ny Python + Junos PyEZ ity dia natao noho ny sakana ambany amin'ny fidirana amin'ny fiteny fandaharana Python sy ny fanamorana ny fampiasana ny tranomboky Junos PyEZ, izay tsy mitaky fahalalana manam-pahaizana momba ny Junos OS.

asa

Fanamarinana ny subnets ipv4 maimaim-poana an'ny orinasa. Ny fepetra fa maimaim-poana ny subnet dia ny tsy fisian'ny fidirana momba izany amin'ny lalana eo amin'ny switch miasa toy ny router mandeha amin'ny Junos OS.

fanatanterahana

Python + Junos PyEZ, na dia nisy aza ny fakam-panahy hanao izany amin'ny alàlan'ny paramiko sy ssh.exec_command, Vokatr'izany dia mila manitsy ny protocole fitantanana ny tambazotran'ny fitaovana netconf ianao amin'ny fitaovana dinihina. Netconf dia miasa miaraka amin'ny fitaovana amin'ny alàlan'ny antso an-tariby RPC ary mampiasa XML, amin'ity ohatra ity, mba hanomezana ny fampahalalana azony.

Ny fametrahana ny Junos PyEZ amin'izao fotoana izao avy amin'ny PyPI dia vita amin'ny baiko manaraka:

$ pip install junos-eznc

Azonao atao koa ny mametraka avy amin'ny sampana lehibe amin'ny tetikasa amin'ny GitHub miaraka amin'ity baiko manaraka ity:

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

Ary safidy iray hafa amin'ny alàlan'ny

$ pip install -r requirements.txt 

Ity baiko ity dia hametraka tranomboky tsy hita ao amin'ny rafitra ary ilaina amin'ny fandidiana. Amin'ny dikan-tenyko fitakiana.txt Tsy misy afa-tsy roa amin'izy ireo, ny dikan-teny farany dia aseho amin'ny fotoana hanoratana ny script:

junos-eznc
netaddr

Amin'ny alàlan'ny default, ny script dia maka ny anaran'ny mpampiasa amin'izao fotoana izao ao amin'ny rafitra; azonao atao ny miditra amin'ny anaran'ny mpampiasa hafa amin'ny fampiasana ny famaha show_route.py -u getpass.getpass dia maka ny tenimiafina avy amin'ny stdin mba tsy hijanona ao amin'ny rafitra ny tenimiafina. Raha te hifandray amin'ny fitaovana dia mila mampiditra ny anaran'ny mpampiantrano na ny adiresy IP anao koa ianao rehefa asaina. Ny angona rehetra ilaina amin'ny fanomezan-dàlana amin'ny fitaovana dia efa voaray.

Junos PyEZ dia manohana ny fifandraisana amin'ny fitaovana mandeha amin'ny Junos OS amin'ny alàlan'ny console, telnet na netconf amin'ny ssh. Ny lahatsoratra dia miresaka momba ny safidy farany.

Raha te hifandray amin'ny fitaovana dia ampiasao ny kilasin'ny fitaovana amin'ny môdely jnpr.junos

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

Ny fangatahana dia natao ho an'ny lalana rehetra fantatry ny router amin'ny alàlan'ny antso an-tariby lavitra na antso an-tariby lavitra, izay mety kokoa.

data = dev.rpc.get_route_information()

Baiko mitovy amin'ny Junos OS

user@router> show route | display xml

Amin'ny fampidirana rpc amin'ny faran'ny baiko dia mahazo marika fangatahana isika ary afaka mampifanaraka azy amin'ny anaran'ny fomba RPC, amin'izany fomba izany dia afaka mahita anarana hafa mahaliana isika. Tsara ny manamarika fa ny syntax amin'ny fanoratana ny tenifototra fangatahana dia tsy mitovy amin'ny anaran'ny fomba, izany hoe, tokony hosoloinao amin'ny underscore ny tsipika.

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

Ny ambiny amin'ny ampahany dia nofonosina tao anaty loop kely, mba tsy hamerenana ny fangatahana amin'ny router raha ilaina ny mijery subnet hafa amin'ireo izay efa fantatry ny router. Tsara ny manamarika fa ny router izay ananako ny fangatahana dia tsy mahalala lalana afa-tsy amin'ny OSPF, noho izany ho an'ny router sisiny dia tsara kokoa ny manova kely ny fangatahana mba hampihenana ny fotoana fandehan'ny script.

data = dev.rpc.get_ospf_route_information()

Andeha hojerentsika izao ny votoatin'ny while loop

Amin'ny voalohany, ny mpampiasa dia asaina miditra amin'ny subnet miaraka amin'ny saron-tava ary tsy mihoatra ny telo octets avy amin'ny tambajotra amin'ny subnet iray ihany, ilaina ny mametraka ny fikarohana. Tsy dia tiako loatra ity fampiharana ity amin'ny famaritana ny fepetra sy ny fikarohana, saingy hatramin'izao dia tsy nahita vahaolana tsara kokoa aho. Avy eo, avy amin'ny lisitry ny subnets route_list, amin'ny fampiasana fari-pitsipika misy octets tsy mihoatra ny telo, dia misafidy ny subnets mahaliana ahy aho.

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

Amin'ny alàlan'ny IPNetwork, ny module netaddr, dia mahazo subnets amin'ny endrika lisitry ny adiresy ipv4 aho

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

Amin'ny fampiasana IPNetwork, mahazo adiresy isan-karazany avy amin'ny tamba-jotra nampidirin'ny mpampiasa miaraka amin'ny saron-tava aho ary mamorona lisitr'ireo adiresy rehetra avy amin'ity sehatra ity mba hampitahaina amin'ny lisitry ny adiresy misy.

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

Asehoko ny lisitry ny adiresy maimaim-poana amin'ny endrika subnets

print(netaddr.IPSet(freeip))

Ity ambany ity ny script feno, notsapaina tamin'ny switch ampiasaina ho router, modely 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

Add a comment