Host elérhetőség ellenőrzés: sshping

A werkstatt sorozat hatodik része – egy eszköz ami YAML konfigból párhuzamosan ellenőrzi a szerverek elérhetőségét.

Host elérhetőség ellenőrzés: sshping

Van hat szervered. Reggel bekapcsolod a gépet, és tudni akarod hogy minden fut-e. SSH-zol mindegyikre egyesével? Ping-elsz hatszor? Vagy írsz egy eszközt ami egyetlen paranccsal megmondja.

Az sshping egy YAML fájlból olvassa a hostokat és párhuzamosan ellenőrzi mindegyiket. Nem az SSH protokollt használja – TCP kapcsolatot nyit a megadott porton. Ha válaszol, él. Ha nem, jelzi. A név félrevezető, de a lényeg nem az SSH hanem a gyors elérhetőség-ellenőrzés.

A deployer rokona

Az sshping a deployer-rel közös mintát követ: YAML konfig, validáció, interface-alapú tesztelés. A konfiguráció hasonlóan egyszerű:

hosts:
  - name: media server
    address: 10.0.0.19
    port: 22
  - name: router
    address: 10.0.0.1
    port: 22

A különbség az hogy a deployer compose stackeket kezel, az sshping pedig csak ellenőriz és jelent. Ez szándékos – egy monitoring eszköznek nem szabad módosítania a rendszert.

A dialer interface

A deployer-nél a runner interface absztrahálta a parancs futtatást. Az sshping-nél a dialer interface absztrahálja a TCP kapcsolatot:

type dialer interface {
    dial(address string, timeout time.Duration) (bool, time.Duration)
}

A valódi implementáció a tcpDialer ami ténylegesen kapcsolódik. A tesztekben a mockDialer előre megadott eredményt ad. Ugyanaz a minta mint a deployer-ben – és ez nem véletlen. Ha egyszer megtanulod az interface-alapú dependency injection-t, mindenhol alkalmazhatod.

Exit code mint monitoring jel

Az sshping nem csak kiírja az eredményt – az exit code-ján is jelzi. Ha minden host elérhető, 0. Ha bármelyik nem elérhető, 1. Ha konfig hiba van, 2.

Ez azért fontos, mert cron-ból futtatva a script alapján riasztást küldhetsz:

sshping --no-color || ntfy pub monitoring "sshping: host(s) unreachable"

A --no-color flag a cron kimenethez kell – ANSI escape kódok nélkül a log olvasható marad.

Párhuzamos ellenőrzés

Tíz host szekvenciális ellenőrzése 2 másodperces timeout-tal 20 másodpercig tartana. Az sshping goroutine-okkal párhuzamosan végzi – tíz host is 2 másodperc alatt kész.

A minta ugyanaz mint a portspy-ban és a netmapper-ben: WaitGroup a szinkronizációhoz, channel az eredmények gyűjtéséhez. A harmadik projekt ami ezt használja, és mostanra már természetesnek érződik.

Konfig validáció

A deployer-ben tanultam meg hogy a konfig validáció mennyire fontos. Az sshping-nél ugyanaz a minta: a validateConfig induláskor ellenőrzi hogy minden hostnak van-e neve, címe, és érvényes portja. Jobb egy “host 3 has no address” hibaüzenet induláskor mint egy “nil pointer” futásidőben.

Mit tanultam?

Az sshping megerősítette a deployer mintáit – YAML konfig, interface-alapú tesztelés, validáció. De egy új elemet is hozott: az exit code mint monitoring eszköz.

Ez a gondolkodásmód-váltás ami a tanulási projektet valódi eszközzé teszi. Nem elég hogy kiírja az eredményt – integrálhatónak kell lennie. Cron, ntfy, monitoring pipeline – az exit code az univerzális jelzés.

Hogyan próbáld ki?

git clone https://github.com/brtkcs/werkstatt-tools.git
cd werkstatt-tools/sshping
go mod tidy

Hozz létre egy hosts.yaml-t a saját szervereidhez:

hosts:
  - name: router
    address: 10.0.0.1
    port: 22
  - name: nas
    address: 10.0.0.10
    port: 22

Aztán:

go run main.go

A teljes forráskód a werkstatt-tools repóban.

Ez a werkstatt sorozat hatodik része. A portspy portokat scannelt, az sshping azt kérdezi: él-e egyáltalán a szerver? YAML konfig, mock interface, és exit code ami cron-ból is használható.