SNMP Monitoring — Cluster Incus trim-computes-shr-incus#
Dokumen: Runbook Deployment & Operasional
Scope: Node compute trim-computes-shr-incus-01 s/d -04 (Debian 13)
Versi: 1.0
Tanggal: 27 Juli 2026
PIC: IT Infrastructure — Trimegah
1. Tujuan#
Mengaktifkan SNMP agent (net-snmp) pada seluruh node compute cluster Incus agar dapat di-poll oleh NMS untuk keperluan:
- Monitoring resource host: CPU, memory, disk/filesystem, load average
- Monitoring interface network (uplink & VLAN trunk)
- Monitoring komponen storage cluster yang tidak tersedia di MIB standar: multipath, LVM, sanlock/lvmlockd, service Incus
Poin terakhir adalah nilai utama dokumen ini. Kegagalan pada layer LVM/multipath tidak terlihat sama sekali lewat OID standar, padahal justru itu yang paling sering menjatuhkan node (lihat §10).
2. Parameter Deployment#
| Parameter | Nilai |
|---|---|
| SNMP version | v2c (read-only) |
| Community string | Disimpan di Ansible Vault / password manager — tidak ditulis di dokumen ini |
| Port | UDP 161 |
| NMS / poller | 10.25.4.69 |
| Paket | snmpd, snmp |
| File config | /etc/snmp/snmpd.conf |
| Extend script | /usr/local/bin/snmp-cluster-health.sh |
Daftar node#
| Node | IP Management | Status |
|---|---|---|
trim-computes-shr-incus-01 | 10.25.3.50 | Selesai |
trim-computes-shr-incus-02 | <isi> | Pending |
trim-computes-shr-incus-03 | <isi> | Pending |
trim-computes-shr-incus-04 | <isi> | Pending |
3. Catatan Keamanan (baca sebelum eksekusi)#
SNMPv2c mengirim community string dalam plaintext. Konsekuensinya, keamanan tidak boleh bergantung pada kerahasiaan string tersebut, melainkan pada pembatasan di layer network. Tiga kontrol berikut bersifat wajib, bukan opsional:
agentaddressdi-bind ke satu IP management saja — mencegah agent listen di segmen storage/iSCSI.rocommunitydiberi argumen source IP — membatasi query hanya dari IP NMS.- Firewall rule pada UDP 161 — pertahanan berlapis;
rocommunitybersifat application-level, paket tetap sampai ke daemon.
Yang dilarang:
- Community string
public/privateatau nilai yang mudah ditebak. - Direktif
rwcommunity(SNMP write). Dengan v2c, siapa pun yang dapat menyadap paket akan mampu mengubah konfigurasi perangkat. - Bind ke
0.0.0.0.
Rotasi community string: minimal per 12 bulan atau segera setelah ada perpindahan personel yang memegang akses.
4. Instalasi#
apt update
apt install -y snmpd snmpsnmp (client tools) diperlukan untuk verifikasi lokal via snmpwalk.
5. Konfigurasi snmpd.conf#
Backup konfigurasi bawaan terlebih dahulu:
cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.origIsi konfigurasi (/etc/snmp/snmpd.conf):
# Bind hanya ke IP management node ini, jangan 0.0.0.0
agentaddress udp:10.25.3.50:161
sysLocation DC Trimegah - Rack X
sysContact IT Infra <it@trimegah.co.id>
sysServices 72
# View penuh. Default Debian ("systemonly") hanya expose system + ifMIB,
# sehingga disk/CPU/hrStorage tidak terbaca oleh NMS
view all included .1 80
# Read-only, dibatasi ke IP NMS
rocommunity <SNMP_COMMUNITY> 10.25.4.69/32 -V all
# Subagent support (untuk integrasi AgentX di kemudian hari)
master agentx
# Health check komponen cluster (lihat bagian 6)
extend cluster-health /usr/local/bin/snmp-cluster-health.shPenjelasan direktif#
| Direktif | Alasan |
|---|---|
agentaddress udp:<IP>:161 | Membatasi listener ke interface management. Tanpa ini snmpd listen di semua interface, termasuk segmen iSCSI. |
view all included .1 80 | Mendefinisikan view yang mencakup seluruh OID tree. Diperlukan karena view bawaan Debian (systemonly) terlalu sempit. |
rocommunity <str> <src/32> -V all | Akses read-only, dibatasi source IP, memakai view all. Jika -V all dilewat, snmpd jatuh ke view default yang sempit — gejalanya NMS hanya mendapat uptime dan sysDescr. |
sysServices 72 | Menandakan host sebagai layer application + datalink. Beberapa NMS memakainya untuk klasifikasi device. |
master agentx | Mengaktifkan AgentX supaya subagent (misalnya BIND, dnsmasq) dapat menyuntikkan MIB tanpa mengubah snmpd. |
Aktivasi#
systemctl enable --now snmpd
systemctl status snmpd
ss -lunp | grep 161 # pastikan bind ke IP spesifik, bukan 0.0.0.06. Extend Script — Health Cluster#
MIB standar tidak memiliki objek untuk multipath, LVM, maupun sanlock. Mekanisme extend dari NET-SNMP dipakai untuk mengeksposnya sebagai OID.
Buat script:
cat > /usr/local/bin/snmp-cluster-health.sh <<'EOF'
#!/bin/bash
echo "multipath_ok=$(multipath -ll 2>/dev/null | grep -c 'active ready running')"
echo "multipath_failed=$(multipath -ll 2>/dev/null | grep -cE 'failed|faulty')"
echo "sanlock=$(systemctl is-active sanlock)"
echo "lvmlockd=$(systemctl is-active lvmlockd)"
echo "incus=$(systemctl is-active incus)"
echo "vgs_visible=$(vgs --noheadings 2>/dev/null | wc -l)"
EOF
chmod +x /usr/local/bin/snmp-cluster-health.sh
systemctl restart snmpdMetrik yang dihasilkan#
| Key | Arti | Kondisi alert |
|---|---|---|
multipath_ok | Jumlah path iSCSI aktif | Turun dari baseline node |
multipath_failed | Jumlah path failed/faulty | > 0 |
sanlock | Status service sanlock | != active |
lvmlockd | Status service lvmlockd | != active |
incus | Status daemon Incus | != active |
vgs_visible | Jumlah VG yang terlihat LVM | Turun dari baseline node |
Catatan khusus vgs_visible: metrik ini merupakan early warning untuk masalah global_filter pada /etc/lvm/lvm.conf. Jika filter salah, VG berhenti terlihat oleh LVM namun sistem tetap berjalan normal sampai node di-reboot — pada saat itu node gagal boot dan jatuh ke initramfs. Penurunan nilai vgs_visible memberi sinyal sebelum reboot terjadi.
Pembacaan via SNMP#
snmpwalk -v2c -c <SNMP_COMMUNITY> 10.25.3.50 \
'NET-SNMP-EXTEND-MIB::nsExtendOutputFull."cluster-health"'OID numerik untuk keperluan template NMS:
.1.3.6.1.4.1.8072.1.3.2.3.1.2."cluster-health"7. Firewall#
Batasi UDP 161 hanya dari IP NMS:
nft add rule inet filter input udp dport 161 ip saddr != 10.25.4.69 dropSesuaikan nama table/chain dengan struktur nftables yang berlaku pada node. Pastikan rule dipersistenkan (/etc/nftables.conf) agar bertahan setelah reboot.
8. Verifikasi#
Verifikasi wajib dijalankan dari host NMS, bukan dari localhost node. Query dari 127.0.0.1 dapat berhasil meskipun pembatasan source IP salah konfigurasi, sehingga menghasilkan false positive.
# Identitas host
snmpwalk -v2c -c <SNMP_COMMUNITY> 10.25.3.50 sysDescr
# Filesystem — memastikan view 'all' aktif
snmpwalk -v2c -c <SNMP_COMMUNITY> 10.25.3.50 hrStorageTable | head
# Jumlah interface — lihat catatan bagian 9
snmpwalk -v2c -c <SNMP_COMMUNITY> 10.25.3.50 ifDescr | wc -l
# Extend script
snmpwalk -v2c -c <SNMP_COMMUNITY> 10.25.3.50 \
'NET-SNMP-EXTEND-MIB::nsExtendOutputFull."cluster-health"'Checklist penerimaan per node#
-
systemctl is-active snmpd=active -
ss -lunp | grep 161menunjukkan bind ke IP management, bukan0.0.0.0 -
snmpwalkdari NMS berhasil mengembalikansysDescr -
hrStorageTablemengembalikan data (bukan kosong) - Output
cluster-healthterbaca lengkap 6 baris -
snmpwalkdari IP di luar whitelist timeout (uji negatif) - Firewall rule persisten setelah reboot
9. Registrasi di NMS#
Interface filtering — wajib#
Setiap instance Incus membuat interface veth* / tap*, ditambah VLAN trunk dan device multipath. Jumlah entri ifDescr dapat mencapai ratusan. Tanpa filter, NMS akan melakukan discovery terhadap seluruhnya sehingga menimbulkan:
- Beban polling yang tinggi dan tidak perlu
- Alert palsu setiap kali VM start/stop (interface muncul-hilang)
- Database port yang membengkak
Filter harus diterapkan di sisi NMS, karena net-snmp tidak menyediakan mekanisme untuk menyembunyikan interface.
- LibreNMS —
config.php:$config['bad_if_regexp'][] = '/^(veth|tap)/'; - Zabbix — tambahkan filter pada LLD rule “Network interface discovery”, macro
{#IFNAME}, operatordoes not match, expression^(veth|tap).
Item yang perlu dibuat manual#
Metrik dari extend tidak ter-discover otomatis. Buat item bertipe SNMP agent dengan OID .1.3.6.1.4.1.8072.1.3.2.3.1.2."cluster-health", lalu parsing tiap baris key=value menggunakan preprocessing (Zabbix) atau custom application/graph (LibreNMS).
10. Rollout ke Seluruh Node (Ansible)#
Konfigurasi manual per node tidak direkomendasikan — risiko drift antar node tinggi, dan drift pada file konfigurasi storage adalah penyebab kegagalan boot yang pernah terjadi pada cluster ini.
Struktur role minimal:
roles/snmpd/
├── defaults/main.yml # snmp_nms_ip, snmp_bind_ip (default: ansible_host)
├── files/snmp-cluster-health.sh
├── handlers/main.yml # restart snmpd
├── tasks/main.yml
└── templates/snmpd.conf.j2Poin penting dalam implementasi:
- Community string disimpan di Ansible Vault, tidak pernah masuk ke repo dalam bentuk plaintext.
agentaddressdi-generate dari{{ ansible_host }}agar tidak perlu variabel per host.- Script
snmp-cluster-health.shdi-deploy via modulcopydenganmode: '0755'. - Handler
restart snmpddipicu oleh perubahan template maupun script. - Migrasi ke SNMPv3 di masa depan hanya memerlukan perubahan pada template dan penambahan task pembuatan user — struktur role tidak berubah.
11. Troubleshooting#
| Gejala | Penyebab umum | Tindakan |
|---|---|---|
Timeout dari NMS, service active | Source IP di rocommunity salah, atau firewall drop | Cek rocommunity; jalankan tcpdump -i any udp port 161 saat NMS polling untuk memastikan paket tiba |
Hanya sysDescr & uptime yang terbaca | -V all tidak dipasang pada rocommunity | Tambahkan -V all, restart snmpd |
hrStorageTable kosong | View sempit, atau blok view all tidak terdefinisi | Verifikasi baris view all included .1 80 |
| snmpd gagal start | Syntax error, atau IP pada agentaddress belum up | snmpd -f -Le untuk melihat error di foreground |
| Berhasil dari localhost, gagal dari NMS | Pembatasan source IP salah — ini yang seharusnya terdeteksi | Uji ulang dari host NMS |
Output cluster-health kosong | Script tidak executable, atau multipath/vgs butuh path absolut | chmod +x; ganti ke path absolut (/usr/sbin/multipath) karena snmpd berjalan dengan PATH terbatas |
| Ratusan port muncul di NMS | Filter interface belum diterapkan | Lihat bagian 9 |
12. Referensi OID#
| Metrik | OID / MIB object |
|---|---|
| Deskripsi sistem | SNMPv2-MIB::sysDescr |
| Uptime | DISMAN-EVENT-MIB::sysUpTimeInstance |
| Load average | UCD-SNMP-MIB::laLoad |
| Memory | UCD-SNMP-MIB::memTotalReal, memAvailReal |
| CPU | UCD-SNMP-MIB::ssCpuRawUser/System/Idle |
| Filesystem | HOST-RESOURCES-MIB::hrStorageTable |
| Interface | IF-MIB::ifTable, ifXTable |
| Health cluster (custom) | NET-SNMP-EXTEND-MIB::nsExtendOutputFull."cluster-health" |
13. Changelog#
| Versi | Tanggal | Perubahan |
|---|---|---|
| 1.0 | 2026-07-27 | Dokumen awal. Deployment SNMPv2c + extend cluster-health pada node -01. |