Junos PyEZ නොමිලේ ipv4 උපජාල සෙවීමේ කාර්යයේ උදාහරණය භාවිතා කරයි

Junos PyEZ සමඟ වැඩ කිරීම පිළිබඳ ලිපියක් - “Junos OS ධාවනය වන උපාංග කළමනාකරණය කිරීමට සහ ස්වයංක්‍රීය කිරීමට ඔබට හැකි Python microframework” ස්වයංක්‍රීයකරණය සහ කළමනාකරණය, අප ආදරය කරන සෑම දෙයක්ම. මෙම ලිපියේ විස්තර කර ඇති ස්ක්‍රිප්ට් ලිවීමට ඉලක්ක කිහිපයක් තිබුණි - පයිතන් ඉගෙනීම සහ ජූනෝස් ඕඑස් ධාවනය වන උපකරණවල තොරතුරු රැස් කිරීම හෝ වින්‍යාසය වෙනස් කිරීම සඳහා කාර්යයන් ස්වයංක්‍රීය කිරීම. Python + Junos PyEZ හි මෙම නිශ්චිත සංයෝජනය තෝරාගැනීම සිදු කරන ලද්දේ Python ක්‍රමලේඛන භාෂාවට ඇතුළු වීමට ඇති අඩු බාධක සහ Junos OS පිළිබඳ විශේෂඥ දැනුමක් අවශ්‍ය නොවන Junos PyEZ පුස්තකාලයේ පහසුව හේතුවෙනි.

අරමුණු

සමාගමට අයත් නොමිලේ ipv4 උපජාල විගණනය කිරීම. උපජාලයක් නොමිලේ යන නිර්ණායකය වන්නේ Junos OS ධාවනය වන රවුටරයක් ​​ලෙස ක්‍රියා කරන ස්විචයේ ඇති මාර්ගවල ඒ පිළිබඳව ඇතුළත් කිරීමක් නොමැති වීමයි.

Реализация

Python + Junos PyEZ, paramiko සහ ssh.exec_command හරහා එය කිරීමට පෙළඹවීමක් තිබුණද, එහි ප්‍රතිඵලයක් ලෙස, ඔබ විසින් ඡන්ද විමසන උපකරණ මත netconf උපාංග ජාල කළමනාකරණ ප්‍රොටෝකෝලය වින්‍යාස කිරීමට අවශ්‍ය වනු ඇත. Netconf දුරස්ථ ක්‍රියාපටිපාටිය ඇමතුම් RPC හරහා දෘඪාංග සමඟ ක්‍රියා කරන අතර එයට ලැබෙන තොරතුරු සැපයීම සඳහා XML භාවිතා කරයි.

PyPI වෙතින් Junos PyEZ හි වත්මන් අනුවාදය ස්ථාපනය කිරීම පහත විධානය සමඟ සිදු කෙරේ:

$ pip install junos-eznc

ඔබට පහත විධානය සමඟ GitHub හි ව්‍යාපෘතියේ ප්‍රධාන ශාඛාවෙන් ද ස්ථාපනය කළ හැකිය:

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

සහ හරහා තවත් එක් විකල්පයක්

$ pip install -r requirements.txt 

මෙම විධානය මඟින් පද්ධතියෙන් අතුරුදහන් වූ සහ ක්‍රියාත්මක වීමට අවශ්‍ය පුස්තකාල ස්ථාපනය කරනු ඇත. මගේ අනුවාදයේ අවශ්‍යතා. txt ඒවායින් දෙකක් පමණක් ඇත, නවතම අනුවාදයන් තිර රචනය ලියන අවස්ථාවේදී දක්වා ඇත:

junos-eznc
netaddr

පෙරනිමියෙන්, ස්ක්‍රිප්ටය පද්ධතියේ වත්මන් පරිශීලකයාගේ නම ගනී; ඔබට show_route.py -u යතුර භාවිතයෙන් වෙනත් පරිශීලකයෙකුගේ නමක් යටතේ ලොග් විය හැක. getpass.getpass මුරපදය stdin වෙතින් ලබා ගනී, එවිට මුරපදය පද්ධතිය තුළ නොපවතිනු ඇත. උපකරණ වෙත සම්බන්ධ වීමට, ඔබ විමසූ විට එහි සත්කාරක නාමය හෝ IP ලිපිනය ඇතුළත් කිරීමටද අවශ්‍ය වනු ඇත. උපාංගයේ අවසරය සඳහා අවශ්ය සියලු දත්ත ලැබී ඇත.

