Junos PyEZ siv qhov piv txwv ntawm txoj haujlwm ntawm kev tshawb nrhiav dawb ipv4 subnets

Ib tsab xov xwm hais txog kev ua haujlwm nrog Junos PyEZ - "Python microframework uas tso cai rau koj los tswj thiab ua kom cov khoom siv khiav Junos OS" automation thiab tswj, txhua yam peb nyiam. Sau tsab ntawv uas tau piav qhia hauv kab lus no muaj ntau lub hom phiaj - kawm Python thiab ua haujlwm ua haujlwm rau kev sau cov ntaub ntawv lossis hloov kev teeb tsa ntawm cov cuab yeej siv Junos OS. Qhov kev xaiv ntawm qhov kev sib xyaw tshwj xeeb ntawm Python + Junos PyEZ tau tsim los vim qhov teeb meem qis rau kev nkag mus rau Python programming lus thiab kev yooj yim ntawm kev siv lub tsev qiv ntawv Junos PyEZ, uas tsis tas yuav muaj kev paub txog Junos OS.

Hom phiaj

Kev kuaj xyuas dawb ipv4 subnets uas yog lub tuam txhab. Cov txheej txheem uas lub subnet tsis pub dawb yog qhov tsis muaj qhov nkag ntawm nws hauv txoj hauv kev ntawm kev hloov ua lub router khiav Junos OS.

Kev siv

Python + Junos PyEZ, txawm hais tias muaj kev sim siab ua los ntawm paramiko thiab ssh.exec_command, Yog li ntawd, koj yuav tsum tau teeb tsa lub netconf ntaus ntawv network tswj raws tu qauv ntawm cov cuab yeej raug xaiv. Netconf ua haujlwm nrog kho vajtse ntawm cov txheej txheem chaw taws teeb hu RPC thiab siv XML, hauv qhov piv txwv no, muab cov ntaub ntawv nws tau txais.

Txhim kho qhov tam sim no version ntawm Junos PyEZ los ntawm PyPI yog ua tiav nrog cov lus txib hauv qab no:

$ pip install junos-eznc

Koj tuaj yeem nruab los ntawm cov ceg tseem ceeb ntawm qhov project ntawm GitHub nrog cov lus txib hauv qab no:

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

Thiab ib qho kev xaiv ntxiv ntawm

$ pip install -r requirements.txt 

Cov lus txib no yuav nruab cov tsev qiv ntawv uas ploj lawm ntawm lub kaw lus thiab tsim nyog rau kev ua haujlwm. Hauv kuv version tsuav .txt Tsuas muaj ob ntawm lawv, qhov tseeb versions tau qhia thaum lub sijhawm sau tsab ntawv:

junos-eznc
netaddr

Los ntawm lub neej ntawd, tsab ntawv yuav siv lub npe ntawm tus neeg siv tam sim no hauv lub kaw lus; koj tuaj yeem nkag rau hauv qab lub npe ntawm lwm tus neeg siv siv tus yuam sij show_route.py -u getpass.getpass siv tus password los ntawm stdin yog li tus password yuav tsis nyob hauv qhov system. Txhawm rau txuas mus rau cov cuab yeej siv, koj tseem yuav tau nkag mus rau nws lub npe hostname lossis IP chaw nyob thaum raug ceeb toom. Tag nrho cov ntaub ntawv tsim nyog rau kev tso cai ntawm lub cuab yeej tau txais.

Junos PyEZ txhawb kev txuas mus rau cov cuab yeej siv Junos OS siv lub console, telnet lossis netconf ntawm ssh. Kab lus tham txog qhov kev xaiv tom kawg.

Txhawm rau txuas mus rau cov cuab yeej siv, siv chav kawm ntaus ntawv ntawm jnpr.junos module

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

Kev thov yog tsim rau txhua txoj hauv kev paub txog lub router ntawm cov txheej txheem hu xov tooj lossis cov txheej txheem chaw taws teeb hu, qhov twg yog qhov yooj yim dua.

data = dev.rpc.get_route_information()

Cov lus txib zoo sib xws ntawm Junos OS

user@router> show route | display xml

Los ntawm kev ntxiv rpc mus rau qhov kawg ntawm cov lus txib, peb tau txais daim ntawv thov thiab tuaj yeem phim nrog lub npe ntawm RPC txoj kev, nyob rau hauv txoj kev no peb tuaj yeem nrhiav lwm lub npe txaus siab. Nws yog tsim nyog sau cia hais tias cov syntax rau kev sau daim ntawv thov yog txawv ntawm txoj kev lub npe, uas yog, koj yuav tsum hloov cov hyphens nrog underscores.

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

Cov seem ntawm qhov tau qhwv nyob rau hauv ib lub voj voog, thiaj li tsis rov hais dua qhov kev thov rau lub router yog tias nws yuav tsum tau mus xyuas lwm lub subnet los ntawm cov uas router twb paub txog. Nws yog ib qho tsim nyog hais tias lub router uas kuv tab tom ua qhov kev thov paub txoj kev tsuas yog los ntawm OSPF, yog li rau lub router ntug nws yog qhov zoo dua los hloov qhov kev thov me ntsis kom txo cov ntawv sau sijhawm.

data = dev.rpc.get_ospf_route_information()

Tam sim no cia saib cov ntsiab lus ntawm lub voj voog

Thaum pib, tus neeg siv yuav raug nug kom nkag mus rau lub subnet nrog lub npog ntsej muag thiab tsis pub ntau tshaj peb octets los ntawm lub network ntawm tib lub subnet, qhov no yog qhov tsim nyog los teeb tsa cov kev tshawb fawb ntau. Kuv tsis tshua nyiam qhov kev siv ntawm kev qhia meej cov qauv thiab kev tshawb nrhiav ntau yam, tab sis txog tam sim no kuv tsis tau pom qhov kev daws teeb meem zoo dua. Tom ntej no, los ntawm cov npe tshwm sim ntawm subnets route_list, siv qhov sib txawv uas tsis muaj ntau tshaj peb octets, kuv xaiv cov subnets uas kuv nyiam.

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

Los ntawm IPNetwork, netaddr module, Kuv tau txais subnets hauv daim ntawv teev npe ntawm ipv4 chaw nyob

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

Siv IPNetwork, Kuv tau txais ntau qhov chaw nyob los ntawm cov neeg siv nkag mus hauv lub network nrog lub npog ntsej muag thiab tsim cov npe ntawm txhua qhov chaw nyob los ntawm ntau qhov no rau kev sib piv nrog cov npe ntawm cov chaw nyob.

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

Kuv tso saib cov npe ntawm cov chaw nyob dawb nyob rau hauv daim ntawv ntawm subnets

print(netaddr.IPSet(freeip))

Hauv qab no yog cov ntawv ua tiav, kuaj ntawm cov keyboards siv los ua router, qauv 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

Tau qhov twg los: www.hab.com

Ntxiv ib saib