Zabbix
PostgreSQL
Создание пользователя и базы:
CREATE USER zabbix WITH PASSWORD 'zabbixpassword';
CREATE DATABASE zabbix
OWNER zabbix
TEMPLATE template0;
Docker
https://www.zabbix.com/documentation/current/ru/manual/installation/containers
Инициализация:
VOLPATH=/data/docker/zabbix-proxy
mkdir -p $VOLPATH/enc
openssl rand -hex 32 | tee $VOLPATH/enc/psk.key
touch $VOLPATH/docker-compose.yaml
docker-compose.yaml:
version: '3.5'
volumes:
db_data: {}
services:
zabbix-server:
image: zabbix/zabbix-proxy-sqlite3:5.0-alpine-latest
environment:
- ZBX_HOSTNAME=zabbix-proxy.domain.com
- ZBX_SERVER_HOST=zabbix.domain.com
- ZBX_PROXYMODE=1 # 1-passive, 0-active
- ZBX_TLSCONNECT=psk
- ZBX_TLSACCEPT=psk
- ZBX_TLSPSKIDENTITY=PSK IDENTITY 001
- ZBX_TLSPSKFILE=psk.key
volumes:
- ${VOLPATH-/data/docker/zabbix-proxy}/enc:/var/lib/zabbix/enc
- db_data:/var/lib/zabbix/db_data
ports:
- mode: host
protocol: tcp
published: 10051
target: 10051
stop_grace_period: 10s
deploy:
resources:
limits:
memory: 256m
Запуск:
#swarm
docker stack deploy --compose-file docker-compose.yaml zabbix-proxy
Триггеры / Triggers
Zabbix poller processes more than 75% busy
Необходимо увеличить количество запускаемых процессов Zabbix сервером в /etc/zabbix/zabbix_server.conf, например:
StartPollers=20
Увеличение процессов ведет к увеличению потребления ресурсов.
PSK
Agent
Тестировать подключение к клиенту с сервера:
zabbix_get -k agent.ping -s zabbix-agent
Windows
$ZABBIXVERSION="6.0.21"
$ZABBIXSERVER="zabbixproxy.domain.com"
$PSKKEY="0a7393cbe41516b0e3885237ee210a6997c9cce9c3324d0f020aebc26277acf8"
$PSKIDENT="NAME 001"
function zabbix{
$URL="https://cdn.zabbix.com/zabbix/binaries/stable/6.0/$ZABBIXVERSION/zabbix_agent2-$ZABBIXVERSION-windows-amd64-openssl-static.zip"
$ZABBIXPATH="$env:PROGRAMFILES\Zabbix Agent 2"
$ZABBIXCONFIG="$ZABBIXPATH/conf/zabbix_agent2.conf"
$Filename = [System.IO.Path]::GetFileName($URL)
if (!(Test-Path "$env:Temp\$Filename")){
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$dl = New-Object net.webclient
$dl.Downloadfile($URL, "$env:Temp\$Filename")
}
if (!(Test-Path "$env:Temp\$Filename")){exit 1}
#& msiexec /l*v "$env:Temp\$Filename.log" /i "$env:Temp\$Filename" /qn /norestart LOGFILE=`"$ZABBIXPATH\zabix_agentd2.log`" SERVER=`"$ZABBIXSERVER`" SERVERACTIVE=`"$ZABBIXSERVER`" LISTENPORT=`"$ZABBIXAGENTPORT`" HOSTNAME=`"$env:COMPUTERNAME`" TLSCONNECT=psk TLSACCEPT=psk TLSPSKIDENTITY=`"$PSKIDENT`" TLSPSKVALUE=`"$PSKKEY`"
if (Get-Service "Zabbix Agent 2" -ErrorAction Ignore){Stop-Service -Name "Zabbix Agent 2"}
if (Test-Path -Path $ZABBIXPATH/bin/zabbix_agent2.exe.old -ErrorAction Ignore){Remove-Item $ZABBIXPATH/bin/zabbix_agent2.exe.old -Force}
if (Test-Path -Path $ZABBIXPATH/bin/zabbix_agent2.exe -ErrorAction Ignore){Rename-Item -Path $ZABBIXPATH/bin/zabbix_agent2.exe -NewName zabbix_agent2.exe.old}
if (Test-Path -Path "$env:Temp\zabbix"){Remove-Item "$env:Temp\zabbix" -Force -Recurse}
Add-Type -AssemblyName System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::ExtractToDirectory("$env:Temp\$Filename","$env:Temp\zabbix")
if (Test-Path -Path $ZABBIXPATH){Remove-Item $ZABBIXPATH -Force -Recurse -ErrorAction Ignore}
if (!(Test-Path $ZABBIXPATH)){New-Item $ZABBIXPATH -type directory -Force}
Move-Item -Path "$env:Temp\zabbix\*" -Destination $ZABBIXPATH -Force
Get-ChildItem -Path $ZABBIXPATH -Directory | Remove-Item -Force -Recurse
if (!($ZABBIXAGENTPORT)){$ZABBIXAGENTPORT=10050}
(Get-Content $ZABBIXCONFIG) -replace '^[#\s]*LogFile=.*' , "LogFile=$ZABBIXPATH\zabix_agentd2.log" | Set-Content $ZABBIXCONFIG
(Get-Content $ZABBIXCONFIG) -replace '^Server=.*' , "Server=$ZABBIXSERVER" | Set-Content $ZABBIXCONFIG
(Get-Content $ZABBIXCONFIG) -replace '^[#\s]*ListenPort=.*' , "ListenPort=$ZABBIXAGENTPORT" | Set-Content $ZABBIXCONFIG
(Get-Content $ZABBIXCONFIG) -replace '^ServerActive=.*' , "ServerActive=$ZABBIXSERVER" | Set-Content $ZABBIXCONFIG
(Get-Content $ZABBIXCONFIG) -replace '^Hostname=',"Hostname=" | Set-Content $ZABBIXCONFIG
(Get-Content $ZABBIXCONFIG) -replace '^[#\s]*TLSConnect=.*',"TLSConnect=psk" | Set-Content $ZABBIXCONFIG
(Get-Content $ZABBIXCONFIG) -replace '^[#\s]*TLSAccept=.*',"TLSAccept=psk" | Set-Content $ZABBIXCONFIG
(Get-Content $ZABBIXCONFIG) -replace '^[#\s]*TLSPSKIdentity=.*',"TLSPSKIdentity=$PSKIDENT" | Set-Content $ZABBIXCONFIG
Write-Output "$PSKKEY" | Set-Content $ZABBIXPATH\bin\psk.key
(Get-Content $ZABBIXCONFIG) -replace '^[#\s]*TLSPSKFile=.*',"TLSPSKFile=$ZABBIXPATH\bin\psk.key" | Set-Content $ZABBIXCONFIG
if (Get-NetFirewallRule -DisplayName 'Zabbix Agent' -ErrorAction Ignore){Remove-NetFirewallRule -DisplayName 'Zabbix Agent'}
New-NetFirewallRule -Name zabbixagent -DisplayName 'Zabbix Agent' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort $ZABBIXAGENTPORT
if (!(Get-Service "Zabbix Agent 2" -ErrorAction Ignore)){& "$ZABBIXPATH\bin\zabbix_agent2.exe" --install --config "$ZABBIXCONFIG"}
sc.exe failure "Zabbix Agent 2" actions= restart/180000/restart/180000/restart/180000 reset= 86400;
Restart-Service -Name "Zabbix Agent 2"
if (Test-Path -Path $ZABBIXPATH/bin/zabbix_agent2.exe.old -ErrorAction Ignore){Remove-Item $ZABBIXPATH/bin/zabbix_agent2.exe.old -Force}
Write-Host 'Version:' (Get-Item $ZABBIXPATH/bin/zabbix_agent2.exe).VersionInfo.ProductVersion
}
zabbix
Ubuntu
#!/bin/bash
ZABBIXSERVER="zabbixproxy.domain.com"
PSKKEY="0a7393cbe41516b0e3885237ee210a6997c9cce9c3324d0f020aebc26277acf8"
PSKIDENT="NAME 001"
zabbix(){
if [ "$1" == "buster" ]; then
URL="https://repo.zabbix.com/zabbix/5.0/debian/pool/main/z/zabbix-release/zabbix-release_5.0-1+buster_all.deb"
else
URL="https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb"
fi
wget $URL -O /tmp/zabbix-release.deb
dpkg -i /tmp/zabbix-release.deb
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install zabbix-agent2 -y
sed -i "/^Server/s/=.*/=$ZABBIXSERVER/" /etc/zabbix/zabbix_agent2.conf
sed -i "/^Hostname=/s/=.*/=$HOSTNAME/" /etc/zabbix/zabbix_agent2.conf
if [ $ZABBIXAGENTPORT ]; then
sed -i "/ListenPort=/s/.*/ListenPort=$ZABBIXAGENTPORT/" /etc/zabbix/zabbix_agent2.conf
fi
sed -i "/TLSConnect=/s/.*/TLSConnect=psk/" /etc/zabbix/zabbix_agent2.conf
sed -i "/TLSAccept=/s/.*/TLSAccept=psk/" /etc/zabbix/zabbix_agent2.conf
sed -i "/TLSPSKIdentity=/s/.*/TLSPSKIdentity=$PSKIDENT/" /etc/zabbix/zabbix_agent2.conf
echo "$PSKKEY" > /etc/zabbix/psk.key
sed -i "/TLSPSKFile=/s/.*/TLSPSKFile=\/etc\/zabbix\/psk.key/" /etc/zabbix/zabbix_agent2.conf
systemctl enable zabbix-agent2
systemctl restart zabbix-agent2
}
zabbix
IPMI
Для поддержки IPMI установить OpenIPMI с поддержкой OpenSSL.
Для проверки:
ipmitool -I lanplus -H remote_ip_hostname -U zabbixuser -P zabbixpassword -L USER sensor
ODBC
Web Monitoring
Ошибки
Get value from agent failed: ZBX_TCP_READ() failed: [4] Interrupted system call
Регистрируется в /var/log/zabbix/zabbix_server.log
Необходимо увеличить Timeout (сек, по умолчанию: 3) в конфигурации агента или на самом сервере.
Unsupported charset or collation for tables / Неподдерживаемая кодовая страница или тип сравнения для таблиц
Решение
Создать sql запрос для потабличного изменения кодировки:
SELECT CONCAT( 'ALTER TABLE `', t.`TABLE_SCHEMA` , '`.`', t.`TABLE_NAME` , '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;' ) AS sqlcode
FROM `information_schema`.`TABLES` t
WHERE 1
AND t.`TABLE_SCHEMA` = 'zabbix'
ORDER BY 1
LIMIT 0 , 180;
https://serveradmin.ru/oshibka-v-zabbix-nepodderzhivaemaya-kodovaya-stranicza/
Шаблоны
APC
Добавляем Преобразование значений в Администрирование > Общие
Имя:
APC Battery Replace Indicator
Соответствия:
1 - noBatteryNeedsReplacing
2 - batteryNeedsReplacing
Имя:
APC Battery Output Status
1 - unknown
2 - onLine
3 - onBattery
4 - onSmartBoost
5 - timedSleeping
6 - softwareBypass
7 - off
8 - rebooting
9 - switchedBypass
10 - hardwareFailureBypass
11 - sleepingUntilPowerReturn
12 - onSmartTrim
и импортируем шаблон apc в zabbix.
Добавляем snmp MIB (Стандартные и PowerNet-MIB) в систему.
http://wiki.soulruins.info/docs/zabbix/templates/smartups
AD
Устанавливаем шаблон ad в zabbix.
Bind
В /etc/bind/named.conf добавить
statistics-channels {
inet 127.0.0.1 port 8053 allow { 127.0.0.1; };
};
На сервере с установленным bind установить:
sudo apt-get install xml2
Проверка:
curl -s http://localhost:8053/ 2>/dev/null | xml2 | grep -A1 -E 'queries|=Qry'
Добавляем в /etc/zabbix/zabbix_agentd.conf:
UserParameter=bind.queries.in[*],curl -s http://localhost:8053/ 2>/dev/null | xml2 | grep -A1 -i "/isc/bind/statistics/server/queries-in/rdtype/name=$1$" | tail -1 | cut -d= -f2
UserParameter=bind.queries.out[*],curl -s http://localhost:8053/ 2>/dev/null | xml2 | grep -A1 -i "/isc/bind/statistics/views/view/rdtype/name=$1$" | tail -1 | cut -d= -f2
UserParameter=bind.stats.query[*],curl -s http://localhost:8053/ 2>/dev/null | xml2 | grep -A1 -i "/isc/bind/statistics/server/nsstat/name=Qry$1" | tail -1 | cut -d= -f2
UserParameter=bind.net.udp,netstat -nua | grep :53 | wc -l
UserParameter=bind.net.tcp,netstat -nta | grep :53 | wc -l
Устанавливаем шаблон bind в zabbix.
https://github.com/angel2s2/zabbix/tree/master/bind
DHCP
Создаем /etc/zabbix/externalscripts/dhcp_stat.sh:
Нажмите, чтобы отобразить
#!/bin/bash
#Количество актуальных выданных IP адресов
#или однострочник: d1=`date +%s`; while read d2; do test $d2 -gt $d1 && echo $d2; done < <( sed -rn 's/ends 5 //; T; s/^\s+//; s/;//; p' /var/lib/dhcp/dhcpd.leases | date +%s -f - ) | wc -l
# sed '/ends/!d; s/ends 5 //; s/^\s*//; s/;//'
leaseend=( `sed -rn 's/ends . //; T; s/^\s+//; s/;//; p' /var/lib/dhcp/dhcpd.leases | date +%s -f -` )
curdate=`date +%s`
leasecount=0
count=${#leaseend[*]}
index=0
while [ "$index" -lt "$count" ]
do
if (( ${leaseend[$index]} +18000 > $curdate )); then #В dhcpd.leases часовой пояс UTC поэтому +18000сек
let "leasecount = $leasecount + 1"
fi
let "index = $index + 1"
done
echo $leasecount
exit 0
Создаем /etc/zabbix/zabbix_agentd.d/dhcp.conf:
UserParameter=dhcp.lease,/etc/zabbix/externalscripts/dhcp_stat.sh
Одной командой:
echo "UserParameter=dhcp.lease,/etc/zabbix/externalscripts/dhcp_stat.sh" | sudo tee /etc/zabbix/zabbix_agentd.d/dhcp.conf
Устанавливаем шаблон dhcp в zabbix.
Disk
Устанавливаем sysstat:
sudo apt-get install sysstat
Создаем /etc/zabbix/externalscripts/iostat-collect.sh:
Нажмите, чтобы отобразить
#!/usr/bin/env bash
# Description: Script for iostat monitoring
# Author: Epikhin Mikhail michael@nomanlab.org
# Revision 1: Lesovsky A.V. lesovsky@gmail.com
SECONDS=$2
TOFILE=$1
IOSTAT="/usr/bin/iostat"
[[ $# -lt 2 ]] && { echo "FATAL: some parameters not specified"; exit 1; }
DISK=$($IOSTAT -x 1 $SECONDS | awk 'BEGIN {check=0;} {if(check==1 && $1=="avg-cpu:"){check=0}if(check==1 && $1!=""){print $0}if($1=="Device:"){check=1}}' | tr '\n' '|')
echo $DISK | sed 's/|/\n/g' > $TOFILE
echo 0
Создаем /etc/zabbix/externalscripts/iostat-parse.sh:
Нажмите, чтобы отобразить
#!/usr/bin/env bash
# Description: Script for disk monitoring
# Author: Epikhin Mikhail michael@nomanlab.org
# Revision 1: Lesovsky A.V. lesovsky@gmail.com
NUMBER=0
FROMFILE=$1
DISK=$2
METRIC=$3
[[ $# -lt 3 ]] && { echo "FATAL: some parameters not specified"; exit 1; }
[[ -f "$FROMFILE" ]] || { echo "FATAL: datafile not found"; exit 1; }
case "$3" in
"rrqm/s")
NUMBER=2
;;
"wrqm/s")
NUMBER=3
;;
"r/s")
NUMBER=4
;;
"w/s")
NUMBER=5
;;
"rkb/s")
NUMBER=6
;;
"wkb/s")
NUMBER=7
;;
"avgrq-sz")
NUMBER=8
;;
"avgqu-sz")
NUMBER=9
;;
"await")
NUMBER=10
;;
"r_await")
NUMBER=11
;;
"w_await")
NUMBER=12
;;
"svctm")
NUMBER=13
;;
"util")
NUMBER=14
;;
*) echo ZBX_NOTSUPPORTED; exit 1 ;;
esac
grep -w $DISK $FROMFILE | tail -n +2 | tr -s ' ' |awk -v N=$NUMBER 'BEGIN {sum=0.0;count=0;} {sum=sum+$N;count=count+1;} END {printf("%.2f\n", sum/count);}'
Создаем /etc/zabbix/zabbix_agentd.d/iostat.conf:
UserParameter=iostat.discovery, iostat -d | awk 'BEGIN {check=0;count=0;array[0]=0;} {if(check==1 && $1 != ""){array[count]=$1;count=count+1;}if($1=="Device:"){check=1;}} END {printf("{\n\t\"data\":[\n");for(i=0;i<count;++i){printf("\t\t{\n\t\t\t\"{#HARDDISK}\":\"%s\"}", array[i]); if(i+1<count){printf(",\n");}} printf("]}\n");}'
UserParameter=iostat.collect,/etc/zabbix/externalscripts/iostat-collect.sh /tmp/iostat.out 8 || echo 1
UserParameter=iostat.metric[*],/etc/zabbix/externalscripts/iostat-parse.sh /tmp/iostat.out $1 $2
Увеличиваем Timeout в /etc/zabbix/zabbix_agentd.conf:
Timeout=10
Создаем /etc/zabbix/zabbix_agentd.d/disk.conf:
UserParameter=filesystem.error[*],file -s $1 | grep error | wc -l
Устанавливаем шаблон disk в zabbix.
NTP
Сервер
Создаем /etc/zabbix/zabbix_agentd.d/ntp.conf:
UserParameter=ntp.stratum,ntpdc -c sysinfo -n|grep 'stratum:'|cut -d':' -f2|awk '{print $1}'
Одной командой:
echo "UserParameter=ntp.stratum,ntpdc -c sysinfo -n|grep 'stratum:'|cut -d':' -f2|awk '{print \$1}'" | sudo tee /etc/zabbix/zabbix_agentd.d/ntp.conf
Устанавливаем шаблон ntp в zabbix.
Клиент
Для шаблона Template OS Windows (в Template OS Linux уже существует) создаём Элемент данных:
Имя: Host local time
Ключ: system.localtime
Единица измерени: unixtime
Интервал обновления (в сек): 60
Период хранения истории (в днях): 7
Группы элементов данных: General
Для каждого шаблона Template OS Windows и Template OS Linux создаём по триггеру:
Network
Для linux машин работающих в качестве шлюза, роутера.
Создаем /etc/zabbix/zabbix_agentd.d/network.conf:
UserParameter=net.conn.max,sysctl -n fs.aio-max-nr
UserParameter=net.conn.cur,netstat -n -t | wc -l
UserParameter=net.arp.max,sysctl -n net.ipv4.neigh.default.gc_thresh3
UserParameter=net.arp.cur,arp -n | wc -l
UserParameter=net.nf.max,sysctl -n net.netfilter.nf_conntrack_max
UserParameter=net.nf.cur,sysctl -n net.netfilter.nf_conntrack_count
Через командную строку:
echo "UserParameter=net.conn.max,sysctl -n fs.aio-max-nr" | sudo tee /etc/zabbix/zabbix_agentd.d/network.conf
echo "UserParameter=net.conn.cur,netstat -n -t | wc -l" | sudo tee -a /etc/zabbix/zabbix_agentd.d/network.conf
echo "UserParameter=net.arp.max,sysctl -n net.ipv4.neigh.default.gc_thresh3" | sudo tee -a /etc/zabbix/zabbix_agentd.d/network.conf
echo "UserParameter=net.arp.cur,arp -n | wc -l" | sudo tee -a /etc/zabbix/zabbix_agentd.d/network.conf
echo "UserParameter=net.nf.max,sysctl -n net.netfilter.nf_conntrack_max" | sudo tee -a /etc/zabbix/zabbix_agentd.d/network.conf
echo "UserParameter=net.nf.cur,sysctl -n net.netfilter.nf_conntrack_count" | sudo tee -a /etc/zabbix/zabbix_agentd.d/network.conf
Устанавливаем шаблон network в zabbix.
Openfire
RAID & HDD
В /etc/sudoers добавляем:
echo zabbix ALL=NOPASSWD: /etc/zabbix/externalscripts/statraid.pl | sudo tee -a /etc/sudoers
В /etc/zabbix/zabbix_agentd.conf добавляем:
echo UserParameter=statraid,sudo /etc/zabbix/externalscripts/statraid.pl | sudo tee -a /etc/zabbix/zabbix_agentd.conf
Устанавливаем шаблон raidhdd в zabbix.
Создаем /etc/zabbix/externalscripts/statraid.pl:
Нажмите, чтобы отобразить
#!/usr/bin/perl
use warnings;
use strict;
my $reply;
my @raid = split('\n',`sudo cciss_vol_status -s /dev/sda 2>&1`);
my $i=0;
foreach my $str (@raid) {
$str =~s/.*\)\s+//;
if ($str !~ /ok/i){
$reply.=", " if $i>0;
$str =~s/\s+/ /g;
$reply.=$str;
$i++;
}
}
if ($i==0) {$reply="OK"}
print $reply."\n";
Нажмите, чтобы отобразить
#!/usr/bin/perl
use warnings;
use strict;
my $str = `sudo mdadm --detail /dev/md0 | grep 'State :' 2>&1`;
chomp $str;
$str =~ s/^.*State :\s+(.*)\s+/$1/;
if ($str eq "clean") {print "OK"."\n"}
elsif ($str eq "active") {print "OK"."\n"}
else {print $str}
RAID Adaptec
Создаём /etc/zabbix/externalscripts/adaptecstate.sh или C:\Program Files\zabbix\adaptecstate.ps1:
#!/bin/bash
#v.0.8
#Adaptec RAID Controller Monitoring
#Full path of arcconf
ARCCONF=$(which arcconf)
#Full path of smartctl
SMARTCTL=$(which smartctl)
if [ ! $ARCCONF ] || [ ! -x $ARCCONF ]; then
echo "Command arcconf not exist"
exit 1
fi
getinformation(){
ARRAY=$($ARCCONF GETCONFIG 1 $1 | sed 's/ \{1,\}/_/g')
#If connection fail
ERR=$(echo "$ARRAY" | grep -ci "Invalid_controller_number")
if [ $ERR -gt 0 ]; then
echo "Invalid controller number"
exit 1
fi
}
getinfobynumber(){
echo "$ARRAY" | awk 'BEGIN {IGNORECASE=1; FS="_:_"} /^_'$1'/ {print $2; exit 0}'
}
getPDchannelbynumber(){
echo "$ARRAY" | awk 'BEGIN {IGNORECASE=1; FS="_:_"; count=0} /^_Reported_Channel/ {if(count++=='$1'){print $2; exit 0}}' | sed 's/(.*//'
}
getinfobyPDchannel(){
ARRAYPD=$(echo "$ARRAY" | awk 'BEGIN{RS="_Device_#|_-|\n\n"} /Reported_Channel.+_'$1'\(/')
echo "$ARRAYPD" | awk 'BEGIN {IGNORECASE=1; FS="_:_"} /^_'$2'/ {print $2; exit 0}'
}
getdiscovery(){
echo "{"
echo " \"data\":["
DEVICESUM=0
#Controller device information (AD)
if [ $1 == "AD" ]; then
echo " {"
echo " \"{#$1NUM}\":\"0\""
BATTERY=$(echo "$ARRAY" | awk 'BEGIN {count=0; IGNORECASE=1} /Controller_(Battery|ZMM)_Information/ {count=1; exit 0}; END {print count}')
echo " ,\"{#BATTERY}\":\"$BATTERY\""
echo " }"
fi
#Logical device information (LD)
if [ $1 == "LD" ]; then
DEVICESUM=$(echo "$ARRAY" | grep -ci "Logical_device_number")
fi
#Physical Device information (PD)
if [ $1 == "PD" ]; then
DEVICESUM=$(echo "$ARRAY" | grep -ci "Reported_Channel")
fi
#Create json for LD and PD
DEVICENUMLAST=$(($DEVICESUM - 1))
for ((i=0; i < $DEVICESUM; i++))
do
echo " {"
if [ $1 == "PD" ]; then
REPORTEDCHANNEL=$(getPDchannelbynumber $i)
echo " \"{#$1NUM}\":\"$REPORTEDCHANNEL\""
if [ $SMARTCTL ] && [ -x $SMARTCTL ]; then
#Adding aacraid device support to smartctl in version 6.3
SUPPORTAACRAID=$($SMARTCTL -h | grep -c aacraid)
if [ $SUPPORTAACRAID -gt 0 ]; then
INTERFACE=$(getinfobyPDchannel $REPORTEDCHANNEL "transfer_speed" | awk -F_ '{ print $1 }')
echo " ,\"{#INTERFACE}\":\"$INTERFACE\""
if [ $INTERFACE == "SATA" ]; then
echo " ,\"{#SMARTCMD}\":\"-d sat+aacraid,0,$REPORTEDCHANNEL\""
else
if [ $INTERFACE == "SAS" ]; then
echo " ,\"{#SMARTCMD}\":\"-d aacraid,0,$REPORTEDCHANNEL\""
fi
fi
fi
fi
else
echo " \"{#$1NUM}\":\"$i\""
fi
if [ $i -lt $DEVICENUMLAST ]; then
echo " },"
else
echo " }"
fi
done
echo " ]"
echo "}"
}
if [ $1 ] && [ $2 ] && [ $1 == "discovery" ]; then
getinformation $2
getdiscovery $2
else
if [ $1 ] && [ $2 ] && [ $3 ]; then
if [ $1 == "LD" ]; then
getinformation "$1 $2"
else
getinformation $1
fi
if [ $1 == "PD" ]; then
echo -n $(getinfobyPDchannel $2 $3 | sed 's/_/ /g')
else
echo -n $(getinfobynumber $3 | sed 's/_/ /g')
fi
fi
fi
exit 0
#powershell
#v.0.8
#Adaptec RAID Controller Monitoring
#Full path of arcconf.exe
$ARCCONF='C:\Program Files\Adaptec\Adaptec Storage Manager\arcconf.exe'
#Full path of smartctl.exe
$SMARTCTL='C:\Program Files\smartmontools\bin\smartctl.exe'
if (! $ARCCONF -Or !(Test-Path $ARCCONF)){
echo "Command arcconf not exist"
exit 1
}
function getinformation($OPTION){
$OPTION
$ARRAY=Invoke-Expression -Command "& `$ARCCONF` GETCONFIG 1 $OPTION" | %{$_ -replace "\s+","_"}
#If connection fail
$ERR=($ARRAY | Select-String "Invalid_controller_number").count
if ( $ERR -gt 0 ){
"Invalid controller number"
exit 1
}
return $ARRAY
}
function getinfobynumber($ARGS0){
if (($ARRAY | Select-String "^_$ARGS0").count -gt 0) {
($ARRAY | Select-String "^_$ARGS0")[0] | %{($_ -split '_:_')[1]}
}
}
function getPDchannelbynumber($ARGS0){
($ARRAY | Select-String "^_Reported_Channel")[$ARGS0] | %{($_ -split '_:_')[1]} | %{$_ -replace "[(].*",""}
}
function getinfobyPDchannel($ARGS0,$ARGS1){
$ARRAYPD="$ARRAY" -split "_Device_#|_-" | Select-String "Reported_Channel.+_$ARGS0\(" | %{$_ -replace " _"," __"} | %{$_ -split " _"}
if (($ARRAYPD | Select-String "^_$ARGS1").count -gt 0) {
$ARRAYPD | Select-String "^_$ARGS1" | %{($_ -split '_:_')[1]}
}
}
function getdiscovery($ARGS1){
"{"
" `"data`":["
$DEVICESUM=0
#Controller device information (AD)
if ($ARGS1 -eq "AD"){
" {"
" `"{#$ARGS1`NUM}`":`"0`""
$BATTERY=($ARRAY | Select-String "Controller_(Battery|ZMM)_Information").count
if ($BATTERY -gt 1) {
$BATTERY=1
}
" ,`"{#BATTERY}`":`"$BATTERY`""
" }"
}
#Logical device information (LD)
if ($ARGS1 -eq "LD"){
$DEVICESUM=($ARRAY | Select-String "Logical_device_number").count
}
#Physical Device information (PD)
if ($ARGS1 -eq "PD"){
$DEVICESUM=($ARRAY | Select-String "Reported_Channel").count
}
#Create json for LD and PD
$DEVICENUMLAST=$DEVICESUM - 1
for ($i=0; $i -lt $DEVICESUM; $i++){
" {"
if ($ARGS1 -eq "PD"){
$REPORTEDCHANNEL=getPDchannelbynumber $i
" `"{#$ARGS1`NUM}`":`"$REPORTEDCHANNEL`""
if ($SMARTCTL -And (Test-Path $SMARTCTL)) {
#Adding aacraid device support to smartctl in version 6.3
$SUPPORTAACRAID=(Invoke-Expression -Command "& `$SMARTCTL` -h" | Select-String "aacraid").count
if ($SUPPORTAACRAID -gt 0){
$INTERFACE=getinfobyPDchannel $REPORTEDCHANNEL transfer_speed | %{($_ -split "_")[0]}
" ,`"{#INTERFACE}`":`"$INTERFACE`""
if ($INTERFACE -eq "SATA"){
" ,`"{#SMARTCMD}`":`"-d sat+aacraid,0,$REPORTEDCHANNEL`""
} elseif ($INTERFACE -eq "SAS"){
" ,`"{#SMARTCMD}`":`"-d aacraid,0,$REPORTEDCHANNEL`""
}
}
}
} else {
" `"{#$ARGS1`NUM}`":`"$i`""
}
if ($i -lt $DEVICENUMLAST){
" },"
} else {
" }"
}
}
" ]"
"}"
}
if ($args[0] -And $args[1] -And ($args[0] -eq "discovery")){
$ARRAY=getinformation $args[1]
getdiscovery $args[1]
} else {
if ($args[0] -And $args[1] -And $args[2]){
if ($args[0] -eq "LD") {
$ARRAY=getinformation $($args[0]+" "+$args[1])
} else {
$ARRAY=getinformation $args[0]
}
if ($args[0] -eq "PD"){
getinfobyPDchannel $args[1] $args[2] | %{$_ -replace "_"," "}
} else {
getinfobynumber $args[2] | %{$_ -replace "_"," "}
}
}
}
exit 0
В /etc/sudoers добавляем:
echo zabbix ALL=NOPASSWD: /usr/sbin/smartctl,/etc/zabbix/scripts/adaptec-raid-controller.sh | sudo tee -a /etc/sudoers
Создаём /etc/zabbix/zabbix_agentd.d/adaptec-raid-controller.conf:
#############SMARTMONTOOLS
###DEPRECATED. USE for 2.x-3.2 templates
UserParameter=adaptec[*],sudo /etc/zabbix/scripts/adaptec-raid-controller.sh $1 $2 $3
UserParameter=adaptec.temperature,sudo /etc/zabbix/scripts/adaptec-raid-controller.sh AD 0 temperature | awk '{print $1}'
UserParameter=adaptec.temperature.status,sudo /etc/zabbix/scripts/adaptec-raid-controller.sh AD 0 temperature | awk -F'(' '{print $2}' | awk -F')' '{print $1}'
UserParameter=adaptec.smart.health[*],sudo smartctl -H $1,$2,$3,$4 /dev/sg | awk -F ': +' 'BEGIN{IGNORECASE=1} $$0 ~ /health/ { print $$2 }'
UserParameter=adaptec.smart.attributes[*],sudo smartctl -A $1 /dev/sg | awk '$$0 ~ /$2/ { print $$10 }'
UserParameter=adaptec.smart.sas[*],sudo smartctl -A -l error $1 /dev/sg | awk -F '[:=]' '/$2/ { print $$2 }' | awk '{ print $$1 }'
UserParameter=adaptec.smart.counter[*],sudo smartctl -l error $1 /dev/sg | awk '/$2:/ { print $$$3 }'
UserParameter=adaptec.smart.ssd[*],sudo smartctl -A $1 /dev/sg | awk '/(177 Wear_Leveling_Count|202 Percent_Lifetime_Used|233 Media_Wearout_Indicator|231 SSD_Life_Left) +0x[0-9a-z]+ +([0-9]+)/ {print $$10}'
#### 3.4
### Discovery
UserParameter=adaptec.discovery[*],sudo /etc/zabbix/scripts/adaptec-raid-controller.sh discovery $1 $2
Для Windows добавляем в C:\Program Files\zabbix\zabbix_agentd.win.conf:
###DEPRECATED. USE for 2.x-3.2 templates
UserParameter=adaptec[*],powershell -file "C:\Program Files\zabbix\adaptec-raid-controller.ps1" $1 $2 $3
UserParameter=adaptec.temperature,for /F "tokens=1 usebackq" %a in (`"powershell -file "C:\Program Files\zabbix\adaptec-raid-controller.ps1" AD 0 temperature"`) do @echo %a
UserParameter=adaptec.temperature.status,for /F "delims=() tokens=2 usebackq" %a in (`"powershell -file "C:\Program Files\zabbix\adaptec-raid-controller.ps1" AD 0 temperature"`) do @echo %a
UserParameter=adaptec.smart.health[*],for /F "delims=:= tokens=2 usebackq" %a in (`""%ProgramFiles%\smartmontools\bin\smartctl.exe" -H $1 /dev/sg | findstr -i "health""`) do @<nul set /p=%a
UserParameter=adaptec.smart.attributes[*],for /F "tokens=10 usebackq" %a in (`""%ProgramFiles%\smartmontools\bin\smartctl.exe" -A $1 /dev/sg | find "$2""`) do @echo %a
UserParameter=adaptec.smart.sas[*],for /F "delims=:= tokens=2 usebackq" %a in (`""%ProgramFiles%\smartmontools\bin\smartctl.exe" -A -l error $1 /dev/sg | find "$2""`) do @for /F "tokens=1" %b in ("%a") do @echo %b
UserParameter=adaptec.smart.counter[*],for /F "tokens=$3 usebackq" %a in (`""%ProgramFiles%\smartmontools\bin\smartctl.exe" -l error $1 /dev/sg | find "$2:""`) do @echo %a
UserParameter=adaptec.smart.ssd[*],for /F "tokens=10 usebackq" %a in (`""%ProgramFiles%\smartmontools\bin\smartctl.exe" -A $1 /dev/sg | findstr "Wear_Leveling_Count Percent_Lifetime_Used Media_Wearout_Indicator SSD_Life_Left""`) do @echo %a
### Discovery
UserParameter=adaptec.discovery[*],powershell -file "C:\Program Files\zabbix\adaptec-raid-controller.ps1" discovery $1 $2
Устанавливаем шаблон RAID Adaptec в zabbix.
Openvpn
На Zabbix сервере нужно создать элемент с именем «Invalid certificate for openvpn»:
На openvpn сервере нужно в файл /etc/zabbix/zabbix_agentd.conf добавить:
UserParameter=badcertificates,sudo /etc/zabbix/scripts/bad_certificates_count 2>/dev/null
На openvpn сервере нужно в файле /etc/sudoers
zabbix ALL= NOPASSWD: /etc/zabbix/scripts/bad_certificates_count
На openvpn сервере нужно создать скрипт /etc/zabbix/scripts/bad_certificates_count
Нажмите, чтобы отобразить
#!/bin/bash
# Указываем месторасположение файлов сертификатов
KEYS=/etc/openvpn/easy-rsa/keys
# Указываем имя и местораположение индекса используемых сервером сертификатов
INDEX=/etc/openvpn/easy-rsa/keys/index.txt
# Местоположение каталога конфигураций клиентов (client-config-dir)
CCD=/etc/openvpn/ccd
DCURR=`date +%s`
#echo $DCURR
TWOWEEKS=1209600
export BADCERTCOUNT=0
while read CN
do
count=-1
cat ${INDEX} | grep '^V' | grep $CN | cut -f4 | while read CERTNUM
do
NOTAFTER=`cat ${KEYS}/${CERTNUM}.pem 2>/dev/null | grep "Not After" | sed 's/^.*After : //'`
NOTAFTER2=`date --date="${NOTAFTER}" +%s`
# Вычисляем, сколько секунд осталось до окончания действия сертификата
DEXP=$[${NOTAFTER2} - ${DCURR}]
if [[ ${DEXP} -gt ${TWOWEEKS} ]]
then
count=$((count+1))
fi
done
if [[ ${count} -gt 0 ]]
then
BADCERTCOUNT=$(($BADCERTCOUNT + $count))
fi
done < <(cat $INDEX | grep '^V' | sed -e 's/^.*\/CN=//' | sed -e 's/\/.*//' | sort | uniq -d);
while read CN
do
NOTAFTER=""
if [ -f "${KEYS}/${CN}.crt" ]
then
# Получаем дату окончания действия сертификата
NOTAFTER=`cat ${KEYS}/${CN}.crt 2>/dev/null | grep "Not After" | sed 's/^.*After : //'`
# Приводим значения полученных дат к единому образцу - времени, прошедшему от начала "эпохи" UNIX (seconds since 1970-01-01 00:00:00 UTC)
if [ "$NOTAFTER" != "" ]
then
NOTAFTER2=`date --date="${NOTAFTER}" +%s`
# Вычисляем, сколько секунд осталось до окончания действия сертификата
DEXP=$[${NOTAFTER2} - ${DCURR}]
if [[ ${DEXP} -gt 0 ]]
then
if [[ ${DEXP} -lt ${TWOWEEKS} ]]
then
BADCERTCOUNT=$(($BADCERTCOUNT + 1))
fi
fi
else
BADCERTCOUNT=$($BADCERTCOUNT + 1)
fi
else
BADCERTCOUNT=$($BADCERTCOUNT + 1)
fi
done < <(cat $INDEX | grep '^V' | sed -e 's/^.*\/CN=//' | sed -e 's/\/.*//' | sort | uniq -u );
# Для каждого файла конфигурации клиента проверяем наличие действующего сертификата
while read CERT
do
if [ -f ${KEYS}/${CERT}.crt ]
then
# Получаем дату окончания действия сертификата
NOTAFTER=`cat ${KEYS}/${CN}.crt 2>/dev/null | grep "Not After" | sed 's/^.*After : //'`
# Приводим значения полученных дат к единому образцу - времени, прошедшему от начала "эпохи" UNIX (seconds since 1970-01-01 00:00:00 UTC)
if [ "$NOTAFTER" != "" ]
then
NOTAFTER2=`date --date="${NOTAFTER}" +%s`
# Вычисляем, сколько секунд осталось до окончания действия сертификата
DEXP=$[${NOTAFTER2} - ${DCURR}]
if [[ ${DEXP} -gt 0 ]]
then
BADCERTCOUNT=$($BADCERTCOUNT + 1)
fi
fi
else
BADCERTCOUNT=$((BADCERTCOUNT+1))
fi
done < <(ls ${CCD} | grep "");
echo $BADCERTCOUNT
Samba
Устанавливаем шаблон samba в zabbix.
Добавляем в /etc/sudoers:
zabbix ALL= NOPASSWD: /usr/bin/wbinfo -t
Проверяем:
sudo -u zabbix sudo /usr/bin/wbinfo -t
Создаем /etc/zabbix/zabbix_agentd.d/samba.conf:
UserParameter=smb.wbinfo.check,timeout --foreground 1 sudo wbinfo -t | grep succeeded | wc -l
Одной командой:
echo "UserParameter=smb.wbinfo.check,timeout --foreground 1 sudo wbinfo -t | grep succeeded | wc -l" | sudo tee /etc/zabbix/zabbix_agentd.d/samba.conf
Устанавливаем шаблон ntp в zabbix.
В папку внешних скриптов на сервере zabbix (/etc/zabbix/externalscripts) добавляем скрипт smb.file.check.sh
Нажмите, чтобы отобразить
#!/bin/bash
if [ ! $# == 4 ]; then
echo "Usage: $0 samba_share path_to_file username password"
echo "Example: $0 \"//fs/msi\" \"/check\" guest guest"
exit
fi
SMBFOLDER=$1
SMBFILE=$2
USERNAME=$3
PASSWORD=$4
RESULT="0"
RESULT=`timeout 1s smbclient ${SMBFOLDER} -d 0 -U ${USERNAME}%${PASSWORD} -c "get ${SMBFILE} /dev/stdout" -E 2>/dev/null | wc -l`
if [ "${RESULT}" ]
then
if [ "${RESULT}" -eq "0" ]
then
echo 0
#zabbix_sender -s fs -z 127.0.0.1 -k smb.file.check -o 1
else
echo 1
#zabbix_sender -s fs -z 127.0.0.1 -k smb.file.check -o 0
fi
else
echo 0
fi
На файловом сервере нужно создать файл, содержащий только символ «1». В заббиксе нужно задать параметры для доступа к этому файлу (в разделе Макросы):
* {$SMB.CHECK.FILE.SHARE} - имя службы, которую вы хотите задействовать на сервере. Имя службы вводится в форме //server/service, где server — это NetBIOS имя SMB/CIFS сервера, имеющего необходимую службу, а service – название службы. Например, для доступа к службе "printer" на SMB/CIFS сервере "smbserver", вам нужно использовать servicename в виде //smbserver/printer,
* {$SMB.CHECK.FILE.PATH_TO_FILE} - путь к файлу из службы,
* {$SMB.CHECK.FILE.USERNAME} - имя пользователя для доступа к файлу,
* {$SMB.CHECK.FILE.PASSWORD} - пароль для доступа к файлу
SMART
Мониторинг SMART с помощью smartmontools (smartctl):
Squid
Устанавливаем шаблон squid в zabbix.
Устанавливаем squidclient:
sudo apt-get install squidclient
Создаем /etc/zabbix/scripts/squid_stat.sh
Нажмите, чтобы отобразить
#!/bin/bash
### Автор скрипта - lioncub
### DESCRIPTION
# $1 - измеряемая метрика
### OPTIONS VERIFICATION
if [ -z $1 ]; then
exit 1
fi
### PARAMETERS
METRIC="$1"
SQUIDCLIENT=`which squidclient`
SQUIDPORT="3128"
CACHEFILE="/tmp/squiudstat.cache"
CACHETTL="55" # Время действия кеша в секундах (чуть меньше чем период опроса элементов)
## Проверка кеша
# время создание кеша (или 0 есть файл кеша отсутствует или имеет нулевой размер)
if [ -s "$CACHEFILE" ]; then
TIMECACHE=`stat -c"%Z" "$CACHEFILE"`
else
TIMECACHE=0
fi
if [ "$SQUIDPORT" ]; then
SQUIDPORT="-p $SQUIDPORT"
fi
# текущее время
TIMENOW=`date '+%s'`
# Если кеш неактуален, то обновить его (выход при ошибке)
if [ "$(($TIMENOW - $TIMECACHE))" -gt "$CACHETTL" ]; then
$SQUIDCLIENT $SQUIDPORT mgr:info> $CACHEFILE || exit 1
#extended-status
fi
# Получение значения указанной метрики
if [ "$METRIC" = "http_requests" ]; then
cat $CACHEFILE | grep 'Number of HTTP requests received:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "clients" ]; then
cat $CACHEFILE | grep 'Number of clients accessing cache:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "icp_received" ]; then
cat $CACHEFILE | grep 'Number of ICP messages received:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "icp_sent" ]; then
cat $CACHEFILE | grep 'Number of ICP messages sent:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "icp_queued" ]; then
cat $CACHEFILE | grep 'Number of queued ICP replies:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "htcp_received" ]; then
cat $CACHEFILE | grep 'Number of HTCP messages received:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "htcp_sent" ]; then
cat $CACHEFILE | grep 'Number of HTCP messages sent:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "req_fail_ratio" ]; then
cat $CACHEFILE | grep 'Request failure ratio:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "avg_http_req_per_min" ]; then
cat $CACHEFILE | grep 'Average HTTP requests per minute since start:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "avg_icp_msg_per_min" ]; then
cat $CACHEFILE | grep 'Average ICP messages per minute since start:'|cut -d':' -f2| tr -d ' \t'
elif [ "$METRIC" = "request_hit_ratio" ]; then
cat $CACHEFILE | grep 'Request Hit Ratios:'|cut -d':' -f3|cut -d',' -f1|tr -d ' %'
elif [ "$METRIC" = "byte_hit_ratio" ]; then
cat $CACHEFILE | grep 'Byte Hit Ratios:'|cut -d':' -f3|cut -d',' -f1|tr -d ' %'
elif [ "$METRIC" = "request_mem_hit_ratio" ]; then
cat $CACHEFILE | grep 'Request Memory Hit Ratios:'|cut -d':' -f3|cut -d',' -f1|tr -d ' %'
elif [ "$METRIC" = "request_disk_hit_ratio" ]; then
cat $CACHEFILE | grep 'Request Disk Hit Ratios:'|cut -d':' -f3|cut -d',' -f1|tr -d ' %'
elif [ "$METRIC" = "servicetime_httpreq" ]; then
cat $CACHEFILE | grep 'HTTP Requests (All):'|cut -d':' -f2|tr -s ' '|awk '{print $1}'
elif [ "$METRIC" = "process_mem" ]; then
cat $CACHEFILE | grep 'Process Data Segment Size via sbrk'|cut -d':' -f2|awk '{print $1}'
elif [ "$METRIC" = "cpu_usage" ]; then
cat $CACHEFILE | grep 'CPU Usage:'|cut -d':' -f2|tr -d '%'|tr -d ' \t'
elif [ "$METRIC" = "cache_size_disk" ]; then
cat $CACHEFILE | grep 'Storage Swap size:'|cut -d':' -f2|awk '{print $1}'
elif [ "$METRIC" = "cache_size_mem" ]; then
cat $CACHEFILE | grep 'Storage Mem size:'|cut -d':' -f2|awk '{print $1}'
elif [ "$METRIC" = "mean_obj_size" ]; then
cat $CACHEFILE | grep 'Mean Object Size:'|cut -d':' -f2|awk '{print $1}'
elif [ "$METRIC" = "filedescr_max" ]; then
cat $CACHEFILE | grep 'Maximum number of file descriptors:'|cut -d':' -f2|awk '{print $1}'
elif [ "$METRIC" = "filedescr_avail" ]; then
cat $CACHEFILE | grep 'Available number of file descriptors:'|cut -d':' -f2|awk '{print $1}'
fi
exit 0
в /etc/zabbix/zabbix_agentd.conf добавляем:
UserParameter=squid[*],/etc/zabbix/scripts/squid_stat.sh $1
WSUS
Устанавливаем шаблон в zabbix.
xDSL
Модемы Zyxel (P792-Hv2)
Устанавливаем шаблон xdsl в zabbix.
Zimbra
Создаем /etc/zabbix/scripts/zimbra.sh:
Нажмите, чтобы отобразить
#!/bin/bash
# Zabbix script to check Zimbra services and perform service discovery.
# Supports Zimbra 8.6 and "two-worded" service names
# Author: Lorenzo Milesi <maxxer@yetopen.it>
# Copytight: YetOpen S.r.l. 2015
# License: GPLv3
# uncomment for debug
#set -x
COMMAND="sudo -u zimbra /opt/zimbra/bin/zmcontrol"
case "$1" in
version)
# Return zimbra version
VERS=$($COMMAND -v)
if [ $? -eq 0 ] ; then
echo $VERS
exit 0;
fi
# error
exit 1;
;;
discover)
# Return a list of running services in JSON
echo "{"
echo -e "\t\"data\":[\n"
SRVCS=$($COMMAND status | grep Running | awk '{$(NF--)=""; print}' | sed 's/^/\t{ \"{#ZIMBRASERVICE}\":\"/' | sed 's/\ $/\" },/')
# Remove last comma from the sting, to make a good JSON
echo $(echo $SRVCS | sed 's/,\+$//')
echo -e "\n\t]\n"
echo "}"
exit 0;
;;
*)
# move on...
check=$1
if [ "$check" = "" ]; then
echo "No Zimbra service specified..."
exit 1
fi
maxage=120
file='/var/run/zabbix/zimbra_status'
# Very basic concurrency check
x=0
while [ -f "$file.tmp" ]; do
sleep 5;
x=$((x+1))
# don't wait too long anyway, remove an eventually stale lock. Anyway we have 15s zabbix agent timeout
if [ $x -ge 3 ]; then
rm "$file.tmp";
fi
done
#check if cached status file size > 0
if [ -s ${file} ]; then
OLD=`stat -c %Z $file`
NOW=`date +%s`
# if older then maxage, update file
if [ `expr $NOW - $OLD` -gt $maxage ]; then
$COMMAND status > $file.tmp
mv $file.tmp $file
fi
else
rm -f ${file}
$COMMAND status > $file.tmp
mv $file.tmp $file
fi
STATUS="$(cat $file | grep "$check" | awk '{print $NF}')"
if [ "$STATUS" != "Running" ]; then
echo 0
else
echo 1
fi
;;
esac
exit 0;
Создаем /etc/zabbix/zabbix_agentd.d/zimbra.conf:
UserParameter=zimbra.status[*],/etc/zabbix/scripts/zimbra.sh "$1"
UserParameter=zimbra.version,/etc/zabbix/scripts/zimbra.sh version
UserParameter=zimbra.discovery,/etc/zabbix/scripts/zimbra.sh discover
Разрешаем запускать zmcontrol пользователю zabbix от имени zimbra:
echo zabbix ALL=\(zimbra\) NOPASSWD: /opt/zimbra/bin/zmcontrol | sudo tee -a /etc/sudoers
Устанавливаем шаблон zimbra в zabbix.
https://github.com/YetOpen/zabbix-scripts/tree/master/zabbix-zimbra
Гарант
Изменён шаблон!!! После проверки необходимо обновить!!!
Гарант должен быть установлен в директорию D:\Garant-Server
Устанавливаем шаблон garant в zabbix.
Гостевой WiFi
На zabbix сервер создаём /etc/zabbix/externalscripts/wifi.scan.sh
Нажмите, чтобы отобразить
#!/bin/bash
SSID[1]="dkbasu"
SSID[2]="dkbcloud"
SSID[3]="dkbfree"
PSK[1]="gfhjkm45"
PSK[2]="kosmonaft65"
PSK[3]=""
KEY_MGMT[1]="WPA-PSK"
KEY_MGMT[2]="WPA-PSK"
KEY_MGMT[3]="NONE"
ROUTER[1]="192.168.69.1"
ROUTER[2]="192.168.69.17"
ROUTER[3]="192.168.68.1"
for INDEX in 1 2 3
do
SSID2[$INDEX]=`echo ${SSID[$INDEX]} | sed 's/^/\"/' | sed 's/$/\"/'`
PSK2[$INDEX]=`echo ${PSK[$INDEX]} | sed 's/^/\"/' | sed 's/$/\"/'`
done
for INDEX in 1 2 3
do
ps -A | grep wpa_supplicant | sed "s/ ?.*$//" | xargs -I {} kill -s SIGKILL {}
RESULT=`/sbin/iwlist scan 2>/dev/null | grep -c ${SSID[$INDEX]}`
echo "RESULT = $RESULT"
if [ "${RESULT}" ]
then
if [ "${RESULT}" -gt "0" ]
then
SSID_SCAN[$INDEX]=1
else
SSID_SCAN[$INDEX]=0
fi
else
SSID_SCAN[$INDEX]=0
fi
done
for INDEX in 1 2 3
do
if [ "${SSID_SCAN[$INDEX]}" -eq "1" ]
then
for INDEX in 1 2 3
do
/sbin/dhclient wlan0 -r
/sbin/wpa_supplicant -B -iwlan0 -c /etc/zabbix/externalscripts/wpa_supplicant_${SSID[$INDEX]}.conf
/sbin/wpa_cli -iwlan0 disconnect
/sbin/ip link set wlan0 down
/sbin/ip link set wlan0 up
for i in `/sbin/wpa_cli list_networks | grep ^[0-9] | cut -f1`; do /sbin/wpa_cli -iwlan0 remove_network $i; done
/sbin/wpa_cli -iwlan0 add_network
/sbin/wpa_cli -iwlan0 set_network 0 auth_alg OPEN
/sbin/wpa_cli -iwlan0 set_network 0 key_mgmt ${KEY_MGMT[$INDEX]}
/sbin/wpa_cli -iwlan0 set_network 0 psk ${PSK2[$INDEX]}
/sbin/wpa_cli -iwlan0 set_network 0 mode 0
/sbin/wpa_cli -iwlan0 set_network 0 ssid ${SSID2[$INDEX]}
/sbin/wpa_cli -iwlan0 select_network 0
/sbin/wpa_cli -iwlan0 enable_network 0
/sbin/wpa_cli -iwlan0 reassociate
/sbin/dhclient wlan0 -r
/usr/bin/timeout 9s /sbin/dhclient -v wlan0
/bin/sleep 2s
/sbin/ip address show dev wlan0
RESULT=`/sbin/ip address show dev wlan0 | grep -c inet`
if [ "${RESULT}" -eq "1" ]
then
#/sbin/ip address show dev wlan0 | grep -c inet
SSID_DHCP[$INDEX]=1
else
SSID_DHCP[$INDEX]=0
fi
if [ "${SSID_DHCP[$INDEX]}" -eq "1" ]
then
echo "/sbin/ip route:"
/sbin/ip route
/usr/bin/nslookup www.google.com | grep answer -A 20 | grep Address | sed 's/^.*:\ //' | while read line
do
echo /sbin/route del -host $line
/sbin/route del -host $line
echo /sbin/route add -host $line gw ${ROUTER[$INDEX]}
/sbin/route add -host $line gw ${ROUTER[$INDEX]}
done
RESULT=0
RESULT=`/usr/bin/nmap -p 80 www.google.com | grep -c "(1 host up)"`
if [ "${RESULT}" -eq "1" ]
then
SSID_HTTP[$INDEX]=1
else
SSID_HTTP[$INDEX]=0
fi
RESULT=0
RESULT=`/usr/bin/nmap -p 443 www.google.com | grep -c "(1 host up)"`
if [ "${RESULT}" -eq "1" ]
then
SSID_HTTPS[$INDEX]=1
else
SSID_HTTPS[$INDEX]=0
fi
else
SSID_HTTP[$INDEX]=0
SSID_HTTPS[$INDEX]=0
fi
/sbin/wpa_cli -iwlan0 disconnect
/sbin/dhclient wlan0 -r
done
else
SSID_DHCP[$INDEX]=0
SSID_HTTP[$INDEX]=0
SSID_HTTPS[$INDEX]=0
fi
done
echo "SSID;scan;dhcp;http;https"
echo "SSID;scan;dhcp;http;https" > /tmp/wifi-test
for INDEX in 1 2 3
do
echo "${SSID[$INDEX]};${SSID_SCAN[$INDEX]};${SSID_DHCP[$INDEX]};${SSID_HTTP[$INDEX]};${SSID_HTTPS[$INDEX]}"
echo "${SSID[$INDEX]};${SSID_SCAN[$INDEX]};${SSID_DHCP[$INDEX]};${SSID_HTTP[$INDEX]};${SSID_HTTPS[$INDEX]}" >> /tmp/wifi-test
done
На zabbix сервер создаём /etc/zabbix/externalscripts/wifi.check.sh
Нажмите, чтобы отобразить
#!/bin/bash
SSID=$1
TYPE=$2
case "$TYPE" in
"scan" )
cat /tmp/wifi-test | grep $SSID | cut -d ';' -f 2
;;
"dhcp" )
cat /tmp/wifi-test | grep $SSID | cut -d ';' -f 3
;;
"http" )
cat /tmp/wifi-test | grep $SSID | cut -d ';' -f 4
;;
"https" )
cat /tmp/wifi-test | grep $SSID | cut -d ';' -f 5
;;
esac
Устанавливаем шаблон wifi_check в zabbix.
Медик+
Medikprod Flow
На сервере где установлен коллектор flow-tools, добавляем в /etc/flow-tools/flow-capture.conf:
-R /var/flow/netflow.sh -S 60 -z 9 -N 3 -n 1439 -w /var/flow/flow-data -E1G 192.168.10.161/192.168.10.1/8688
где 192.168.10.161 - ip где установлен flow-capture, 192.168.10.1 - ip где собирается flow и отправляется на flow-capture
Создаем /var/flow/netflow.sh:
Нажмите, чтобы отобразить
#!/bin/bash
/usr/bin/flow-export -f2 -mDPKTS,DOCTETS,SRCADDR,DSTADDR,SRCPORT,DSTPORT,PROT < $1 > /tmp/flow.txt
ZABBIX_SERVER="192.168.10.161";
ZABBIX_PORT="10051";
ZABBIX_SENDER="/usr/bin/zabbix_sender";
HOST="medikprod";
KEY1=medikprod.web.count
VALUE1=`flow-cat $1 | flow-nfilter -f /etc/flow-tools/cfg/dkb.cfg -F prod-web | flow-stat -f10 -s3 | grep -v "#" | wc -l`
KEY2=medikprod.web.max
VALUE2=`flow-cat $1 | flow-nfilter -f /etc/flow-tools/cfg/dkb.cfg -F prod-web | flow-stat -f10 -s3 | tail -1 | sed 's/ \+/ /g' | cut -d' ' -f4`
KEY3=medikprod.web.sum
VALUE3=`flow-cat $1 | flow-nfilter -f /etc/flow-tools/cfg/dkb.cfg -F prod-web | flow-stat -f15 | grep -v "#" | sed 's/ \+/ /g' | cut -d' ' -f1`
KEY4=medikprod.web.avg
if [ $VALUE1 -eq 0 ]; then
VALUE4=0
else
VALUE4=`echo "$VALUE3/$VALUE1" | bc`
fi
$ZABBIX_SENDER -z $ZABBIX_SERVER -p $ZABBIX_PORT -s "$HOST" -k $KEY1 -o "$VALUE1"
$ZABBIX_SENDER -z $ZABBIX_SERVER -p $ZABBIX_PORT -s "$HOST" -k $KEY2 -o "$VALUE2"
$ZABBIX_SENDER -z $ZABBIX_SERVER -p $ZABBIX_PORT -s "$HOST" -k $KEY3 -o "$VALUE3"
$ZABBIX_SENDER -z $ZABBIX_SERVER -p $ZABBIX_PORT -s "$HOST" -k $KEY4 -o "$VALUE4"
GR=( OMS ASU UPRV HIR NEVR FTO DST STOM OFD OFTA RENT KONS OTO KDL REG OPP KVEN UZD INFK JEK PRFL PRVK PSI REA TOP1 TOP2 TOP3 UTUPR UTDCUP UTLDP UTCHRZ vcasu )
for element in $(seq 0 $((${#GR[@]} - 1)))
do
KEY=medikprod.web.${GR[$element]}
VALUE=`flow-cat $1 | flow-nfilter -f /etc/flow-tools/cfg/dkb.cfg -F ${GR[$element]}_M+ | flow-stat -f15 | grep -v "#" | sed 's/ \+/ /g' | cut -d' ' -f1`
$ZABBIX_SENDER -z $ZABBIX_SERVER -p $ZABBIX_PORT -s "$HOST" -k $KEY -o "$VALUE"
done
Устанавливаем шаблон medikprodflow в zabbix.
Температура
Температура процессора
Для определения температуры процессора на нужном хосте создаём файл /etc/zabbix/zabbix_agentd.d/temperature.conf :
UserParameter=sensors.core_avg,sensors|grep 'Core'|cut -c15-19|awk ' { avg += $"'"$1"'" } END { avg=avg/NR; print avg }'
UserParameter=cpu.max_temperature,sensors | grep "ISA" -A 1 | grep "(" | sed "s/,.*//" | sed "s/^.*+//" | sed "s/\..*//" | head -n 1 | awk '{sum+=$1-10} END {print sum}'
Для старых материнских плат:
UserParameter=sensors.core_avg,sensors|grep 'CPU'|grep -v "+127.5"|cut -c15-19|awk ' { avg += $"'"$1"'" } END { avg=avg/NR; print avg }'
UserParameter=cpu.max_temperature,sensors | grep "CPU" -A 1 | grep "(" | sed "s/,.*//" | sed "s/^.*+//" | sed "s/\..*//" | head -n 1 | awk '{sum+=$1-10} END {print sum}'
Температура с датчика MP707
Для датчика MP707 (необходим bmcontrol) в /etc/zabbix/zabbix_agentd.conf добавляем:
UserParameter=temp.mp707,sudo /etc/zabbix/externalscripts/bmcontrol temp 99000002a8bd1728
На сервере редактируем /etc/zabbix/zabbix_server.conf параметр ExternalScripts:
ExternalScripts=/etc/zabbix/externalscripts
Устанавливаем шаблон temperature в zabbix.
Тестирование канала
Создаем /etc/zabbix/zabbix_agentd.conf.d/accesslink.conf на узле с которого будет тестироваться канал:
UserParameter=connection[*], ping -c 2 -i 0.4 -w 1 $1 | grep received | cut -d',' -f2 | cut -d' ' -f2
Одной командой:
echo "UserParameter=connection[*], ping -c 2 -i 0.4 -w 1 \$1 | grep received | cut -d',' -f2 | cut -d' ' -f2" | sudo tee /etc/zabbix/zabbix_agentd.d/accesslink.conf
Для проверки каждого канала (IP) заводить Элементы данных и Триггер в ручную на узле сети!
На zabbix сервере добавляем для узла:
Элемент данных:
Имя: Access Link ПРОВАЙДЕР to ОБЪЕКТ
Ключ: connection[ИП.АДРЕС]
Группы элементов данных: Network
Имя: Access Link TTK to Hospital
Ключ: connection[192.168.7.2]
Группы элементов данных: Network
Триггер:
Имя: Connection ПРОВАЙДЕР to ОБЪЕКТ is DOWN
Выражение: {выбираем созданный элемент данных.last()}<1
Важность: какая требуется
Имя: Connection TTK to Hospital is DOWN
Выражение: {gateway:connection[78.29.17.37].last()}<1
Важность: Средняя
Стэк
Устанавливаем шаблон stek в zabbix.
Коммутаторы
Dlink 3120
Dlink 3100
Dlink 3600
Срок регистрации домена
Создаём скрипт /etc/zabbix/scripts/domainregistration.sh, показывающий сколько осталось дней до окончания регистрации на узле с которого будет на узле с котрого будет запрашиваться информация (должен быть прямой интернет).
#!/bin/bash
paid_till=`whois $1 | grep -m1 -P "Expir|paid" | sed -r "s/.*:\s+//g" | sed "s/\./\-/g"`
paid_till=`date --date=$paid_till +%s`
now=`date +%s`
let "tDiff=$paid_till-$now"
let "tDiff=$tDiff/86400"
echo $tDiff
Делаем его исполняемым:
sudo chmod +x /etc/zabbix/scripts/domainregistration.sh
и создаём файл конфигурации /etc/zabbix/zabbix_agentd.d/domainregistration.conf
UserParameter=domainregistration[*],/etc/zabbix/scripts/domainregistration.sh $1
или одной командой:
echo "UserParameter=domainregistration[*],/etc/zabbix/scripts/domainregistration.sh \$1" | sudo tee /etc/zabbix/zabbix_agentd.d/domainregistration.conf
На zabbix сервере добавляем для узла на примере проверки домена domain.ru:
Элемент данных:
Имя: Remaining days domain registration domain.ru
Ключ: connection[domain.ru]
Интервал обновления (в сек): 86400
Период хранения истории (в днях): 7
Группы элементов данных: Domain
Триггер:
Имя: Expires domain registration period domain.ru
Выражение: {zimbra:domainregistration[domain.ru].last()}<30
Важность: какая требуется