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#

ParameterNilai
SNMP versionv2c (read-only)
Community stringDisimpan di Ansible Vault / password manager — tidak ditulis di dokumen ini
PortUDP 161
NMS / poller10.25.4.69
Paketsnmpd, snmp
File config/etc/snmp/snmpd.conf
Extend script/usr/local/bin/snmp-cluster-health.sh

Daftar node#

NodeIP ManagementStatus
trim-computes-shr-incus-0110.25.3.50Selesai
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:

  1. agentaddress di-bind ke satu IP management saja — mencegah agent listen di segmen storage/iSCSI.
  2. rocommunity diberi argumen source IP — membatasi query hanya dari IP NMS.
  3. Firewall rule pada UDP 161 — pertahanan berlapis; rocommunity bersifat application-level, paket tetap sampai ke daemon.

Yang dilarang:

  • Community string public / private atau 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 snmp

snmp (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.orig

Isi 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.sh

Penjelasan direktif#

DirektifAlasan
agentaddress udp:<IP>:161Membatasi listener ke interface management. Tanpa ini snmpd listen di semua interface, termasuk segmen iSCSI.
view all included .1 80Mendefinisikan view yang mencakup seluruh OID tree. Diperlukan karena view bawaan Debian (systemonly) terlalu sempit.
rocommunity <str> <src/32> -V allAkses 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 72Menandakan host sebagai layer application + datalink. Beberapa NMS memakainya untuk klasifikasi device.
master agentxMengaktifkan 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.0

6. 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 snmpd

Metrik yang dihasilkan#

KeyArtiKondisi alert
multipath_okJumlah path iSCSI aktifTurun dari baseline node
multipath_failedJumlah path failed/faulty> 0
sanlockStatus service sanlock!= active
lvmlockdStatus service lvmlockd!= active
incusStatus daemon Incus!= active
vgs_visibleJumlah VG yang terlihat LVMTurun 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 drop

Sesuaikan 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 161 menunjukkan bind ke IP management, bukan 0.0.0.0
  • snmpwalk dari NMS berhasil mengembalikan sysDescr
  • hrStorageTable mengembalikan data (bukan kosong)
  • Output cluster-health terbaca lengkap 6 baris
  • snmpwalk dari 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.

  • LibreNMSconfig.php:
    $config['bad_if_regexp'][] = '/^(veth|tap)/';
  • Zabbix — tambahkan filter pada LLD rule “Network interface discovery”, macro {#IFNAME}, operator does 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.j2

Poin penting dalam implementasi:

  • Community string disimpan di Ansible Vault, tidak pernah masuk ke repo dalam bentuk plaintext.
  • agentaddress di-generate dari {{ ansible_host }} agar tidak perlu variabel per host.
  • Script snmp-cluster-health.sh di-deploy via modul copy dengan mode: '0755'.
  • Handler restart snmpd dipicu 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#

GejalaPenyebab umumTindakan
Timeout dari NMS, service activeSource IP di rocommunity salah, atau firewall dropCek 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 rocommunityTambahkan -V all, restart snmpd
hrStorageTable kosongView sempit, atau blok view all tidak terdefinisiVerifikasi baris view all included .1 80
snmpd gagal startSyntax error, atau IP pada agentaddress belum upsnmpd -f -Le untuk melihat error di foreground
Berhasil dari localhost, gagal dari NMSPembatasan source IP salah — ini yang seharusnya terdeteksiUji ulang dari host NMS
Output cluster-health kosongScript tidak executable, atau multipath/vgs butuh path absolutchmod +x; ganti ke path absolut (/usr/sbin/multipath) karena snmpd berjalan dengan PATH terbatas
Ratusan port muncul di NMSFilter interface belum diterapkanLihat bagian 9

12. Referensi OID#

MetrikOID / MIB object
Deskripsi sistemSNMPv2-MIB::sysDescr
UptimeDISMAN-EVENT-MIB::sysUpTimeInstance
Load averageUCD-SNMP-MIB::laLoad
MemoryUCD-SNMP-MIB::memTotalReal, memAvailReal
CPUUCD-SNMP-MIB::ssCpuRawUser/System/Idle
FilesystemHOST-RESOURCES-MIB::hrStorageTable
InterfaceIF-MIB::ifTable, ifXTable
Health cluster (custom)NET-SNMP-EXTEND-MIB::nsExtendOutputFull."cluster-health"

13. Changelog#

VersiTanggalPerubahan
1.02026-07-27Dokumen awal. Deployment SNMPv2c + extend cluster-health pada node -01.