Halo semuanya, saat ini saya akan membahas tentang membangun script automation yang jauh lebih baik. Jauh lebih baik menurut siapa nih? haha. Yang pasti jauh lebih baik menurut saya pribadi sepanjang saya membuat automation script terhadap perangkat jaringan.
Sebelum kita memulai, library yang saya sering pakai adalah netmiko, itu adalah library yang menurut saya baik, atau malah paling baik untuk perangkat jaringan.
Mari kita ambil salah satu contoh dari github netmiko https://github.com/ktbyers/netmiko/blob/develop/examples/send_command.py
#!/usr/bin/env python
from netmiko import ConnectHandler
from getpass import getpass
cisco1 = {
"device_type": "cisco_ios",
"host": "cisco1.lasthop.io",
"username": "pyclass",
"password": getpass(),
}
# Show command that we execute
command = "show ip int brief"
with ConnectHandler(**cisco1) as net_connect:
output = net_connect.send_command(command)
# Automatically cleans-up the output so that only the show output is returned
print()
print(output)
print()
Code diatas adalah contoh awal yang kita bisa ambil dari netmiko untuk melakukan automation. Yang kita bisa liat dari kode di atas adalah
1. Device apa saja yang akan kita push confignya
2. Command apa saja yang akan kita push ke device
Yang paling mencolok menurut saya disini adalah penggunaan getpass, karena realitanya, pada saat kita melakukan automation, kita tidak akan mungkin input password terus menerus, hahaha, itu bukan automation namanya. Kita mulai dari remove getpass
#!/usr/bin/env python
from netmiko import ConnectHandler
cisco1 = {
"device_type": "cisco_ios",
"host": "cisco1.lasthop.io",
"username": "pyclass",
"password": "password",
}
# Show command that we execute
command = "show ip int brief"
with ConnectHandler(**cisco1) as net_connect:
output = net_connect.send_command(command)
# Automatically cleans-up the output so that only the show output is returned
print()
print(output)
print()
Kode diatas akan works, tapi yang jadi pertanyaan selanjutnya, jika kita akan menggunakannya untuk banyak device? Ok, kita bisa menggunakan list & dictionary, dan mengaplikasikan loop
#!/usr/bin/env python
from netmiko import ConnectHandler
devices = [
{
"device_type": "cisco_ios",
"host": "cisco1.lasthop.io",
"username": "pyclass",
"password": "password",
},
{
"device_type": "cisco_ios",
"host": "cisco1.lasthop.io",
"username": "pyclass",
"password": "password",
},
{
"device_type": "cisco_ios",
"host": "cisco1.lasthop.io",
"username": "pyclass",
"password": "password",
}
]
# Show command that we execute
command = "show ip int brief"
for device in devices:
net_connect = ConnectHandler(**device)
output = net_connect.send_command(command)
# Automatically cleans-up the output so that only the show output is returned
print()
print(output)
print()
“Mmm, ok sih, tapi kalo command nya banyak gimana?”, “kalau mau dirubah devicenya, apa nggak cape tuh ngetik terus di script?”, “bisa nggak lebih cepet lagi ya? kalau saya jalanin lambat banget nunggu satu per satu”
Apakah pertanyaan pertanyaan itu terjadi di benak kalian? hahaha, improvement adalah salah satu benefit automation, dengan automation, kita bisa lihat prosesnya, dan melakukan continuous improvement. Merubah / me re-factor script kita menjadi lebih cepat dalam eksekusi, dan bisa digunakan juga untuk case yang lain, tidak hanya satu kali jalan, re usable.
Kita bisa mulai dulu dari pertanyaan “kalau mau dirubah apa nggak cape tuh ngetik terus di script?”. Kita akan lelah merubah bila data yang kita pakai ada di dalam script. Solusinya adalah mengeluarkan data yang ada di dalam script ke tempat lain, merubah formatnya menjadi format yang mudah untuk di edit. Format termudah dan memang sudah built in juga di python salah satunya adalah CSV. Yuk kita coba rubah code diatas supaya membaca dari csv
import csv
from netmiko import ConnectHandler
devices = []
with open('devices.csv') as csvfile:
my_devices = csv.reader(csvfile, delimiter=',')
for device in my_devices:
devices.append(device)
# Show command that we execute
command = "show ip int brief"
for device in devices:
my_device = {
"device_type": device[0],
"host": device[1],
"username": device[2],
"password": device[3],
}
net_connect = ConnectHandler(**my_device)
output = net_connect.send_command(command)
# Automatically cleans-up the output so that only the show output is returned
print()
print(output)
print()
Berikut adalah sample dari csv nya
cisco_ios,cisco1.lasthop.io,pyclass,password
cisco_ios,cisco1.lasthop.io,pyclass,password
cisco_ios,cisco1.lasthop.io,pyclass,password
Ruarr byasah, sekarang kita bisa menambahkan device dengan mudah, bila ada perubahan tentang device.
Pertanyaan / improvement terakhir saat ini yang saya alami adalah, bagaimana bila commandnya lebih dari 1, dan assignment terakhir yang saya dapat adalah bila push config, tetapi ada perbedaan config antara 1 device dengan device yang lain.
Solusi terbaik untuk hal tersebut adalah dengan menambahkan command tepat di dekat si devicenya, dan di dalam csv sama. Yuk kita tengok dulu untuk pendekatannya
import csv
from netmiko import ConnectHandler
devices = []
with open('devices.csv') as csvfile:
my_devices = csv.reader(csvfile, delimiter=',')
for device in my_devices:
devices.append(device)
# Show command that we execute
for device in devices:
my_device = {
"device_type": device[0],
"host": device[1],
"username": device[2],
"password": device[3],
}
commands = device
del commands[0:4]
tulis=input(commands)
net_connect = ConnectHandler(**my_device)
output = net_connect.send_config_set(commands)
# Automatically cleans-up the output so that only the show output is returned
print()
print(output)
print()
Ada perubahan yang mungkin perlu dibahas adalah “del commands” fungsi tersebut kita bisa gunakan untuk menghapus isi di dalam list dalam range tertentu. Lalu selanjutnya adalah sebelumnya kita mengirimkan “send_command”, tapi di code di atas saya mengirimkan “send_config_set” agar bisa mengirimkan config yang lebih banyak. Untuk CSV nya bisa kita lihat dibawah ini
cisco_ios,cisco1.lasthop.io,pyclass,password,show ip int brief,show run
cisco_ios,cisco1.lasthop.io,pyclass,password,show run
cisco_ios,cisco1.lasthop.io,pyclass,password,show run
Di CSV file kita bisa lihat, bahwa saat ini kita bisa memberikan config yang banyak, dan berbeda tiap devicenya. Untuk editing biasanya saya menggunakan excel / libre, lalu save as csv.
Singkat kata, untuk membangun script yang lebih baik, adalah dengan melakukan improvement / re-factor terhadap script itu sendiri seiring berjalannya waktu dan bertambahnya kebutuhan, karena sesuatu yang lebih baik itu definisinya selalu berubah ubah di setiap harinya.
Berikut ini adalah final script yang saya pakai, saya push di github berikut sebagai contoh, disitu sudah memakai multi threading juga supaya proses jadi jauh lebih cepat
https://github.com/ludesdeveloper/sample_better_push_config_netmiko/tree/master
Semoga bermanfaat
Tinggalkan Balasan