Zabbix Server Java Gateway JMX einrichten
Aus znilwiki
Hinweis
Auf dem Server / Proxy
Zabbix Server nach meiner Anleitung bis Ubuntu 14.04
Es fehlt dann nur noch die Java Runtime:
apt-get install openjdk-7-jdk
Egal ob Server oder Proxy, wichtig ist das bei der Konfiguration der Parameter --enable-java angegeben wurde (Beispiel Proxy):
./configure --enable-proxy --enable-agent --enable-java --with-mysql --with-net-snmp --with-libcurl --with-openipmi --with-ssh2 --with-libxml2 --enable-ipv6 --with-unixodbc
Das Zabbix-Java-Gateway muss separat zum Zabbix Server gestartet werden - und soll ja auch beim booten automatisch gestartet werden.
Hierzu erstellen wir die folgende Datei:
nano /etc/init.d/zabbix_java_gateway
mit dem folgenden Inhalt:
#!/bin/sh
#
# /etc/init.d/zabbix_java_gateway
### BEGIN INIT INFO
# Provides: zabbix_java_gateway
# Required-Start: $network $remote_fs $syslog
# Should-Start: $time
# Required-Stop: $syslog $remote_fs
# Should-Stop: $time ypbind smtp
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: ZABBIX Java Gateway
# Description: Start ZABBIX Java Gateway
### END INIT INFO
#Check for Java -
#export PATH=$PATH:<<JAVA_HOME>>/bin/
# zabbix details
ZABBIX_JAVAGW_START=/usr/local/sbin/zabbix_java/startup.sh
ZABBIX_JAVAGW_STOP=/usr/local/sbin/zabbix_java/shutdown.sh
PID=/tmp/zabbix_java.pid
test -f $ZABBIX_JAVAGW_START || exit 0
RETVAL=0
case "$1" in
start)
echo -n "Starting zabbix java gateway: "
$ZABBIX_JAVAGW_START
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/zabbix-java
;;
stop)
echo -n "Shutting down zabbix agent: "
$ZABBIX_JAVAGW_STOP
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/zabbix-java
;;
restart|reload)
$0 stop
$0 start
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
;;
esac
exit $RETVAL
Danach die folgenden Befehle ausführen:
chmod 755 /etc/init.d/zabbix_java_gateway update-rc.d zabbix_java_gateway defaults
Das Java-Gateway kann nun über den folgenden Befehl gestartet werden:
service zabbix_java_gateway start
Ob es wirklich läuft prüfen wir in der Prozessübersicht:
ps -Af | grep JavaGateway
Ausgabe:
root 4149 1 0 15:39 ? 00:00:03 java -server -classpath lib:lib/android-json-4.3_r3.1.jar:lib/logback-classic-0.9.27.jar:lib/logback-core-0.9.27.jar:lib/slf4j-api-1.6.1.jar:bin/zabbix-java-gateway-2.4.4.jar:bin/zabbix-java-gateway-2.4.6.jar:bin/zabbix-java-gateway-2.4.7.jar -Dzabbix.pidFile=/tmp/zabbix_java.pid com.zabbix.gateway.JavaGateway
Damit der Zabbix-Server das Java-Gateway auch nutzt muss dieses in der Konfigurationsdatei aktiviert werden:
nano /usr/local/etc/zabbix_server.conf oder nano /usr/local/etc/zabbix_proxy.conf
Und die folgenden Abschnitte anpassen:
### Option: JavaGateway # IP address (or hostname) of Zabbix Java gateway. # Only required if Java pollers are started. # # Mandatory: no # Default: # JavaGateway= JavaGateway=127.0.0.1 ### Option: JavaGatewayPort # Port that Zabbix Java gateway listens on. # # Mandatory: no # Range: 1024-32767 # Default: # JavaGatewayPort=10052 JavaGatewayPort=10052 ### Option: StartJavaPollers # Number of pre-forked instances of Java pollers. # # Mandatory: no # Range: 0-1000 # Default: # StartJavaPollers=0 StartJavaPollers=5
/sbin/zabbix_java/settings.sh
findet.Auf Systemen bei denen aus den Quellen installiert wurde sollte die Datei
/etc/zabbix/zabbix_java.conf
heißen.
Danach den Zabbix-Server / Zabbix-Proxy Dienst neu starten. Jetzt wäre auch ein guter Test den ganzen Server einmal neu zu starten.
service zabbix_server restart oder service zabbix_proxy restart
Anpassung der Hosts in Zabbix
Bei den Host die per JMX Überwacht werden sollen muss die JMX-Schnittstelle separat gepflegt werden (ähnlich der SNMP-Schnittstelle):
Der zu benutzende Port wird bei der Freischaltung in Java auf dem Host lokal festgelegt und muss deshalb immer richtig eingetragen werden.
Das Java auf den Hosts muss für diese Remote-Abfragen vorbereitet werden (dabei wird auch der zu benutzende Port festgelegt). Dies geschieht in dem beim Aufruf der Java-Applikation folgende zusätzlichen Parameter hinzugefügt werden:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Die vorstehenden Zeilen schalten die Abfragen ohne Passwortschutz auf dem Port 12345 frei.
Beim Tomcat würden wir die tomcat.conf bearbeiten und - falls vorhanden den Eintrag ergänzen, ansonsten einen neuen Eintrag machen:
JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
Soll eine vorherige Authentifizierung geschehen so ändern die Parameter sich wie folgt:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.access.file=/etc/jmxremote.access -Dcom.sun.management.jmxremote.password.file=/etc/jmxremote.password
Wiederum können die Abfragen über Port 7002 gestellt werden. Es sind dafür jedoch nur Benutzer zugelassen die in der Datei /etc/jmxremote.access aufgeführt sind. Die Benutzer selbst werden in der Datei /etc/jmxremote.password mit Benutzername und Passwort eingerichtet.
Deshalb müssen diese beiden Dateien wie folgt eingerichtet werden:
nano /etc/jmxremote.password
mit folgendem Inhalt:
zabbix Hbz7Huai
Damit gibt es den Benutzer zabbix mit dem Passwort Hbz7Huai
Nun vergeben wir die Berechtigungen für den Benutzer:
nano /etc/jmxremote.access
mit folgendem Inhalt:
zabbix readonly
Damit erhält der Benutzer zabbix Lesezugriff. Möglich ist auch der Wert readwrite womit dann auch Schreibzugriffe möglich sind.
Anpassung des Templates
Falls Ihr auf den Host die Überwachung ohne Passwort freigeschaltet habt müsst Ihr nichts machen.
Falls Ihr jedoch einen Benutzer und ein Passwort festgelegt habt so müsst Ihr diese dann in den Templates und bei den Abfragen mit angeben.
Bei Zabbix ist das Template
Template JMX Generic
dabei. Den Benutzernamen und das Passwort müsst Ihr dann bei jedem Item eintragen:
Natürlich könnt das auch per Mass Update machen - und dabei gleich Makros verwenden:
Und im Host oder im Template hinterlegt Ihr dann die Daten:
Probleme?
Bei manchen Kunden funktionierte das ganze nicht - wegen der Firewalls zwischen den Netzen.
Das Problem ist das während der Kommunikation nicht nur der angegebene Port - im obigen Beispiel 12345' - nutzt sondern noch dynamisch zusätzliche Ports.
Das kann man unterbinden indem man zusätzliche zu den obigen Parametern noch folgende beide hinzufügt:
-Djava.rmi.server.hostname=$REMOTE_HOST_IP_ADDR -Dcom.sun.management.jmxremote.rmi.port=12345
Für
$REMOTE_HOST_IP_ADDR
tragt die IP-Adresse des Hosts ein den Ihr überwacht, die Ihr beim Host unter JMX interfaces, NICHT die des Zabbix-Servers. NICHT 127.0.0.1 und auch NICHT 0.0.0.0
Danke an Roman S. für die Lösung!