[[server:zabbix]]

Zabbix

Zabbix ist ein Monitoringsystem das auf Agents basiert. Besonders die von Haus aus enthaltenen Graphen und Templates mit Autodiscovery von z.B. mountpoints sind von Vorteil.

:!: Diese Seite basiert auf Zabbix Version 3.4.

Installation

Für die Installation kann auf Automatisierung zurückgegriffen werden: * Ansible Rollen: zabbix-agent / zabbix-server / zabbix-web / zabbix-proxy / zabbix-javagateway * puppet module

Händische Installation: Passendes Paket auf zabbix.com herunterladen.

Beispiel für:

Debian Stretch + Zabbix 3.4.1:

wget https://repo.zabbix.com/zabbix/3.4/debian/pool/main/z/zabbix-release/zabbix-release_3.4-1+stretch_all.deb
dpkg -i zabbix-release_3.4-1+stretch_all.deb
apt update

Debian Jessie + Zabbix 3.4.1:

wget https://repo.zabbix.com/zabbix/3.4/debian/pool/main/z/zabbix-release/zabbix-release_3.4-1+jessie_all.deb
dpkg -i zabbix-release_3.4-1+jessie_all.deb
apt update

Weiter mit der Sektion 2 „Install and configure Zabbix server“ machen.

apt install zabbix-agent
systemctl stop zabbix-agent.service
# check if still running:
lsof -i -n | grep zab
 
mv /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.dist

Neue Config: /etc/zabbix/zabbix_agentd.conf

# my Zabbix config
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
# size of Logfile in MB, Range: 0-1024; 0 means "disable automatic log rotation"
LogFileSize=100
# Source IP address for outgoing connections
# SourceIP=
EnableRemoteCommands=1
ListenPort=10050
# Unique, case sensitive hostname.
# Required for active checks and must match hostname as configured on the server.
# Value is acquired from HostnameItem (default: HostnameItem=system.hostname) if undefined: 
Hostname=MY.HOSTNAME.DOMAIN.TLD
Server=1.2.3.4/32
ServerActive=1.2.3.4/32
systemctl start zabbix-agent.service
systemctl enable zabbix-agent.service
  1. Konfiguration anpassen „C:\Program Files\Zabbix\config\zabbix-agentd.conf“
  2. Dienst einrichten (cmd.exe) – hierbei beachten, daß die Bindestriche Unterstriche sein müssen (zabbix_agentd)C:\Program Files\Zabbix\win<32|64>/zabbix-agentd -c „C:\Program Files\Zabbix\config\zabbix-agentd.conf“ -i
  3. Dienst starten:
    1. Server-Manager→ Konfiguration→ Dienste Zabbix Agent
    2. →Starten

Unter CentOS ist standardmäßig die Firewall aktiv, folgende Ports/Befehle:

# server/webinterface:
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
# server/proxy:
firewall-cmd --zone=public --add-port=10051/tcp --permanent
# agent:
firewall-cmd --zone=public --add-port=10050/tcp --permanent
firewall-cmd --reload

Wenn keine Verbindung zum Server zustande kommt kann auch selinux das „Problem“ sein:

Status prüfen: sestatus

Im enforcing-modus fehlen u.U. Fähigkeiten:

getsebool -a|grep zabbix Ausgabe:

httpd_can_connect_zabbix --> off
zabbix_can_network --> off

…auf on setzen: setsebool -P httpd_can_connect_zabbix on setsebool -P zabbix_can_network on

Alle Befehle ohne Passwort erlauben (nicht empfohlen):

zabbix ALL=NOPASSWD: ALL

Ausgewählte Befehle erlauben:

zabbix ALL=NOPASSWD: /etc/init.d/apache restart

Konfiguration

PHP-Konfiguration_

date.timezone = Europe/Berlin
max_execution_time = 300

Der Installationsassistent findet sich unter http://SERVER.TLD/zabbix/

Konfigurationsdatei (/usr/share/zabbix/conf/zabbix.conf.php; bei CentOS /etc/zabbix/web/zabbix.conf.php):