Junos PyEZ ssh හරහා කොන්සෝලය, telnet හෝ netconf භාවිතයෙන් Junos OS ධාවනය වන උපකරණ වෙත සම්බන්ධ වීමට සහාය දක්වයි. ලිපිය අවසාන විකල්පය සාකච්ඡා කරයි.

උපකරණ වෙත සම්බන්ධ වීමට, jnpr.junos මොඩියුලයේ උපාංග පන්තිය භාවිතා කරන්න

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

දුරස්ථ ක්‍රියා පටිපාටි ඇමතුම හෝ දුරස්ථ ක්‍රියා පටිපාටි ඇමතුම හරහා රවුටරයට දන්නා සියලුම මාර්ග සඳහා ඉල්ලීමක් කරනු ලැබේ, ඒවායින් වඩාත් පහසු වේ.

data = dev.rpc.get_route_information()

Junos OS හි සමාන විධානය

user@router> show route | display xml

විධානයේ අවසානයට rpc එකතු කිරීමෙන් අපට ඉල්ලීම් ටැග් එකක් ලැබෙන අතර එය RPC ක්‍රමයේ නම සමඟ ගැලපිය හැක, මේ ආකාරයෙන් අපට උනන්දුවක් දක්වන වෙනත් නම් සොයාගත හැකිය. ඉල්ලීම් ටැගය ලිවීමේ වාක්‍ය ඛණ්ඩය ක්‍රමයේ නමට වඩා වෙනස් බව සඳහන් කිරීම වටී, එනම්, ඔබ යටි ඉරි සමඟ යටි ඉරි ප්‍රතිස්ථාපනය කළ යුතුය.

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

රවුටරය දැනටමත් දන්නා අයගෙන් වෙනත් උප ජාලයක් පරීක්ෂා කිරීමට අවශ්‍ය නම් රවුටරය වෙත ඉල්ලීම නැවත නොකිරීමට ඉතිරි කොටස ටික වේලාවකින් ඔතා ඇත. මා ඉල්ලීම කරන රවුටරය OSPF හරහා පමණක් මාර්ග දන්නා බව සඳහන් කිරීම වටී, එබැවින් එජ් රවුටරයක් ​​සඳහා ස්ක්‍රිප්ට් ධාවන කාලය අඩු කිරීම සඳහා ඉල්ලීම ටිකක් වෙනස් කිරීම වඩා හොඳය.

data = dev.rpc.get_ospf_route_information()

දැන් අපි while loop එකේ අන්තර්ගතය බලමු

ආරම්භයේ දී, පරිශීලකයාට වෙස් මුහුණක් සහිත උපජාලයක් ඇතුළු කිරීමට අසනු ඇති අතර එකම උපජාලයේ ජාලයෙන් අෂ්ටක තුනකට වඩා වැඩි නොවේ, සෙවුම් පරාසය සැකසීමට මෙය අවශ්‍ය වේ. නිර්ණායක සහ සෙවුම් පරාසය නියම කිරීමේ මෙම ක්‍රියාවට නැංවීමට මම ඇත්තෙන්ම කැමති නැත, නමුත් මෙතෙක් මට වඩා හොඳ විසඳුමක් සොයාගෙන නොමැත. මීළඟට, ලැබෙන උපජාල මාර්ග_ලැයිස්තුවෙන්, අෂ්ටක තුනකට නොවැඩි විචල්‍යයක් භාවිතා කරමින්, මම මා කැමති උපජාල තෝරමි.

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

IPNetwork, netaddr මොඩියුලය හරහා, මට ipv4 ලිපින ලැයිස්තුවක් ආකාරයෙන් උපජාල ලැබේ.

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

IPNetwork භාවිතා කරමින්, මම වෙස් මුහුණක් සහිත පරිශීලක-ඇතුලත් කළ ජාලයකින් ලිපින මාලාවක් ලබා ගන්නා අතර වාඩිලාගෙන සිටින ලිපින ලැයිස්තුව සමඟ සැසඳීම සඳහා මෙම පරාසයෙන් සියලුම ලිපින ලැයිස්තුවක් උත්පාදනය කරමි.

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

මම උපජාල ආකාරයෙන් නොමිලේ ලිපින ලැයිස්තුව පෙන්වමි

print(netaddr.IPSet(freeip))

පහත දැක්වෙන්නේ රවුටරයක් ​​ලෙස භාවිතා කරන ස්විච මත පරීක්ෂා කරන ලද සම්පූර්ණ ස්ක්‍රිප්ට් එකයි, ආකෘති 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

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න