Membuka fase NetDevOps: mengapa otomasi kini kewajiban bukan pilihan, menyiapkan environment Python untuk jaringan, menguasai netmiko untuk push konfigurasi multi-device, menyentuh paramiko dan NAPALM, berinteraksi dengan REST API, serta mindset dan safety rule otomasi di produksi

Setelah di episode 11 fase fundamental jaringan selesai, kita buka babak baru yang menentukan nilai pasar kalian di 2026: otomasi. Angka dari outline series ini layak diulang: lebih dari 80% task jaringan rutin di organisasi matang sudah terautomasi. Engineer yang masih SSH satu-per-satu ke 60 switch tidak bersaing dengan engineer yang menulis script 40 baris sekali lalu memakainya berbulan-bulan.
Episode ini fondasinya: environment Python untuk network, library inti (netmiko/paramiko/NAPALM), interaksi REST API, dan — sama pentingnya — aturan keselamatan otomasi.
Sebelum kode, ubah cara pandang. Otomasi bukan "pintar-pintaran", melainkan jawaban atas tiga masalah nyata:
Alur kerja modern disebut NetDevOps: konfigurasi sebagai kode → review via pull request → deploy terotomatisasi → validasi pasca-change → rollback terencana. Episode ini lapisan eksekusinya; Ansible menyusul di episode 13.
Jangan pernah install library langsung ke sistem — pakai virtual environment:
python3 -m venv ~/venvs/netauto
source ~/venvs/netauto/bin/activate
pip install netmiko napalm paramiko textfsm jinja2 requests
python -c "import netmiko; print(netmiko.__version__)"Empat nama yang akan kalian pakai:
| Library | Peran |
|---|---|
| paramiko | Klien SSH mentah (fondasi) |
| netmiko | SSH dengan dialek vendor — cara paling umum |
| NAPALM | Abstraksi multi-vendor + config diff/replace |
| requests | Klien REST API (device/controller) |
Simpan kredensial di variabel environment atau secret manager — bukan hardcode dalam file, apalagi yang masuk git:
export NET_USER="netadmin"
export NET_PASS="$(pass show lab/router)"Netmiko membungkus SSH + interpretasi prompt per-vendor. Script pertama yang layak dipakai kerja: kumpulkan show version dari banyak perangkat sekaligus:
from netmiko import ConnectHandler
import os
devices = [
{"host": "192.168.99.11", "device_type": "cisco_xe"},
{"host": "192.168.99.12", "device_type": "cisco_xe"},
]
for dev in devices:
dev.update({
"username": os.environ["NET_USER"],
"password": os.environ["NET_PASS"],
"secret": os.environ["NET_PASS"],
})
try:
with ConnectHandler(**dev) as conn:
conn.enable()
out = conn.send_command("show version")
model = [l for l in out.splitlines() if "WS-C" in l or "CSR" in l]
print(dev["host"], "->", model[:1])
except Exception as exc:
print(dev["host"], "GAGAL:", exc)Perhatikan pola profesionalnya: kredensial dari environment, context manager (with) agar koneksi rapi ditutup, dan error satu device tidak menghentikan batch.
Push konfigurasi memakai dua metode send_config_set — biasa, atau dari file:
conn.send_config_set(["vlan 40", "name IOT", "exit"])
conn.save_configuration()Warning
Aturan emas otomasi CLI: uji selalu pada device lab dulu, sediakan jalur rollback (misal reload in 10 saat percaya diri rendah), dan jangan pernah push massal tanpa --dry-run mental: baca ulang daftar command sebelum enter.
Output show itu teks bebas — sampai netmiko + template TextFSM mengubahnya menjadi tabel terstruktur:
conn.send_command("show ip interface brief", use_textfsm=True)
# hasil: list of dict -> mudah difilter/disimpan ke CSV/databaseIni pintu menuju pelaporan inventaris otomatis — tugas yang dulu makan hari, kini menit.
Paramiko adalah SSH murni tanpa keajaiban vendor — berguna ketika perangkat tak didukung netmiko atau kalian butuh kontrol penuh (tunnel, SFTP backup config):
import paramiko, os
c = paramiko.SSHClient()
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
c.connect("192.168.99.11", username=os.environ["NET_USER"],
password=os.environ["NET_PASS"], look_for_keys=False)
_, out, _ = c.exec_command("show running-config")
open("rtr01.cfg", "w").write(out.read().decode())Dalam praktik: pakai netmiko untuk pekerjaan sehari-hari; paramiko saat butuh fleksibilitas kasar.
NAPALM menyatukan operasi umum lintas vendor ke API tunggal — dan fitur pembunuhnya adalah config diff & atomic replace:
from napalm import get_network_driver
driver = get_network_driver("ios")
with driver("192.168.99.11", "netadmin",
os.environ["NET_PASS"]) as dev:
dev.load_merge_candidate(filename="ntp_new.cfg")
diff = dev.compare_config()
print(diff if diff else "** no changes **")
if "--no-commit" not in os.environ.get("ARGS", ""):
dev.commit_config() # apply
# dev.discard_config() # atau batalkanAlurnya aman by design: load_candidate → compare_config (review!) → commit atau discard. Bandingkan dengan copy-paste terminal — inilah alasan tim matang memilih abstraksi daripada raw CLI.
Perangkat dan controller modern mengekspos RESTCONF/NETCONF atau API web (Meraki/DNA Center/Palo Alto). Polanya seragam: autentikasi token, kirim JSON, terima JSON:
import requests, json, os
url = "https://192.168.99.11/restconf/data/ietf-interfaces:interfaces"
headers = {"Accept": "application/yang-data+json"}
resp = requests.get(url, headers=headers,
auth=(os.environ["NET_USER"], os.environ["NET_PASS"]),
verify="lab-ca.pem")
print(json.dumps(resp.json(), indent=2))REST API membuka integrasi yang mustahil lewat CLI: dashboard inventaris, sinkronisasi CMDB, trigger dari ticketing. Ketika kalian sampai di cloud networking (episode 15), API ini adalah satu-satunya bahasa — CLI hanyalah pembungkusnya.
Inti yang harus dibawa pulang:
Di episode 13 kita naik level orkestrasi: Ansible untuk jaringan — inventory, playbook, idempotency, Jinja2 template, dan vault — mengubah script ad-hoc menjadi automation yang dikelola tim secara terstruktur. Sampai jumpa!