<?php
global $DB_TYPE, $DB_SERVER, $DB_PORT, $DB_DATABASE, $DB_USER, $DB_PASSWORD, $IMAGE_FORMAT_DEFAULT;
 
$DB_TYPE	= "MYSQL";
$DB_SERVER	= "localhost";
$DB_PORT	= "0";
$DB_DATABASE	= "zabbix";
$DB_USER	= "zabbix";
$DB_PASSWORD	= "Passwort";
 
$IMAGE_FORMAT_DEFAULT	= IMAGE_FORMAT_PNG;
?>

Danach ist der Login mit Admin und Passwort Zabbix möglich.

Zabbix meldet wenn bestimmt Poller ausgelastet sind (viele Proxies, viele System nicht erreichbar etc.)

StartPollers=100
# für passive proxies:
StartProxyPollers=5
StartHTTPPollers=5

Anschließend könnte mysql in Bedrängnis geraten weil Zabbix zu viele Datenbankverbindungen anfordert (in dermy.cnf):

[mysqld]
max_connections = 500

Es wird benutzt:

Vorgehensweise:

  1. Bot bei Telegram anlegen
    1. dazu im Client mit BotFather eine neue Konversation starten, der Befehl ist: /newbot
    2. es führt ein Assistent durch die Einrichtung: man muss einen Benutzernamen eingeben der auf „bot“ endet
    3. …und bekommt am Ende einen token für die HTTP API (z.B. 124226418:BCF9EoD6k10O5qNDfhBL0ofneQ4OfIux5Fo)
  2. Skript ablegen in /usr/lib/zabbix/alertscripts
    #!/bin/sh
    # to must be $chat_id or "@username":
    to=$1 
    subject=$2
    body=$3
     
    botID="124226418:BCF9EoD6k10O5qNDfhBL0ofneQ4OfIux5Fo"
     
    curl -X POST --retry 5 --retry-delay 0 --retry-max-time 60 --data-urlencode "chat_id=$1" --data-urlencode "text=$2 $3" "https://api.telegram.org/$botID/sendMessage?disable_web_page_preview=true"
    if [ $? -ne 0 ]; then
            exit 1
    fi
  3. Im Monitoring-System: Administration → Media-types → Create Media Type
    1. Name: Telegram
    2. Type: Skript
    3. Script name: $Dateiname (ohne Pfad!)
    4. Script parameters:
      1. {ALERT.SENDTO}
      2. {ALERT.SUBJECT}
      3. {ALERT.MESSAGE}
    5. Options entsprechend ausfüllen
  4. Im Monitoring-System: Administration → Users → $Benutzername → Media → Add
    1. Type: Telegram
    2. Send to: $Benutzername (aus Telegram) oder die $ChatID

Welche Lokales angezeigt werden legt einseits der Translation status fest (muss mindestens 75% übersetzt sein):

/usr/share/zabbix/include/locales.inc.php :

