Junos PyEZ menggunakan contoh tugas mencari subnet ipv4 gratis

Artikel tentang bekerja dengan Junos PyEZ - “Kerangka mikro Python yang memungkinkan Anda mengelola dan mengotomatisasi perangkat yang menjalankan otomatisasi dan manajemen Junos OS”, semua yang kami sukai. Penulisan skrip yang dijelaskan dalam artikel ini memiliki beberapa tujuan - mempelajari Python dan mengotomatisasi tugas mengumpulkan informasi atau mengubah konfigurasi pada peralatan yang menjalankan Junos OS. Pilihan kombinasi khusus Python + Junos PyEZ ini dibuat karena rendahnya hambatan untuk masuk ke bahasa pemrograman Python dan kemudahan penggunaan perpustakaan Junos PyEZ, yang tidak memerlukan pengetahuan ahli tentang Junos OS.

Tugas

Audit subnet ipv4 gratis milik perusahaan. Kriteria bahwa suatu subnet bebas adalah tidak adanya entri tentang subnet tersebut di rute pada switch yang bertindak sebagai router yang menjalankan Junos OS.

Implementasi

Python + Junos PyEZ, meskipun ada godaan untuk melakukannya melalui paramiko dan ssh.exec_command, Oleh karena itu, Anda perlu mengonfigurasi protokol manajemen jaringan perangkat netconf pada peralatan yang disurvei. Netconf bekerja dengan perangkat keras melalui panggilan prosedur jarak jauh RPC dan menggunakan XML, dalam contoh ini, untuk menyediakan informasi yang diterimanya.

Menginstal versi Junos PyEZ saat ini dari PyPI dilakukan dengan perintah berikut:

$ pip install junos-eznc

Anda juga dapat menginstal dari cabang utama proyek di GitHub dengan perintah berikut:

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

Dan satu pilihan lagi melalui

$ pip install -r requirements.txt 

Perintah ini akan menginstal perpustakaan yang hilang dari sistem dan diperlukan untuk pengoperasian. Dalam versi saya requirement.txt Hanya ada dua di antaranya, versi terbaru ditunjukkan pada saat penulisan skrip:

junos-eznc
netaddr

Secara default, skrip mengambil nama pengguna saat ini di sistem; Anda dapat masuk dengan nama pengguna lain menggunakan kunci show_route.py -u getpass.getpass mengambil kata sandi dari stdin sehingga kata sandi tidak akan tertinggal di sistem. Untuk menyambung ke peralatan, Anda juga perlu memasukkan nama host atau alamat IP saat diminta. Semua data yang diperlukan untuk otorisasi pada perangkat telah diterima.

Junos PyEZ mendukung koneksi ke peralatan yang menjalankan Junos OS menggunakan konsol, telnet atau netconf melalui ssh. Artikel ini membahas opsi terakhir.

Untuk menyambung ke peralatan, gunakan kelas Perangkat dari modul jnpr.junos

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

Permintaan dibuat untuk semua rute yang diketahui router melalui panggilan prosedur jarak jauh atau panggilan prosedur jarak jauh, mana yang lebih nyaman.

data = dev.rpc.get_route_information()

Perintah serupa di Junos OS

user@router> show route | display xml

Dengan menambahkan rpc di akhir perintah, kita mendapatkan tag permintaan dan dapat mencocokkannya dengan nama metode RPC, dengan cara ini kita dapat mengetahui nama lain yang menarik. Perlu diperhatikan bahwa sintaks penulisan tag permintaan berbeda dengan nama metode, yaitu Anda harus mengganti tanda hubung dengan garis bawah.

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

Sisanya dibungkus dalam loop sementara agar tidak mengulangi permintaan ke router jika perlu untuk memeriksa subnet lain dari subnet yang sudah diketahui router. Perlu disebutkan bahwa router tempat saya membuat permintaan mengetahui rute hanya melalui OSPF, jadi untuk router edge lebih baik mengubah permintaan sedikit untuk mengurangi waktu berjalan skrip

data = dev.rpc.get_ospf_route_information()

Sekarang mari kita lihat isi dari perulangan while

Pada awalnya, pengguna akan diminta untuk memasukkan subnet dengan mask dan tidak lebih dari tiga oktet dari jaringan subnet yang sama, hal ini diperlukan untuk mengatur rentang pencarian. Saya tidak terlalu menyukai penerapan penentuan kriteria dan rentang pencarian ini, tetapi sejauh ini saya belum menemukan solusi yang lebih baik. Selanjutnya, dari daftar subnet routing_list yang dihasilkan, menggunakan variabel yang berisi tidak lebih dari tiga oktet, saya memilih subnet yang saya minati

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

Melalui IPNetwork, modul netaddr, saya menerima subnet dalam bentuk daftar alamat ipv4

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

Dengan menggunakan IPNetwork, saya mendapatkan rentang alamat dari jaringan yang dimasukkan pengguna dengan topeng dan membuat daftar semua alamat dari rentang ini untuk dibandingkan dengan daftar alamat yang ditempati.

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

Saya menampilkan daftar alamat gratis yang dihasilkan dalam bentuk subnet

print(netaddr.IPSet(freeip))

Di bawah ini skrip lengkapnya, diuji pada switch yang digunakan sebagai router, model 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

Sumber: www.habr.com

Tambah komentar