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,
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