function getLocales() {
	return [
		'en_GB' => ['name' => _('English (en_GB)'),	'display' => true],
		'en_US' => ['name' => _('English (en_US)'),	'display' => true],
		'bg_BG' => ['name' => _('Bulgarian (bg_BG)'),	'display' => false],
		'ca_ES' => ['name' => _('Catalan (ca_ES)'),	'display' => false],
		'zh_CN' => ['name' => _('Chinese (zh_CN)'),	'display' => false],
		'zh_TW' => ['name' => _('Chinese (zh_TW)'),	'display' => false],
		'cs_CZ' => ['name' => _('Czech (cs_CZ)'),	'display' => false],
		'nl_NL' => ['name' => _('Dutch (nl_NL)'),	'display' => false],
		'fi_FI' => ['name' => _('Finnish (fi_FI)'),	'display' => false],
		'fr_FR' => ['name' => _('French (fr_FR)'),	'display' => true],
		'ka_GE' => ['name' => _('Georgian (ka_GE)'),	'display' => false],
		'de_DE' => ['name' => _('German (de_DE)'),	'display' => true],
		'el_GR' => ['name' => _('Greek (el_GR)'),	'display' => false],
		'he_IL' => ['name' => _('Hebrew (he_IL)'),	'display' => false],
		'hu_HU' => ['name' => _('Hungarian (hu_HU)'),	'display' => false],
		'id_ID' => ['name' => _('Indonesian (id_ID)'),	'display' => false],
		'it_IT' => ['name' => _('Italian (it_IT)'),	'display' => true],
		'ko_KR' => ['name' => _('Korean (ko_KR)'),	'display' => false],
		'ja_JP' => ['name' => _('Japanese (ja_JP)'),	'display' => false],
		'lv_LV' => ['name' => _('Latvian (lv_LV)'),	'display' => false],
		'lt_LT' => ['name' => _('Lithuanian (lt_LT)'),	'display' => false],
		'nb_NO' => ['name' => _('Norwegian (nb_NO)'),	'display' => false],
		'fa_IR' => ['name' => _('Persian (fa_IR)'),	'display' => false],
		'pl_PL' => ['name' => _('Polish (pl_PL)'),	'display' => false],
		'pt_BR' => ['name' => _('Portuguese (pt_BR)'),	'display' => false],
		'pt_PT' => ['name' => _('Portuguese (pt_PT)'),	'display' => false],
		'ro_RO' => ['name' => _('Romanian (ro_RO)'),	'display' => false],
		'ru_RU' => ['name' => _('Russian (ru_RU)'),	'display' => false],
		'sk_SK' => ['name' => _('Slovak (sk_SK)'),	'display' => false],
		'es_ES' => ['name' => _('Spanish (es_ES)'),	'display' => true],
		'sv_SE' => ['name' => _('Swedish (sv_SE)'),	'display' => false],
		'tr_TR' => ['name' => _('Turkish (tr_TR)'),	'display' => false],
		'uk_UA' => ['name' => _('Ukrainian (uk_UA)'),	'display' => false],
		'vi_VN' => ['name' => _('Vietnamese (vi_VN)'),	'display' => false]
	];
}

…aber auch die Lokales die im System vorhanden sind. Bei Debian/Ubuntu lässt sich das zu festlegen (die obigen Codes z.B. „de_DE“ müssen in der UTF8-Variante vorhanden sein):

dpkg-reconfigure locales

Möchte man keine CA für die Absicherung der Kommunikation zwischen Server und dem Agent einsetzen, so sind alternativ pre-shared keys (PSK) möglich. Siehe auch: Using pre-shared keys.

# 32Byte / 256 Bit-Zufallszeichenkette erzeugen:
openssl rand -hex 32 > /etc/zabbix/zabbix.psk
chmod 600 /etc/zabbix/zabbix.psk
chown zabbix.zabbix /etc/zabbix/zabbix.psk

Den Inhalt von /etc/zabbix/zabbix.psk auf dem Server/Proxy eintragen (Karteikarte encryption, Methode umstellen!):

/etc/zabbix/zabbix_agentd.conf:

TLSConnect=psk
TLSAccept=psk
TLSPSKFile=/etc/zabbix/zabbix.psk
TLSPSKIdentity=$SERVERNAME_oder_anderer_String
systemctl restart zabbix-agent.service
Noch eine letzte Warnung zu duplizierten Identitäten: Es darf wirklich immer nur eine eindeutige Kombination von Identity (Benutzernamen) und Passwort geben. Wird die Identity nochmal irgendwo mit einem anderen Passwort verwendet, dann werden die Daten nicht an den Server/Proxy übertragen obwohl der agent-ping noch funktioniert. Hinweis aus der Doku: „It is a user responsibility to ensure that there are no two PSKs with the same identity string but different values. Failing to do so may lead to unpredictable disruptions of communication between Zabbix components using PSKs with this PSK identity string“.

E-Mail-Einstellungen (Server ausgehend)