Network Automation untuk Mikrotik RouterOS menggunakan Python

Network Automation Python

Mikrotik merupakan perangkat yang populer juga digunakan saat ini. Hampir semua level perusahaan menggunakan perangkat ini. Network automation juga dapat dilakukan di perangkat-perangkat mikrotik. Saat ini yang penulis temui ada dua library yang mudah dan dapat digunakan untuk mengotomasi perangkat mikrotik yaitu Paramiko dan RouterOS-api.

Saat artikel ini ditulis, penulis menggunakan python versi 3.8.2 dengan Paramiko versi 2.7.1 dan RouterOS-api vesi 0.17.0. Berikut di bawah adalah contoh-contoh sederhana dan dasar untuk melakukan network automation mikrotik RouterOS menggunakan python.

Contoh 1 – Paramiko

import paramiko
import time

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname="192.168.1.2", username="root", password="123123")

conn = ssh.invoke_shell()

#time.sleep(1) --> Hilangkan komentar

output = conn.recv(65535)
print(output.decode("ascii"))

ssh.close()

Pada contoh ke-1 ini hanya sebuah contoh dimana kebanyakan perangkat seperti Cisco menggunakan invoke_shell(). Metode ini tidak dapat digunakan pada perangkat Mikrotik. invoke_shell() akan membuat seolah-olah kita memasukkan perintah di dalam terminal jadi tidak murni menggunakan SSH environment sebagai input nya.

Tetapi pembaca dapat mencoba dulu kode di atas, untuk mengetahui output apa yang akan keluar ketika menggunakan cara tersebut. Selanjutnya dapat dilihat pada contoh-contoh di bawah.

Contoh 2 – Paramiko (Print IP Address List)

import paramiko
import time

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname="192.168.1.2", username="root", password="123123")

stdin, stdout, stderr = ssh.exec_command("ip address print")
print(stdout.read().decode("ascii").strip("\n"))

ssh.close()

Pada contoh ke-2 ini digunakan exec_command(). Metode ini dapat digunakan untuk melakukan otomasi di perangkat Mikrotik. exec_command() akan mengeksekusi perintah-perintah untuk perangkat mikrotik langsung dari SSH environment.

Contoh kode di atas hanya untuk menampilkan output dari perintah /ip address print. Kemudian fungsi decode(“ascii”).strip(“\n”) digunakan untuk men-decode output dalam bentuk ascii dan menghilangkan new line pada output. Coba hilangkan fungsi tersebut untuk melihat output original yang dihasilkan.

Contoh 3 – Paramiko (Ping Mikrotik)

import paramiko
import re, datetime

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname="192.168.1.2", username="root", password="123123")

# melakukan ping ke google.com selama 3 detik
stdin, stdout, stderr = ssh.exec_command("ping google.com count=3")

# menuliskan hasil ping ke file 'ping'
file = open("ping","w")
file.write(stdout.read().decode("ascii").strip("\n"))
file.close()

# membaca file 'ping'
file = open("ping","r")
output = file.readlines()

# mengambil baris hasil rata-rata ping
for i in range(0,len(output)):
	if i == len(output)-2:
		x = output[i].strip("\n")

# mencari posisi indeks avg-rtt and max-rtt
findavgrtt = x.find("avg-rtt")
findmaxrtt = x.find("max-rtt")

# mencari bagian avg-rtt=XXXms.
avgrtt = x[findavgrtt:(findmaxrtt-1)]

# mencari angka hasil dari avg-rtt (number).
avg = re.findall(r"\d{1,4}", avgrtt)

# menampilkan hasil dalam format integer
print("Rata-rata PING = {} ms".format(int(avg[0])))

ssh.close()

Kode di atas adalah contoh untuk mengambil hasil ping dari perangkat mikrotik. Ping dilakukan menuju alamat google.com selama 3 detik. Jadi seperti kita melakukan ping dari terminal mikrotik dan hasilnya kita olah untuk diambil angka yg diinginkan.

Contoh 4 – Paramiko (Ping Monitoring)

import paramiko
import re, datetime, time

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname="192.168.1.2", username="root", password="123123")

# di eksekusi terus menerus
while  True:
	pass
	# mengambil tanggal dan waktu
	now = datetime.datetime.now()

	stdin, stdout, stderr = ssh.exec_command("ping google.com count=3")
	# menuliskan hasil ping ke file 'ping'
	file = open("ping","w")
	file.write(stdout.read().decode("ascii").strip("\n"))
	file.close()

	# membaca file 'ping'
	file = open("ping","r")
	output = file.readlines()

	# menemukan baris hasil dari ping
	for i in range(0,len(output)):
		if i == len(output)-2:
			x = output[i].strip("\n")

	# menemukan posisi indeks avg-rtt and max-rtt
	findavgrtt = x.find("avg-rtt")
	findmaxrtt = x.find("max-rtt")

	# menemukan bagian avg-rtt=XXXms.
	avgrtt = x[findavgrtt:(findmaxrtt-1)]

	# mencari nilai dari avg-rtt (number).
	avg = re.findall(r"\d{1,4}", avgrtt)

	# menampilan hasil ping
	print(now.strftime("%Y-%m-%d %H:%M:%S {}> {} ms".format('-'*int(avg[0]),int(avg[0]))))

