ʻO Junos PyEZ e hoʻohana ana i ka laʻana o ka hana o ka ʻimi ʻana i nā subnets ipv4 manuahi

He ʻatikala e pili ana i ka hana pū ʻana me Junos PyEZ - "Python microframework e hiki ai iā ʻoe ke hoʻokele a hoʻokaʻawale i nā polokalamu e holo ana iā Junos OS" automation a me ka hoʻokele, nā mea āpau a mākou e aloha ai. ʻO ke kākau ʻana i ka ʻatikala i wehewehe ʻia ma kēia ʻatikala he nui nā pahuhopu - ke aʻo ʻana i ka Python a me nā hana automating no ka hōʻiliʻili ʻana i ka ʻike a i ʻole ka hoʻololi ʻana i nā hoʻonohonoho i nā mea hana e holo ana iā Junos OS. ʻO ke koho ʻana o kēia hui pū ʻana o Python + Junos PyEZ i hana ʻia ma muli o ka haʻahaʻa haʻahaʻa o ke komo ʻana i ka ʻōlelo papahana Python a me ka maʻalahi o ka hoʻohana ʻana i ka waihona Junos PyEZ, ʻaʻole pono ka ʻike loea o Junos OS.

Nń Pahuhopu

Hooia o ka ipv4 subnets no ka hui. ʻO ke kumu no ka manuahi ʻole o ka subnet ʻo ia ka nele o kahi komo e pili ana iā ia ma nā ala o ka hoʻololi e hana nei ma ke ʻano he alaala e holo ana iā Junos OS.

Ka hoʻokō

ʻO Python + Junos PyEZ, ʻoiai aia kahi hoʻowalewale e hana ma o paramiko a me ssh.exec_command, ʻO ka hopena, pono ʻoe e hoʻonohonoho i ka protocol hoʻokele pūnaewele netconf ma nā mea hana e koho ʻia. Hana ʻo Netconf me ka lako ma o ke kaʻina hana mamao e kāhea iā RPC a hoʻohana iā XML, i kēia laʻana, e hāʻawi i ka ʻike i loaʻa iā ia.

Hoʻokomo ʻia ka mana o Junos PyEZ mai PyPI me kēia kauoha:

$ pip install junos-eznc

Hiki iā ʻoe ke hoʻouka mai ka lālā nui o ka papahana ma GitHub me kēia kauoha:

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

A hoʻokahi koho hou aku ma o

$ pip install -r requirements.txt 

Na kēia kauoha e hoʻokomo i nā hale waihona puke i nalowale mai ka ʻōnaehana a pono no ka hana. Ma kaʻu mana koi.txt ʻElua wale nō o lākou, hōʻike ʻia nā mana hou loa i ka manawa e kākau ai i ka palapala:

junos-eznc
netaddr

Ma ka maʻamau, lawe ka palapala i ka inoa o ka mea hoʻohana i kēia manawa i ka ʻōnaehana; hiki iā ʻoe ke komo ma lalo o ka inoa o kekahi mea hoʻohana e hoʻohana ana i ke kī show_route.py -u Lawe ʻo getpass.getpass i ka ʻōlelo huna mai stdin no laila ʻaʻole e noho ka ʻōlelo huna i ka ʻōnaehana. No ka hoʻopili ʻana i ka lako, pono ʻoe e hoʻokomo i kona inoa host a i ʻole IP address ke koi ʻia. Ua loaʻa nā ʻikepili a pau e pono ai no ka ʻae ʻana ma ka hāmeʻa.

Kākoʻo ʻo Junos PyEZ i ka hoʻopili ʻana i nā mea hana e holo ana iā Junos OS me ka hoʻohana ʻana i ka console, telnet a i ʻole netconf ma o ssh. Kūkākūkā ka ʻatikala i ke koho hope.

No ka hoʻohui ʻana i nā mea hana, e hoʻohana i ka papa Device o ka module jnpr.junos

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

Hana ʻia kahi noi no nā ala āpau i ʻike ʻia e ke alalai ma o ke kelepona kaʻina hana mamao a i ʻole kelepona kaʻina hana mamao, ʻo ia ka mea maʻalahi.

data = dev.rpc.get_route_information()

Kauoha like ma Junos OS

user@router> show route | display xml

Ma ka hoʻohui ʻana i ka rpc i ka hope o ke kauoha, loaʻa iā mākou kahi inoa noi a hiki ke hoʻohālikelike iā ia me ka inoa o ke ʻano RPC, ma kēia ala hiki iā mākou ke ʻike i nā inoa hoihoi. Pono e hoʻomaopopo he ʻokoʻa ka syntax no ke kākau ʻana i ka inoa noi mai ka inoa ʻano, ʻo ia hoʻi, pono ʻoe e hoʻololi i nā hyphens me nā underscores.

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

Ua uhi ʻia ke koena o ka ʻāpana i kahi loop loop, i ʻole e hoʻihoʻi hou i ka noi i ke alalai inā pono e nānā i kahi subnet ʻē aʻe mai nā mea i ʻike mua ʻia e ka mea ala. He mea kūpono ke haʻi aku ʻo ka mea alalai kahi aʻu e noi ai e ʻike i nā ala ma o OSPF wale nō, no laila, no ka mea ala ala ʻoi aku ka maikaʻi e hoʻololi iki i ka noi e hōʻemi i ka manawa holo o ka palapala.

data = dev.rpc.get_ospf_route_information()

I kēia manawa, e nānā kākou i nā mea o ka loop while

I ka hoʻomaka, e noi ʻia ka mea hoʻohana e komo i kahi subnet me kahi mask a ʻaʻole ʻoi aku ma mua o ʻekolu octets mai ka pūnaewele o ka subnet hoʻokahi, pono kēia e hoʻonohonoho i ka pae ʻimi. ʻAʻole makemake nui wau i kēia hoʻokō ʻana i ka wehewehe ʻana i nā pae hoʻohālike a me ka laulā ʻimi, akā i kēia manawa ʻaʻole wau i ʻike i kahi hopena maikaʻi aʻe. Ma hope aʻe, mai ka papa inoa o nā subnets route_list, me ka hoʻohana ʻana i kahi ʻano ʻokoʻa ʻaʻole i ʻoi aku ma mua o ʻekolu octets, koho wau i nā subnets e hoihoi iaʻu.

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

Ma o IPNetwork, ka module netaddr, loaʻa iaʻu nā subnets ma ke ʻano o kahi papa inoa o nā helu ipv4

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

Ke hoʻohana nei i ka IPNetwork, loaʻa iaʻu kahi ʻano o nā helu wahi mai kahi pūnaewele i hoʻokomo ʻia e ka mea hoʻohana me kahi mask a hoʻopuka i kahi papa inoa o nā helu helu āpau mai kēia pae no ka hoʻohālikelike ʻana me ka papa inoa o nā wahi i noho ʻia.

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

Hōʻike wau i ka papa inoa o nā helu manuahi ma ke ʻano o nā subnets

print(netaddr.IPSet(freeip))

Aia ma lalo ka palapala piha, hoʻāʻo ʻia i nā hoʻololi i hoʻohana ʻia ma ke ʻano he alaala, nā hiʻohiʻona 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

Pākuʻi i ka manaʻo hoʻopuka