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.