ssh.close()

Pada contoh ke-4 ini hampir sama persis dengan contoh ke-3. Perbedaannya hanya pada contoh ke-4 ini kode akan diekseksi berulang terus-menerus sehingga output akan dihasilkan secara berulang. Contoh kode ini dapat digunakan untuk melakukan monitoring koneksi dengan format output yang kita inginkan.

Contoh 5 – RouterOS-Api (Print List IP Address)

import routeros_api
import json

# ip address mikrotik
host = '192.168.1.2'

# koneksi ke mikrotik
connection = routeros_api.RouterOsApiPool(host, username='root', password='123123', plaintext_login=True)
api = connection.get_api()

# menentukan path dan mengambil hasil
list_ipadd = api.get_resource('ip/address/')
show_ipadd = list_ipadd.get()

# menampilkan hasil dalam format JSON
print(json.dumps(show_ipadd, indent=3))

# menutup koneksi
connection.disconnect()

Pada contoh ke-5 ini digunakan RouterOS-Api untuk menampilkan list IP Address di perangkat mikrotik. Output akan ditampilkan dalam format JSON sehingga jika ingin mengolahnya lagi akan lebih mudah. Kode di atas sama halnya jika kita mengetikkan perintah /ip address print di perangkat mikrotik.

[
   {
      "id": "*9",
      "address": "10.10.10.1/24",
      "network": "10.10.10.0",
      "interface": "*D",
      "actual-interface": "*D",
      "invalid": "true",
      "dynamic": "false",
      "disabled": "false"
   },
   {
      "id": "*C",
      "address": "192.168.1.2/24",
      "network": "192.168.1.0",
      "interface": "bridge-local",
      "actual-interface": "bridge-local",
      "invalid": "false",
      "dynamic": "false",
      "disabled": "false"
   }
]

Contoh 6 – RouterOS-Api (Print List IP Address)

import routeros_api
import json

host = '192.168.1.2'

connection = routeros_api.RouterOsApiPool(host, username='root', password='123123', plaintext_login=True)
api = connection.get_api()

list_ipadd = api.get_resource('ip/address/')
show_ipadd = list_ipadd.get()

# menampilkan output dari key ip address saja
for i in show_ipadd:
	print(i['address'])

Pada contoh ke-6 ini hampir sama persis dengan contoh ke-5. Perbedaannya hanya kita mengambil nilai dari IP Address nya saja.

10.10.10.1/24
192.168.1.2/24

Contoh 7 – RouterOS-Api (Add, Modify, Remove Konfigurasi)

import routeros_api
import json, time

host = '192.168.1.2'

connection = routeros_api.RouterOsApiPool(host, username='root', password='123123', plaintext_login=True)
api = connection.get_api()

list_queue_simple = api.get_resource('queue/simple/')
show_queue_simple = list_queue_simple.get()

# add
list_queue_simple.add(name="satu")
print(json.dumps(show_queue_simple, indent=3))

# modify
list_queue_simple.set(id='*1', name='dua')
print(json.dumps(show_queue_simple, indent=3))

# # remove
list_queue_simple.remove(name='dua')
print(json.dumps(show_queue_simple, indent=3))

Pada contoh ini dilakukan untuk menambahkan, memodifikasi dan menghapus konfigurasi. Konfigurasi dilakukan pada path /queue/simple. Jadi kode di atas adalah contoh untuk menambahkan, memodifikasi dan menghapus simple queue di mikrotik.

Contoh 8 – RouterOS-Api (Execute Command)

import routeros_api

host = '192.168.1.2'

connection = routeros_api.RouterOsApiPool(host, username='root', password='123123', plaintext_login=True)
api = connection.get_api()

# eksekusi perintah ping
cmd = api.get_binary_resource('/').call('ping', { 'address': b'192.168.1.1', 'count': b'3' })

# menampilkan hasil
for i in cmd:
	print(i)

connection.disconnect()

RouterOS-Api juga dapat digunakan untuk mengeksekusi perintah seperti ping. Output akan ditampilkan dalam format seperti JSON, terdapat key dan value.

Contoh 9 – RouterOS-Api (Execute Command)

import routeros_api

host = '192.168.1.2'

connection = routeros_api.RouterOsApiPool(host, username='root', password='123123', plaintext_login=True)
api = connection.get_api()

cmd = api.get_binary_resource('/').call('ping', { 'address': b'192.168.1.1', 'count': b'3' })

for i in cmd:
	print(i['avg-rtt'])

connection.disconnect()

Contoh ke-9 ini hampir sama persis dengan contoh ke-8. Bedanya hanya di output yang ditampilkan yaitu pada contoh ke-9 ini hanya key ‘ip-address’ aja yang ditampilkan.

b'0ms'
b'0ms'
b'0ms'

Demikian beberapa contoh sederhana untuk melakukan network automation di mikrotik menggunakan python. Untuk dokumentasi RouterOs-Api dapat dilihat di https://github.com/socialwifi/RouterOS-api. Semoga bermanfaat 🙂


LANJUTKAN BACA MATERI LENGKAP


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.