Junos PyEZ ni lilo apẹẹrẹ iṣẹ-ṣiṣe ti wiwa fun awọn subnets ipv4 ọfẹ

Nkan kan nipa ṣiṣẹ pẹlu Junos PyEZ - “Python microframework ti o fun ọ laaye lati ṣakoso ati adaṣe awọn ẹrọ ti n ṣiṣẹ Junos OS” adaṣe ati iṣakoso, ohun gbogbo ti a nifẹ. Kikọ iwe afọwọkọ ti a ṣalaye ninu nkan yii ni awọn ibi-afẹde pupọ - kikọ Python ati adaṣe awọn iṣẹ ṣiṣe fun gbigba alaye tabi yiyipada awọn atunto lori ohun elo nṣiṣẹ Junos OS. Yiyan apapo kan pato ti Python + Junos PyEZ ni a ṣe nitori idiwọ kekere si titẹsi sinu ede siseto Python ati irọrun ti lilo ile-ikawe Junos PyEZ, eyiti ko nilo imọ-iwé ti Junos OS.

Nkan

Ṣiṣayẹwo awọn subnets ipv4 ọfẹ ti o jẹ ti ile-iṣẹ naa. Apejuwe ti subnet jẹ ọfẹ ni isansa ti titẹsi nipa rẹ ni awọn ipa-ọna lori iyipada ti n ṣiṣẹ bi olulana ti n ṣiṣẹ Junos OS.

Imuse

Python + Junos PyEZ, botilẹjẹpe idanwo kan wa lati ṣe nipasẹ paramiko ati ssh.exec_command, Bi abajade, iwọ yoo nilo lati tunto ilana iṣakoso nẹtiwọọki ẹrọ netconf lori ohun elo ti n dibo. Netconf n ṣiṣẹ pẹlu ohun elo nipasẹ ilana isakoṣo latọna jijin pe RPC ati lo XML, ninu apẹẹrẹ yii, lati pese alaye ti o gba.

Fifi ẹya ti isiyi ti Junos PyEZ lati PyPI ṣe pẹlu aṣẹ atẹle:

$ pip install junos-eznc

O tun le fi sii lati ẹka akọkọ ti iṣẹ akanṣe lori GitHub pẹlu aṣẹ atẹle:

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

Ati ọkan diẹ aṣayan nipasẹ

$ pip install -r requirements.txt 

Aṣẹ yii yoo fi awọn ile-ikawe sori ẹrọ ti o nsọnu lati inu eto ati pe o jẹ pataki fun iṣẹ. Ninu ẹya mi awọn ibeere.txt Meji nikan lo wa, awọn ẹya tuntun jẹ itọkasi ni akoko kikọ iwe afọwọkọ naa:

junos-eznc
netaddr

Nipa aiyipada, iwe afọwọkọ gba orukọ olumulo lọwọlọwọ ninu eto; o le wọle labẹ orukọ olumulo miiran nipa lilo bọtini show_route.py -u getpass.getpass gba ọrọ igbaniwọle lati stdin nitorina ọrọ igbaniwọle kii yoo wa ninu eto naa. Lati sopọ si ẹrọ naa, iwọ yoo tun nilo lati tẹ orukọ olupin rẹ sii tabi adiresi IP nigbati o ba ṣetan. Gbogbo data pataki fun aṣẹ lori ẹrọ ti gba.

Junos PyEZ ṣe atilẹyin sisopọ si ohun elo ti nṣiṣẹ Junos OS nipa lilo console, telnet tabi netconf nipasẹ ssh. Nkan naa sọrọ lori aṣayan igbehin.

Lati sopọ si ohun elo, lo kilasi ẹrọ ti module jnpr.junos

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

A ṣe ibeere fun gbogbo awọn ipa-ọna ti a mọ si olulana nipasẹ ipe ilana latọna jijin tabi ipe ilana latọna jijin, eyikeyi ti o rọrun diẹ sii.

data = dev.rpc.get_route_information()

Iru aṣẹ lori Junos OS

user@router> show route | display xml

Nipa fifi rpc kun si opin aṣẹ naa, a gba aami ibeere ati pe o le baamu pẹlu orukọ ọna RPC, ni ọna yii a le wa awọn orukọ miiran ti iwulo. O tọ lati ṣe akiyesi pe sintasi fun kikọ aami ibeere yatọ si orukọ ọna, eyun, o yẹ ki o rọpo awọn hyphens pẹlu awọn abẹlẹ.

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

Iyoku apakan ni a we ni lupu igba diẹ, ki o má ba tun ibeere naa ṣe si olulana ti o ba jẹ dandan lati ṣayẹwo ni subnet miiran lati ọdọ awọn ti olulana ti mọ tẹlẹ. O tọ lati darukọ pe olulana lori eyiti Mo n ṣe ibeere naa mọ awọn ipa-ọna nikan nipasẹ OSPF, nitorinaa fun olulana eti o dara lati yi ibeere naa pada diẹ lati dinku akoko ṣiṣe iwe afọwọkọ naa.

data = dev.rpc.get_ospf_route_information()

Bayi jẹ ki ká wo ni awọn awọn akoonu ti awọn nigba ti lupu

Ni ibẹrẹ, olumulo yoo beere lati tẹ subnet kan pẹlu iboju-boju ati pe ko ju awọn octets mẹta lọ lati inu nẹtiwọọki ti subnet kanna, eyi jẹ pataki lati ṣeto ibiti wiwa. Emi ko fẹran imuse yii gaan ti sisọ awọn iyasọtọ ati ibiti wiwa, ṣugbọn titi di isisiyi Emi ko rii ojutu ti o dara julọ. Nigbamii, lati atokọ abajade ti awọn subnets route_list, ni lilo oniyipada ti ko ni diẹ sii ju awọn octets mẹta, Mo yan awọn subnets ti o nifẹ si mi

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

Nipasẹ IPNetwork, module netaddr, Mo gba awọn subnets ni irisi atokọ ti awọn adirẹsi ipv4

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

Lilo IPNetwork, Mo gba ọpọlọpọ awọn adirẹsi lati ọdọ olumulo ti nwọle pẹlu iboju-boju ati ṣe agbekalẹ atokọ ti gbogbo awọn adirẹsi lati ibiti o wa fun lafiwe pẹlu atokọ ti awọn adirẹsi ti o tẹdo.

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

Mo ṣafihan atokọ abajade ti awọn adirẹsi ọfẹ ni irisi awọn subnets

print(netaddr.IPSet(freeip))

Ni isalẹ ni iwe afọwọkọ pipe, idanwo lori awọn iyipada ti a lo bi olulana, awọn awoṣe 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

orisun: www.habr.com

Fi ọrọìwòye kun