Junos PyEZ kwa kutumia mfano wa kazi ya kutafuta subnets za ipv4 za bure

Makala kuhusu kufanya kazi na Junos PyEZ - "Python microframework ambayo hukuwezesha kudhibiti na kufanya otomatiki vifaa vinavyoendesha Junos OS" otomatiki na usimamizi, kila kitu tunachopenda. Kuandika hati iliyoelezewa katika nakala hii ilikuwa na malengo kadhaa - kujifunza Python na kazi za kiotomatiki za kukusanya habari au kubadilisha usanidi kwenye vifaa vinavyoendesha Junos OS. Uchaguzi wa mchanganyiko huu maalum wa Python + Junos PyEZ ulifanywa kutokana na kizuizi cha chini cha kuingia kwenye lugha ya programu ya Python na urahisi wa matumizi ya maktaba ya Junos PyEZ, ambayo hauhitaji ujuzi wa mtaalam wa Junos OS.

Kazi

Ukaguzi wa subnets za ipv4 za kampuni bila malipo. Kigezo kwamba subnet haina malipo ni kutokuwepo kwa ingizo kuihusu katika njia kwenye swichi inayofanya kazi kama kipanga njia kinachoendesha Junos OS.

Utekelezaji

Python + Junos PyEZ, ingawa kulikuwa na jaribu la kuifanya kupitia paramiko na ssh.exec_command, Kwa hivyo, utahitaji kusanidi itifaki ya usimamizi wa mtandao wa kifaa cha netconf kwenye kifaa kinachopigwa kura. Netconf hufanya kazi na maunzi kupitia utaratibu wa mbali piga simu kwa RPC na hutumia XML, katika mfano huu, kutoa taarifa inayopokea.

Kufunga toleo la sasa la Junos PyEZ kutoka PyPI hufanywa kwa amri ifuatayo:

$ pip install junos-eznc

Unaweza pia kusanikisha kutoka kwa tawi kuu la mradi kwenye GitHub na amri ifuatayo:

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

Na chaguo moja zaidi kupitia

$ pip install -r requirements.txt 

Amri hii itasakinisha maktaba ambazo hazipo kwenye mfumo na zinahitajika kwa uendeshaji. Katika toleo langu mahitaji.txt Kuna mbili tu kati yao, matoleo ya hivi karibuni yanaonyeshwa wakati wa kuandika hati:

junos-eznc
netaddr

Hati kwa chaguomsingi huchukua jina la mtumiaji wa sasa kwenye mfumo, unaweza kuingia chini ya jina la mtumiaji mwingine kwa kutumia kitufe show_route.py -u getpass.getpass inachukua nenosiri kutoka kwa stdin ili nenosiri lisisaki. katika mfumo. Ili kuunganisha kwenye kifaa, utahitaji pia kuingiza jina la mwenyeji wake au anwani ya IP unapoombwa. Data yote muhimu kwa idhini kwenye kifaa imepokelewa.

Junos PyEZ inasaidia kuunganisha kwa vifaa vinavyoendesha Junos OS kwa kutumia dashibodi, telnet au netconf kupitia ssh. Nakala hiyo inajadili chaguo la mwisho.

Ili kuunganisha kwenye vifaa, tumia darasa la Kifaa cha moduli ya jnpr.junos

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

Ombi linafanywa kwa njia zote zinazojulikana kwa kipanga njia kupitia simu ya utaratibu wa mbali au simu ya utaratibu wa mbali, yoyote ambayo ni rahisi zaidi.

data = dev.rpc.get_route_information()

Amri sawa kwenye Junos OS

user@router> show route | display xml

Kwa kuongeza rpc hadi mwisho wa amri, tunapata lebo ya ombi na tunaweza kuifananisha na jina la njia ya RPC, kwa njia hii tunaweza kujua majina mengine ya kupendeza. Inafaa kumbuka kuwa syntax ya kuandika lebo ya ombi ni tofauti na jina la njia, ambayo ni, unapaswa kuchukua nafasi ya hyphens na underscores.

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

Sehemu iliyobaki ilikuwa imefungwa kwa kitanzi cha muda, ili usirudia ombi kwa router ikiwa ilikuwa ni lazima kuangalia kwenye subnet nyingine kutoka kwa wale ambao router tayari inajua. Ni muhimu kutaja kwamba router ambayo ninafanya ombi inajua njia tu kupitia OSPF, hivyo kwa router ya makali ni bora kubadilisha ombi kidogo ili kupunguza muda wa uendeshaji wa script.

data = dev.rpc.get_ospf_route_information()

Sasa hebu tuangalie yaliyomo kwenye kitanzi cha wakati

Mwanzoni, mtumiaji ataulizwa kuingia kwenye subnet na mask na si zaidi ya octets tatu kutoka kwenye mtandao wa subnet sawa, hii ni muhimu kuweka safu ya utafutaji. Sipendi sana utekelezaji huu wa kutaja vigezo na anuwai ya utaftaji, lakini hadi sasa sijapata suluhisho bora. Ifuatayo, kutoka kwa orodha inayotokana ya subnets route_list, kwa kutumia kigezo kisichozidi oktet tatu, mimi huchagua subnets ambazo zinanivutia.

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

Kupitia IPNetwork, moduli ya netaddr, ninapokea subnets katika mfumo wa orodha ya anwani za ipv4.

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

Kwa kutumia IPNetwork, ninapata anuwai ya anwani kutoka kwa mtandao uliowekwa na mtumiaji na kinyago na kutoa orodha ya anwani zote kutoka safu hii kwa kulinganisha na orodha ya anwani zinazochukuliwa.

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

Ninaonyesha orodha inayotokana ya anwani za bure katika mfumo wa subnets

print(netaddr.IPSet(freeip))

Ifuatayo ni hati kamili, iliyojaribiwa kwenye swichi zinazotumiwa kama kipanga njia, mifano 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

Chanzo: mapenzi.com

Kuongeza maoni