Sebuah artikel tentang bekerja dengan Junos PyEZ - “Python microframework yang memungkinkan Anda untuk mengelola dan mengotomatiskan perangkat yang menjalankan Junos OS” otomatisasi dan kontrol, semua yang kami sukai. Menulis skrip yang dijelaskan dalam artikel ini mengejar beberapa tujuan - mempelajari Python dan mengotomatiskan tugas mengumpulkan informasi atau mengubah konfigurasi pada peralatan yang menjalankan OS Junos. Pilihan bundel Python + Junos khusus ini PyEZ dibuat karena ambang rendah untuk memasukkan bahasa pemrograman Python dan kemudahan penggunaan perpustakaan Junos PyEZ, yang tidak memerlukan keahlian OS Junos.
Tantangan
Mengaudit subnet gratis milik perusahaan ipv4. Kriteria bahwa subnet gratis adalah tidak adanya catatan tentang hal itu di rute pada switch yang bertindak sebagai router yang menjalankan OS Junos.
Implementasi
Python + Junos PyEZ, meskipun ada godaan untuk dilakukan melalui paramiko dan ssh.exec_command,
sebagai hasilnya, akan diperlukan untuk mengkonfigurasi protokol manajemen jaringan untuk perangkat netconf pada peralatan yang disurvei. Netconf bekerja dengan peralatan melalui panggilan prosedur jarak jauh (RPC) dan menggunakan XML, dalam contoh ini, untuk memberikan informasi yang diterima.
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 opsi lagi
$ pip install -r requirements.txt
perintah ini akan menginstal perpustakaan yang diperlukan untuk pekerjaan yang tidak ada dalam sistem. Di versi
persyaratan.txt saya hanya ada dua, versi terakhir ditunjukkan pada saat penulisan skrip:
junos-eznc netaddr
Skrip default mengambil nama pengguna saat ini di sistem, Anda dapat masuk dengan nama pengguna lain menggunakan tombol show_route.py -u <user_name> getpass.getpass menerima kata sandi dari stdin sehingga kata sandi tidak akan tetap berada di sistem. Untuk terhubung ke peralatan, Anda juga harus memasukkan nama host atau alamat ip-nya berdasarkan permintaan. 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 mempertimbangkan opsi terakhir.
Untuk menghubungkan ke peralatan, kelas Perangkat dari modul jnpr.junos digunakan.
with jnpr.junos.Device(host=router, user=args.name, passwd=password) as dev:
Permintaan dibuat tentang semua rute yang diketahui ke router melalui panggilan prosedur jarak jauh atau panggilan ke prosedur jarak jauh, kepada siapa itu lebih nyaman.
data = dev.rpc.get_route_information()
Perintah serupa pada Junos OS
user@router> show route | display xml
Menambahkan perintah rpc ke akhir perintah, kami mendapatkan tag permintaan dan dapat mencocokkannya dengan nama metode RPC, dengan cara ini Anda dapat mengetahui nama-nama menarik lainnya. Perlu dicatat bahwa sintaks untuk menulis tag permintaan berbeda dari nama metode, yaitu, ganti tanda hubung dengan garis bawah.
user@router> show route | display xml rpc <rpc-reply xmlns:junos="http://xml.juniper.net/junos/15.1R1/junos"> <rpc> <get-route-information> </get-route-information> </rpc> </rpc-reply>
Saya menerima data rute dalam format xml, yang saya pilih hanya yang menarik saya dengan tag
<rt-destination> xxx.xxx.xxx.xxx/yy </rt-destination> dan menulisnya ke dalam variabel sebagai daftar dalam format string, sehingga mendapatkan daftar subnet sibuk.
route_list = data.xpath("//rt-destination/text()")
Saya membungkus sisanya dalam loop sementara agar tidak mengeksekusi kembali permintaan ke router jika saya perlu memeriksa subnet yang berbeda dari yang sudah diketahui router. Perlu disebutkan bahwa router yang saya minta tahu rute hanya melalui OSPF, oleh karena itu, untuk router perbatasan, lebih baik untuk mengubah permintaan sedikit untuk mengurangi waktu skrip
data = dev.rpc.get_ospf_route_information()
Sekarang mari kita lihat isi dari while loop
Pada awalnya, pengguna akan diminta untuk memasukkan subnet dengan mask dan tidak lebih dari tiga oktet dari jaringan subnet yang sama, ini diperlukan untuk mengatur rentang pencarian. Saya tidak terlalu suka penerapan pengaturan kriteria dan rentang pencarian ini, tetapi sejauh ini saya belum menemukan solusi yang lebih baik. Selanjutnya, dari daftar subnet route_list yang diperoleh, menggunakan variabel yang mengandung tidak lebih dari tiga oktet, saya memilih subnet yang menarik bagi saya.
tmp = re.search(r'^%s\S*' % subnet_search, route_list[i])
Melalui IPNetwork, modul netaddr, saya mendapatkan subnet sebagai daftar alamat ipv4
range_subnet = netaddr.IPNetwork(tmp.group(0))
Menggunakan IPNetwork dari jaringan yang dimasukkan oleh pengguna dengan mask, saya mendapatkan berbagai alamat dan membentuk daftar semua alamat dari kisaran ini untuk perbandingan dengan daftar alamat yang sibuk.
for i in set(net_list).difference(set(busyip)): freeip.append(i)
Saya menyimpulkan daftar alamat gratis yang diterima dalam bentuk subnet
print(netaddr.IPSet(freeip))
Di bawah ini adalah skrip lengkap, yang diuji pada sakelar yang digunakan sebagai router, ex4550, model ex4600