Инструменты пользователя

Инструменты сайта


how-to:zabbix

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

zabbix-proxy

zabbix-proxy

Инициализация:

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

Генерировать PSK key:

openssl rand -hex 32

https://www.zabbix.com/documentation/6.0/ru/manual/encryption/using_pre_shared_keys

Agent

Тестировать подключение к клиенту с сервера:

zabbix_get -k agent.ping -s zabbix-agent

Windows

powershell

powershell

$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

bash

bash

#!/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

Пример и docker образ для поддержки MSSQL:

https://github.com/mrlioncub/zabbix-server-mysql
https://github.com/mrlioncub/zabbix-proxy-sqlite3

Web Monitoring

Увеличение уровня журналирования по всем http поллерам:

zabbix_server -R log_level_increase="http poller"

Уменьшить уровень журналирования:

zabbix_server -R log_level_decrease

https://www.zabbix.com/documentation/current/ru/manual/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/

Шаблоны

https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates

Создаем директорию для скриптов на сервере с агентом:

sudo mkdir /etc/zabbix/scripts
chown zabbix:zabbix /etc/zabbix/scripts

После права на скрипты должны быть:

chmod 700 /etc/zabbix/scripts/*
chown zabbix /etc/zabbix/scripts/*

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 в 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 создаём по триггеру:

  • Имя: Discrepancy in time on {HOST.NAME}
  • Выражение (Для Template OS Windows): {Template OS Windows:system.localtime.fuzzytime(30)}=0
  • Выражение (Для Template OS Linux): {Template OS Linux:system.localtime.fuzzytime(30)}=0
  • Важность: Средняя

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

Устанавливаем шаблон openfire в zabbix.

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:

  • Для HP Smart Array с возможностью просмотра с помощью утилиты cciss_vol_status

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

#!/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";


  • Для MD RAID

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

#!/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:

adaptecstate.sh

adaptecstate.sh

#!/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

adaptecstate.ps1

adaptecstate.ps1

#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»:

  • Тип - Zabbix агент
  • Ключ - badcertificates
  • Тип информации - Числовой
  • Тип данных - Десятичный

На 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.

Медик+

Устанавливаем шаблон medikplus в 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.

Коммутаторы

Устанавливаем шаблон dlink3120 в zabbix.

Устанавливаем шаблон dlink3100 в zabbix.

Устанавливаем шаблон dlink3600 в zabbix.

Срок регистрации домена

Создаём скрипт /etc/zabbix/scripts/domainregistration.sh, показывающий сколько осталось дней до окончания регистрации на узле с которого будет на узле с котрого будет запрашиваться информация (должен быть прямой интернет).

domainregistration.sh:

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
Важность: какая требуется

how-to/zabbix.txt · Последнее изменение: lioncub