Zabbix-4.0.4监控系统的部署

​ by:苏克同学

ps:本文详细介绍了lamp以及lnmp两种架构部署zabbix环境!

一、zabbix环境的部署

<1>、lamp环境的部署

ps:rhel-6.8+apache-2.2.15+mysql-5.7.25+php-7.2.16

1、mysql-5.7.25的部署

1.1、安装依赖
# yum -y install  gcc gcc-c++ ncurses  ncurses-devel  libaio-devel  openssl openssl-devel
1.2、下载源码包

ps:不能连接外网的话,那就官网下载吧!为什么用5.7呢,因为zabbix4连接mysql8有bug,虽然官方称8比7快2倍。这里我们选择rpm包安装。简单粗暴。

地址:https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.25-1.el6.x86_64.rpm-bundle.tar

# wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.25-1.el6.x86_64.rpm-bundle.tar
1.3、创建mysql用户
# groupadd mysql
# useradd -r -g mysql -s /bin/false mysql
1.4、创建data目录
# mkdir -p /data/mysql
# chown -R mysql.mysql /data/mysql
1.5、安装
# rpm -qa|grep mysql 
如果有先卸载哟!
# rpm -e --nodeps 包名        
# tar -xf mysql-5.7.25-1.el6.x86_64.rpm-bundle.tar
 mysql-community-client-5.7.25-1.el6.x86_64.rpm
 mysql-community-common-5.7.25-1.el6.x86_64.rpm
 mysql-community-devel-5.7.25-1.el6.x86_64.rpm
 mysql-community-embedded-5.7.25-1.el6.x86_64.rpm
 mysql-community-embedded-devel-5.7.25-1.el6.x86_64.rpm
 mysql-community-libs-5.7.25-1.el6.x86_64.rpm
 mysql-community-libs-compat-5.7.25-1.el6.x86_64.rpm
 mysql-community-server-5.7.25-1.el6.x86_64.rpm           
# rpm -ivh *.rpm              ps:有个test的包可以不装!建议先删除!
1.6、启动
# service mysqld start

报错了,无法启动!暂且不看日志!

# mysql -v
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

解决方法:

# vim /etc/my.cnf        添加如下
[mysql]
socket=/var/lib/mysql/mysql.sock
# service mysqld start   成功启动!如果报其他错误的话,根据错误原因找解决方法哟!

ps:在你第一次启动的时候就有一个初始化过程。其中有用户初始密码!如图!

当然如果你找不到了,可以查看日志,tail -50 /var/log/mysqld.log

image.png
# mysql -uroot -p
#passwd:              这里复制粘贴密码就行!

如果还不能登录的话,那自己再初始化一下。

# mysqld --initialize --user=mysql     日志中找密码!

1.7、修改密码
mysql> alter user root@localhost identified by '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
#报错,密码不符合策略!(需要数字,大小写字母,特殊符号,长度)

mysql> alter user root@localhost identified by '12345678';
mysql> flush privileges;

1.8、修改目录(选)

ps:因为在生产环境,某些目录空间较小!

# setenforce 0  关
# vim /etc/my.cnf
datadir=/data/mysql
# chown mysql.mysql -R /data/mysql    ps:需要空文件哟!前面已经创建!
# service mysqld restart

2、apache-2.2.15的部署

2.1、安装
# yum install -y httpd
# httpd -v

2.2、配置文件修改
# vim /etc/httpd/conf/httpd.conf
 ServerName 127.0.0.1:80
 DirectoryIndex index.html index.html.var index.php
 AddType application/x-httpd-php .php

2.3、启动方式
# service httpd start
# chkconfig httpd on (开机启动)

3、php-7.2.16的部署

ps:内网环境,故采用的是源码安装!非常麻烦!如果可以连接外网,建议yum安装!简单粗暴!

3.1、安装依赖
# yum install -y libjpeg-devel livxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libpng libpng-devel freetype freetype-devel epel-release libmcrypt libmcrypt-devel perl* httpd-devel.x86_64 curl curl-devel 

3.2、下载源码包

地址:http://docs.php.net/distributions/php-7.2.16.tar.gz

# wget http://docs.php.net/distributions/php-7.2.16.tar.gz

3.3、预编译、安装
# tar xzf php-7.2.16.tar.gz
# mv php-7.2.16 /data/app/php
# cd /data/app/php
#./configure --prefix=/data/app/php \
--with-config-file-path=/data/app/php \
--enable-opcache \
--enable-fpm \
--with-libxml-dir \
--with-zlib \
--with-curl \
--enable-dba \
--enable-ftp \
--with-freetype-dir \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-zlib-dir \
--enable-gd-native-ttf \
--with-gettext  \
--enable-mbstring \
--with-mcrypt=/usr/local/libmcrypt/ \
--with-mysql \
--with-mysqli \
--enable-pcntl \
--with-pdo-mysql \
--without-pdo-sqlite  \
--enable-shmop \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-zip \
--with-apxs2=/usr/sbin/apxs \
--enable-bcmath --enable-ctype

ps:可能还是会有error ,根据什么报错,安装一些依赖就行。

# make -j 2 && make install

3.4、修改配置文件
# cp php.ini-production php.ini
# vim php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Shanghai
always_populate_raw_post_data = -1              5.6或者以下版本。7不用改
mysqli.default_socket = /var/lib/mysql/mysql.sock

3.5、添加环境变量
# echo 'export PATH=$PATH:/data/app/php/bin' >> /etc/profile
# source /etc/profile
# php -v

<2>、lnmp环境的部署

1、nginx1.14.2的部署

1.1、官网下载源码包

地址:http://nginx.org/download/nginx-1.14.2.tar.gz

# wget http://nginx.org/download/nginx-1.14.2.tar.gz

1.2、编译安装
# tar xzf nginx-1.14.2.tar.gz
# mv nginx-1.14.2 /usr/local/nginx
# cd /usr/local/
# ./configure \                                 ps:如果缺少依赖包报错,自己去请安装哈!
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-pcre
# make && make install

1.3、配置文件修改
# vim /usr/local/nginx/conf/nginx.conf
        location / {
            root   /var/www/html;
            index  index.html index.htm index.php;
        }
        location ~ \.php$ {
            root           /var/www/html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
            include        fastcgi_params;
        }

image.png
1.4、启动
# sbin/nginx -t
# sbin/nginx -c conf/nginx.conf
# ps -ef|grep nginx
# netstat -tanp|grep 80

2、php-7.2.16的部署

ps:php的安装请看<1>-3,这里就不讲了,主要说下php-fpm

2.1、php配置文件修改
# cd /data/app/php
# cp php.ini-production php.ini
# vim php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = Asia/Shanghai
always_populate_raw_post_data = -1               5.6或者以下版本。7不用改
mysqli.default_socket = /var/lib/mysql/mysql.sock

2.2、php-fpm配置文件修改
# cd etc
# cp php-fpm.conf.default   php-fpm.conf
# vim php-fpm.conf       5.6或者以下版本。
user = apache             ps:修改用户和组,这个要和访问目录的属主属组一样!
group = apache
# ../sbin/php-fpm -t         ps:测试配置是否正确
7版本:
vim /data/app/php/etc/php-fpm.d/www.conf
user = apache             ps:修改用户和组,这个要和访问目录的属主属组一样!
group = apache


2.3、启动php-fpm
# cd /data/app/php
# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# chmod 755 /etc/init.d/php-fpm
# service php-fpm start
# chkconfig php-fpm on                   开启启动
# ps aux |grep php-fpm
# netstat -ant |grep 9000

二、zabbix-server安装

温馨提示:本文采用的是源码安装哟!

1、zabbix-4.0.4下载

1.1、官网下载
image.png
1.2、wget下载
# wget https://nchc.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/4.0.4/zabbix-4.0.4.tar.gz

2、安装依赖

如果是6的系统建议先升级curl到7.20版本!发送内置邮件有用!

#yum -y install gcc mysql-community-devel libxml2-devel unixODBC-devel net-snmp-devel libcurl-devel libssh2-devel OpenIPMI-devel openssl-devel openldap-devel libevent libevent-devel OpenIPMI

3、创建用户

# groupadd zabbix
# useradd -g zabbix -m -s /sbin/nologin zabbix
# tar xzf zabbix-4.0.4.tar.gz
# mv zabbix-4.0.4 /data/app/zabbix
# cd /data/app/zabbix/

4、编译、安装

#./configure --prefix=/data/app/zabbix \
--sysconfdir=/etc/zabbix/ \
--enable-server  \
--enable-agent \
--enable-java \
--enable-proxy \
--enable-ipv6  \
--with-mysql \
--with-net-snmp \
--with-jabber=/usr/local \
--with-libxml2  \
--with-unixodbc  \
--with-ssh2  \
--with-libevent=/opt/libevent \
--with-openssl \
--with-ldap \
--with-libcurl \
--with-libpcre

# make -j 2 && make install

报错:jabber。。。。

解决方法:

# wget  https://src.fedoraproject.org/repo/pkgs/iksemel/iksemel1.4.tar.gz/532e77181694f87ad5eb59435d11c1ca/iksemel-1.4.tar.gz 
# tar xzf iksemel-1.4.tar.gz
# cd iksemel-1.4
# ./configure
# make && make install

报错:configure: error: Unable to use libevent (libevent check failed)

解决方法:

# wget http://monkey.org/~provos/libevent-1.4.14b-stable.tar.gz
# tar xf libevent-1.4.14b-stable.tar.gz 
# cd libevent-1.4.14b-stable
# ./configure --prefix=/opt/libevent
# make && make install

5、创建zabbix库和导入数据

# mysql -uroot -p12345678
# mysql>CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin;
# mysql>grant all privileges on zabbix.* to zabbix@'%' identified by '12345678';
# mysql>exit
# cd /data/app/zabbix/database/mysql
# mysql -uzabbix -p12345678 zabbix < schema.sql
# mysql -uzabbix -p12345678 zabbix < images.sql
# mysql -uzabbix -p12345678 zabbix < data.sql

6、配置zabbix_server

# vim /etc/zabbix/zabbix_server.conf
# egrep -v "^$|*#" /etc/zabbix/zabbix_server.conf
 DBName=zabbix
 DBUser=zabbix
 DBPassword=Suke@9420
 DBSocket=/var/lib/mysql/mysql.sock
 DBPort=3306
 #以下配置跟随主机情况配置,建议先默认,后期修改!
 StartPollers=80
 StartPollersUnreachable=20
 StartTrappers=120
 StartPingers=10
 ListenIP=10.250.0.88
 CacheSize=2G
 CacheUpdateFrequency=300
 StartDBSyncers=16
 HistoryCacheSize=1024M
 HistoryIndexCacheSize=512M
 TrendCacheSize=1024M
 ValueCacheSize=1G
 Timeout=30
 #脚本目录
 AlertScriptsPath=/data/app/zabbix/alertscripts
 ExternalScripts=/data/app//zabbix/externalscripts

7、创建脚本目录

# mkdir /data/app/zabbix/alertscripts 
# mkdir /data/app/zabbix/externalscripts
# cp /data/app/zabbix/misc/init.d/fedora/core/zabbix_*    /etc/init.d/ 复制启动脚本
# chmod +x /etc/init.d/zabbix_*
# vim /etc/init.d/zabbix_server
BASEDIR=/data/app/zabbix
或者
sed -i "s@BASEDIR=/usr/local@BASEDIR=/data/app/zabbix@g" /etc/init.d/zabbix_server

8、添加开机启动

# chkconfig --add /etc/init.d/zabbix_server
# chkconfig --add /etc/init.d/zabbix_agentd
# chkconfig zabbix_server on
# chkconfig zabbix_agentd on

9、创建web文件

mkdir /var/www/html/zabbix
cp -r /data/app/zabbix/frontends/php/* /var/www/html/zabbix
chown -R apache.apache /var/www/html/zabbix/

10、访问

浏览器访问: 10.250.0.88/zabbix 用户名:Admin 密码:zabbix

可能会遇到刚启动server就出现server is dead。。。这种一般情况是没有连接数据库!可以通过查看日志来分析错误原因,tail -20 /tmp/zabbix_server.log查看报错原因。

三、zabbix-agent安装

1.下载以及安装

# useradd -r -s /sbin/nologin zabbix 
# wget https://nchc.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/4.0.4/zabbix-4.0.4.tar.gz
# tar zxf zabbix-4.0.4.tar.gz
# mv zabbix-4.0.4 /data/app/zabbix_agentd
# cd /data/app/zabbix_agentd
# ./configure --prefix=/data/app/zabbix_agentd \
   --sysconfdir=/etc/zabbix/ \
   --enable-agent 

# make && make install

2、修改配置文件

ps:主动被动模式(混动)

# egrep -v "^$|*#" /etc/zabbix/zabbix_agentd.conf
LogFile=/tmp/zabbix_agentd.log
Server=10.250.0.88                                       #server ip     
ServerActive=10.250.0.88                                 #server ip
Hostname=10.250.0.89                                     #这里填本机ip,或随便写一个吧!       
RefreshActiveChecks=90
BufferSize=2048
MaxLinesPerSecond=100
Timeout=10
Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf
UnsafeUserParameters=1

3、添加快捷启动

# cp /data/app/zabbix_agentd/misc/init.d/fedora/core/zabbix_agentd   /etc/init.d/ 复制启动脚本
# chmod +x /etc/init.d/zabbix_*
# vim /etc/init.d/zabbix_agentd
BASEDIR=/data/app/zabbix_agentd
或者
sed -i "s@BASEDIR=/usr/local@BASEDIR=/data/app/zabbix_agent@g" /etc/init.d/zabbix_agentd

4、添加防火墙

# iptables -A INPUT -s ' Server IP' -p tcp --dport 10050 -j ACCEPT
# service iptables save

5、添加开机启动

# /etc/init.d/zabbix_agentd start
# chkconfig --add /etc/init.d/zabbix_agentd
# chkconfig zabbix_agentd on
# /etc/init.d/zabbix_agentd status

四、zabbix的使用!

1、主动模式设置模板

ps:因为agentd采用的是混动模式,默认模板是被动,改为主动!

1.1、配置--模板--找到 Template OS Linux
image.png

1.1.1、点击Template。。然后全克隆!

image.png

1.1.2、名称改一下,方便辨别!然后点添加!

image.png

然后选择类型勾上,选择主动式,其他不用操作,下方点更新!

1.2、返回模板中,找到刚克隆的模板!


image.png

1.2.1、点击监控项,勾选全部--批量更新!


image.png

1.2.2、点击1.2图中的自动发现!图中有两个呢!都设置一下!设置成主动式!

image.png

2、添加主机

由于生产环境主机数量比较多,所以我们采用自动发现功能来自动批量添加主机。

添加主机前需要先创建群组!

配置--主机群组--创建主机群组

image.png
2.1、方法一

ps:这个方法,需要在agentd某个参数配置健值,懒得配置,所以建议方法二!

自动发现规则

配置--自动发现--创建自动发现规则

image.png

ps:名称随意取哟!更新间隔60s根据服务器数量定时间!

image.png

动作

事件源选择自动发现!


image.png

名称随意写哟!条件主要三个如下图,注意添加!

image.png

这里主要是三个操作,添加主机,添加群组,链接模板!当然你也可以设置发送消息!注意添加!

ps:这里链接模板选择克隆的那个主动式模板!

image.png

最后!监测--自动发现,可以看到主机慢慢添加,刷新!

image.png
2.2、方法二

ps:和方法一主要是自动发现不一样!动作是一样的!采用ping的方式,不过zabbix3之后好像使用的是fping!so!

# yum install -y fping

image.png

然后就是添加动作的,和方法一动作一样哟!

3、邮件报警

3.1、安装mailx

(云服务因为禁止了25端口,要用另一个端口,方法百度哈)

# yum install mailx -y
# vim /etc/mail.rc      文件末尾添加
set [email protected]

set smtp=smtp.139.com

set [email protected]

set smtp-auth-password=buaini    (有授权密码的例如163那些填授权,没的话填密码)

set smtp-auth=login

测试能否发送邮件

# echo "hello,i am suke!" |mail -s "zabbix" [email protected]

3.2、server邮件脚本
# cd /data/app/zabbix/alertscripts       (这个目录权限需要确保zabbix能访问)
# vim sendmail.sh
messages=`echo $3 | tr '\r\n' '\n'`
subject=`echo $2 | tr '\r\n' '\n'`
echo "${messages}" | mail -s "${subject}" $1 >>/tmp/mailx.log 2>&1
# chown zabbix.zabbix sendmail.sh
# chmod +x sendmail.sh
# chown zabbix.zabbix /tmp/mailx.log

测试发送邮件

# ./sendmail.sh [email protected] "测试邮件标题" "测试邮件内容"

3.3、server图形化界面配置
3.3.1、配置报警媒介类型
image.png

脚本参数:

{ALERT.SENDTO} 收件人

{ALERT.SUBJECT} 主题

{ALERT.MESSAGE} 消息

3.3.2、配置用户

ps:暂用系统用户,也可自己创建用户,但要注意权限问题!添加收件人!

3.3.3、配置动作

注意:事件源是触发器!

image.png
image.png

默认标题:

 故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!

消息内容:

告警主机:{IPADDRESS}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}

image.png

默认标题:

恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!

消息内容:

告警主机:{IPADDRESS}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}

4、agentd端监控脚本的部署

4.1、agentd端
# cd /data/app/zabbix_agentd/
# mkdir script
# chown zabbix.zabbix script
# vim sftpfile.sh

# vim /etc/zabbix/zabbix_agentd.conf

image.png
4.2、server端
# cd /data/app/zabbix
# bin/zabbix_get -s 10.250.0.95 -p 10050 -k "sftpfile"      监测能否获取数据

4.3、配置监控项

自定义,不用参照我的,改了端口。

image.png
4.4、配置触发器

这个根据自己的脚本而改!

image.png
4.5、添加动作

上面有哟!

5、使用python3导出zabbix监控数据到excel中

1、Python3.6.8的安装

官网地址:https://www.python.org/

# wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz

# tar xzf Python-3.6.8.tgz
# mv Python-3.6.8 /usr/local/python3
# cd /usr/local/python3
# ./configure –prefix=/usr/local/python3              ps:缺依赖,自己安装哈!
# make -j 2 && make install
# ln -s /usr/local/python3/bin/python3 /usr/bin/python3
# python -V

2、模块安装

需要两个模块PyMySQL、XlsxWriter

2.1、PyMySQL的安装
# pip3 install PyMySQL                          ps:可能会提示升级pip!最新版模块

如果是内网,而且需要制定版本号,下载包安装

$ # X.X 为 PyMySQL 的版本号
$ tar xzf py...........
$ cd PyMySQL*
$ python3 setup.py install
$ # 现在你可以删除 PyMySQL* 目录

2.2、XlsxWriter的安装
# pip3 install XlsxWriter;

ps:如果是内网,而且需要制定版本号,下载包安装,和上面PyMySQL的安装方法类似哟!

2.3、脚本:
#!/usr/bin/python3
# coding:utf-8

import datetime
import time

import pymysql
import xlsxwriter

# zabbix数据库信息:
zdbhost = '10.250.0.88'
zdbuser = 'zabbix'
zdbpass = '12345678'
zdbport = 3306
zdbname = 'zabbix'

# 生成文件名称:
xlsfilename = 'zabbix.xls'

# 需要查询的key列表 [名称,表名,key值,取值,格式化,数据整除处理]
keys = [
    ['CPU平均空闲值', 'trends', 'system.cpu.util[,idle]', 'avg', '%.2f', 1],
    ['CPU最小空闲值', 'trends', 'system.cpu.util[,idle]', 'min', '%.2f', 1],
    ['CPU5分钟负载', 'trends', 'system.cpu.load[percpu,avg5]', 'avg', '%.2f', 1],
    ['内存大小(G)', 'trends_uint', 'vm.memory.size[total]', 'avg', '',  1048576000],
    ['剩余内存(G)', 'trends_uint', 'vm.memory.size[available]', 'avg', '', 1048576000],
    ['可用最小内存(G)', 'trends_uint', 'vm.memory.size[available]', 'min', '', 1048576000],
    ['swap总大小(G)', 'trends_uint', 'system.swap.size[,total]', 'avg', '', 1048576000],
    ['swap平均剩余(G)', 'trends_uint', 'system.swap.size[,free]', 'avg', '', 1048576000],
    ['/总大小(G)', 'trends_uint', 'vfs.fs.size[/,total]', 'avg', '', 1073741824],
    ['/可用空间(%)', 'trends', 'vfs.fs.size[/,pfree]', 'avg', '%.2f', 1],
    ['/boot总大小(G)', 'trends_uint', 'vfs.fs.size[/boot,total]', 'avg', '', 1048576000],
    ['/boot可用空间(%)', 'trends', 'vfs.fs.size[/boot,pfree]', 'avg', '%.2f', 1],
    ['/data总大小(G)', 'trends_uint', 'vfs.fs.size[/data,total]', 'avg', '', 1048576000],
    ['/data可用空间(%)', 'trends', 'vfs.fs.size[/data,pfree]', 'avg', '%.2f', 1],
    ['/opt总大小(G)', 'trends_uint', 'vfs.fs.size[/opt,total]', 'avg', '', 1048576000],
    ['/opt可用空间(%)', 'trends', 'vfs.fs.size[/opt,pfree]', 'avg', '%.2f', 1],
    ['/tmp总大小(G)', 'trends_uint', 'vfs.fs.size[/tmp,total]', 'avg', '', 1048576000],
    ['/tmp可用空间(%)', 'trends', 'vfs.fs.size[/tmp,pfree]', 'avg', '%.2f', 1],
    ['/usr总大小(G)', 'trends_uint', 'vfs.fs.size[/usr,total]', 'avg', '', 1048576000],
    ['/usr可用空间(%)', 'trends', 'vfs.fs.size[/usr,pfree]', 'avg', '%.2f', 1],
    ['/var总大小(G)', 'trends_uint', 'vfs.fs.size[/var,total]', 'avg', '', 1048576000],
    ['/var可用空间(%)', 'trends', 'vfs.fs.size[/var,pfree]', 'avg', '%.2f', 1],
#    ['进入最大流量(Kbps)', 'trends_uint', 'net.if.in[eth0]', 'max', '', 1000],
#    ['进入平均流量(Kbps)', 'trends_uint', 'net.if.in[eth0]', 'avg', '', 1000],
#    ['进入最小流量(Kbps)', 'trends_uint', 'net.if.in[eth0]', 'min', '', 1000],
#    ['出去最大流量(Kbps)', 'trends_uint', 'net.if.out[eth0]', 'max', '', 1000],
#    ['出去平均流量(Kbps)', 'trends_uint', 'net.if.out[eth0]', 'avg', '', 1000],
#    ['出去最小流量(Kbps)', 'trends_uint', 'net.if.out[eth0]', 'min', '', 1000],
]

class ReportForm:

    def __init__(self):
        '''打开数据库连接'''
        self.conn = pymysql.connect(host=zdbhost,port=zdbport,user=zdbuser,password=zdbpass,db=zdbname,charset='utf8')
        self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)
        # 生成zabbix哪个分组报表
        self.name = 'dianqu'
        # 获取IP信息:
        self.IpInfoList = self.__getHostList()
        print(self.IpInfoList)

    def __getHostList(self):
        '''根据zabbix组名获取该组所有IP'''

        # 查询组ID:
        sql = 'select groupid from hstgrp where name = "%s" ' % (self.name)
        self.cursor.execute(sql)
        groupid = self.cursor.fetchone()['groupid']
        # 根据groupid查询该分组下面的所有主机ID(hostid):
        sql = 'select hostid from hosts_groups where groupid = "%s"' % (groupid)
        self.cursor.execute(sql)
        hostlist = self.cursor.fetchall()
        print('getHostList-hostlist:',hostlist)
        # 生成IP信息字典:结构为{'10.250.0.88':{'hostid':10086L,},}
        IpInfoList = {}
        for i in hostlist:
            hostid = i['hostid']
            sql = 'select host from hosts where status = 0 and hostid = "%s"' % (hostid)
            print(sql)
            ret = self.cursor.execute(sql)
            if ret:
                IpInfoList[self.cursor.fetchone()['host']] = {'hostid': hostid}
        print('getHostList-IpInfoList:',IpInfoList)
        return IpInfoList

    def __getItemid(self, hostid, itemname):
        '''获取itemid'''
        sql = 'select itemid from items where hostid = "%s" and key_ = "%s"' % (hostid, itemname)
        print(sql)
        if self.cursor.execute(sql):
            itemid = self.cursor.fetchone()['itemid']
            print('itemid:',itemid)
        else:
            itemid = None
        return itemid

    def getTrendsValue(self, type, itemid, start_time, stop_time):
        '''查询trends_uint表的值,type的值为min,max,avg三种'''
        sql = 'select %s(value_%s) as result from trends where itemid = %s and clock >= %s and clock <= %s' % (type, type, itemid, start_time, stop_time)
        print(sql)
        self.cursor.execute(sql)
        result = self.cursor.fetchone()['result']
        if result == None:
            result = 0
        return result

    def getTrends_uintValue(self, type, itemid, start_time, stop_time):
        '''查询trends_uint表的值,type的值为min,max,avg三种'''
        sql = 'select %s(value_%s) as result from trends_uint where itemid = %s and clock >= %s and clock <= %s' % (type, type, itemid, start_time, stop_time)
        print(sql)
        self.cursor.execute(sql)
        result = self.cursor.fetchone()['result']
        print(result)
        if result:
            result = int(result)
        else:
            result = 0
        return result

    def getYesterDayData(self, type, hostid, table, itemname):
        '''根据hostid,itemname获取该监控项的值'''
        #获取前一天0时到24时数据
        ts_first = int(time.mktime(datetime.date(datetime.date.today().year, datetime.date.today().month, datetime.date.today().day - 1).timetuple()))
        print('ts_first:',ts_first)
        lst_last = datetime.date(datetime.date.today().year, datetime.date.today().month, datetime.date.today().day) - datetime.timedelta(1)
        ts_last = int(time.mktime(lst_last.timetuple()))
        print('ts_last:',ts_last)
        itemid = self.__getItemid(hostid, itemname)
        print('itemid:',itemid)
        print('get %sValue' % table.capitalize())
        # fun1 = getattr(zabbix,table.capitalize())
        fun1 = getattr(zabbix, 'get%sValue' % table.capitalize())
        print('function:', fun1)
        data = fun1(type, itemid, ts_first, ts_last)
        print('data:',data)
        return data

    def getInfo(self):
        # 循环读取IP列表信息
        for ip, resultdict in zabbix.IpInfoList.items():
            print('asdafs',ip,resultdict)
            print("正在查询 IP:{} hostid:{} 的信息!".format(ip, resultdict['hostid']))
            # 循环读取keys,逐个key统计数据:
            for value in keys:
                print('value:',value)
                print("\t正在统计 key_:%s" % value[2])
                if not value[2] in zabbix.IpInfoList[ip]:
                    zabbix.IpInfoList[ip][value[2]] = {}
                    print('not value2:',zabbix.IpInfoList)
                print(value[3]+value[1]+value[2])
                data = zabbix.getYesterDayData(value[3], resultdict['hostid'], value[1], value[2])
                print('getdata:',data)
                print(zabbix.IpInfoList)
                zabbix.IpInfoList[ip][value[2]][value[3]] = data
                print(zabbix.IpInfoList)
            print('111111111111')

    def writeToXls2(self):
        '''生成xls文件'''
        try:
            # 创建文件
            workbook = xlsxwriter.Workbook(xlsfilename)

            # 创建工作薄 demo
            worksheet = workbook.add_worksheet()

            # 写入第一列:
            worksheet.write(0, 0, "主机")
            i = 1
            for ip in self.IpInfoList:
                worksheet.write(i, 0, ip)
                i = i + 1

            # 写入其他列:
            i = 1
            for value in keys:
                print(value)
                print('列名:%s + 值:%s'%(value[0],value[4]))
                worksheet.write(0, i, value[0])

                # 写入该列内容:
                print(value)
                j = 1
                for ip, result in self.IpInfoList.items():
                    print('result:%s'%result)
                    if value[4]:
                        worksheet.write(j, i, value[4] % result[value[2]][value[3]])
                        # worksheet.write(j, i, 0)
                    else:
                        worksheet.write(j, i, result[value[2]][value[3]] / value[5])
                        # worksheet.write(j, i, 0)
                    j = j + 1
                i = i + 1
            workbook.close()
        except Exception as e:
            print('异常:', e)

    def logout(self):
        '''关闭数据库连接'''
        self.cursor.close()
        self.conn.close()
if __name__ == "__main__":
    zabbix = ReportForm()
    zabbix.getInfo()
    zabbix.writeToXls2()
    zabbix.logout()                           

邮件发送的话,自己添加哈!

五、zabbix_proxy的部署

1、下载以及安装

# groupadd zabbix
# useradd -g zabbix -m -s /sbin/nologin zabbix
# wget https://nchc.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/4.0.4/zabbix-4.0.4.tar.gz
# tar zxf zabbix-4.0.4.tar.gz
# mv zabbix-4.0.4 /data/app/zabbix_proxy
# cd /data/app/zabbix_proxy
# ./configure --prefix=/data/app/zabbix_proxy --sysconfdir=/etc/zabbix/ --enable-proxy --enable-agent --with-mysql -with-net-snmp --with-libcurl --with-ssh2 --enable-java
# make -j 2 && make install

2、修改配置文件

ps:proxy需要安装数据库哟!这个上面有的!还有数据库名不能用zabbix哟!否则会报错!

2.1、导入sql语句
# mysql -uroot -p
# mysql>CREATE DATABASE zabbix_proxy CHARACTER SET utf8 COLLATE utf8_bin;
# mysql>grant all privileges on zabbix_proxy.* to zabbix@'%' identified by '12345678';
# mysql>exit
# cd /data/app/zabbix_proxy/database/mysql
# mysql -uzabbix -p12345678 zabbix < schema.sql    #proxy只需要导入此条语句
2.2、修改proxy配置文件
# vim /etc/zabbix/zabbix_proxy.conf
Server=ip                      #zabbix-server的内网IP
Hostname=Zabbix_proxy          #必须和WEB页面添加代理时设置的名称一致
LogFile=/tmp/zabbix_proxy.log
DBHost=localhost               #填ip也可以
DBName=zabbix_proxy            #数据库名
DBUser=zabbix                  #数据库用户名
DBPassword=12345678            #数据库密码
ConfigFrequency=600               
DataSenderFrequency=1
2.3、修改agentd配置文件
# vim /etc/zabbix/zabbix_agentd.conf
server=ip                       #指定proxy的ip,同区域可以内网ip,只需修改这个!

3、启动

# cp /data/app/zabbix_proxy/misc/init.d/fedora/core/zabbix_*   /etc/init.d/ 
  #添加快捷启动
# chmod +x /etc/init.d/zabbix_*
# vim /etc/init.d/zabbix_agentd
BASEDIR=/data/app/zabbix_proxy
或者
sed -i "s@BASEDIR=/usr/local@BASEDIR=/data/app/zabbix_proxy@g" /etc/init.d/zabbix_agentd

# /data/app/zabbix_proxy/sbin/zabbix_proxy      #启动proxy
# /etc/init.d/zabbix_agentd start               #启动agentd

4、添加zabbix_proxy

image.png
image.png
4.1、agentd主机指定代理
image.png

六、zabbix自定义监控

1、自定义添加磁盘io监控

1.1、添加自动发现
1.1.1、编辑脚本

自动发现磁盘脚本:disk_discovery

#!/bin/bash
diskarray=(`cat /proc/diskstats |grep -E "\bsd[abcdefg]\b|\bxvd[abcdefg]\b"|grep -i "\b$1\b"|awk '{print $3}'|sort|uniq   2>/dev/null`)
length=${#diskarray[@]}
printf "{\n"
printf  '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
          printf '\n\t\t{'
          printf "\"{#DISK_NAME}\":\"${diskarray[$i]}\"}"
          if [ $i -lt $[$length-1] ];then
                  printf ','
          fi
done
          printf  "\n\t]\n"
          printf "}\n"

磁盘状态脚本

#/bin/sh
Device=$1
DISK=$2
case $DISK in
          tps)
            iostat -dmt 1 2|grep "\b$Device\b"|tail -1|awk '{print $2}'
            ;;
          rps)
            iostat -dxmt 1 2|grep "\b$Device\b"|tail -1|awk '{print $4}'
            ;;
          wps)
            iostat -dxmt 1 2|grep "\b$Device\b" |tail -1|awk '{print $5}'
            ;;
        rMps)
            iostat -dxmt 1 2|grep "\b$Device\b" |tail -1|awk '{print $6}'
            ;;
        wMps)
            iostat -dxmt 1 2|grep "\b$Device\b" |tail -1|awk '{print $7}'
            ;;
         util)
            iostat -dxmt |grep "\b$Device\b" |tail -1|awk '{print $12}'
            ;;
esac
1.1.2、修改agentd配置文件
# yum install -y sysstat

ps:脚本目录按自己的哈!不用参照我的!需要x执行权限哟!

# egrep -v "^$|*#" /etc/zabbix/zabbix_agentd.conf
PidFile=/tmp/zabbix_agentd.pid
LogFile=/tmp/zabbix_agentd.log
Server=10.0.0.0
Hostname=Zabbix server
Timeout=10                                       #调大
Include=/etc/zabbix/zabbix_agentd.d/*.conf
UnsafeUserParameters=1                           #开启 
UserParameter=disk.discovery,/etc/zabbix/zabbix_agentd.d/disk_discovery.sh
UserParameter=disk.status[*],/etc/zabbix/zabbix_agentd.d/disk_status.sh $1 $2
1.1.3、在默认模板中添加自动发现规则
image.png

image.png
1.1.4、添加监控原型
image.png

其他:
名称:{#DISK_NAME}IOPS
键值:disk.status[{#DISK_NAME},tps]
信息类型:数字

名称:{#DISK_NAME}每秒完成读次数
键值:disk.status[{#DISK_NAME},rps]
信息类型:浮点数

名称:{#DISK_NAME}每秒完成写次数
键值:disk.status[{#DISK_NAME},wps]
信息类型:浮点数

名称:{#DISK_NAME}每秒读数据量
键值:disk.status[{#DISK_NAME},rMps]
信息类型:浮点数

名称:{#DISK_NAME}每秒写数据量
键值:disk.status[{#DISK_NAME},wMps]
信息类型:浮点数

名称:{#DISK_NAME}IO非空的时间比率
键值:disk.status[{#DISK_NAME},util]
信息类型:浮点数

1.1.5、添加图形原型

触发器:略


image.png

2、自定义数据库监控

2.1、主库监控

2.1.1、创建监控用户
mysql> GRANT USAGE ON *.* TO 'superhero'@'localhost' IDENTIFIED BY 'passwd';
mysql> FLUSH PRIVILEGES;
2.1.2、添加zabbix_agentd配置
1562640113075.png

查看配置文件,在Include所指定目录下,添加配置文件。
新建一个conf文件,添加以下!脚本位置自己定义哈!

UserParameter=mysql.status[*],/bin/bash /apps/sh/zabbix_scripts/mysql_monitor.sh "$1"
UserParameter=mysql.connected,ss -an|grep 3306|grep ESTAB|wc -l
UserParameter=mysql.version,mysql -V

注意:上面端口根据自己数据库端口进行更改!

2.1.3、模板以及脚本

注:本文在原有的数据库模板下进行了更改和添加了相关参数的监控。

监控项:

名称 键值
MySQL version mysql.version 版本
MySQL status mysql.status[ping] 状态
MySQL uptime mysql.status[Uptime] 运行时间
MySQL TPS mysql.status[TPS] 每秒事物量
MySQL QPS mysql.status[QPS] 每秒查询量
MySQL slow queries mysql.status[Slow_queries] 慢查询
MySQL update operations per second mysql.status[Com_update] 每秒更新
MySQL select operations per second mysql.status[Com_select] 每秒选择
MySQL rollback operations per second mysql.status[Com_rollback] 每秒回滚
MySQL queries per second mysql.status[Questions] 每秒查询
MySQL Qcache_free_blocks mysql.status[Qcache_free_blocks] 缓存中相邻内存块的个数
MySQL insert operations per second mysql.status[Com_insert] 每秒插入
MySQL delete operations per second mysql.status[Com_delete] 每秒删除
MySQL connection Num mysql.connected 连接数
MySQL commit operations per second mysql.status[Com_commit] 每秒提交
MySQL bytes sent per second mysql.status[Bytes_sent] 每秒发送字节数
MySQL bytes received per second mysql.status[Bytes_received] 每秒接收字节数
MySQL begin operations per second mysql.status[Com_begin] 每秒开始运算

触发器:略
当然我提供了模板,基于版本3.4.4的呢,其他2,或者4的版本可能不支持哟!没有尝试过,不知道行不行哟!可以试一下,不兼容的话,手动添加哈!
链接: https://pan.baidu.com/s/12bLP0z2yc5nMGoiyM3Rp3w 提取码: n9z5
数据库脚本:

#!/bin/bash
# auther:suketongxue
# time:2019.6.11
# Your Treasure boy!

MYSQL_USER='superhero'
MYSQL_PWD='Suke@tongxue'
MYSQL_HOST='localhost'
MYSQL_PORT='3306'
MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER}  -h${MYSQL_HOST} -P${MYSQL_PORT}"
export MYSQL_PWD='Suke@tongxue'
# Test the parameter
if [ $# -ne "1" ];then 
    echo "arg error!" 
fi 

# Get the value
case $1 in 
    Uptime) 
        result=`${MYSQL_CONN} status|cut -f2 -d":"|cut -f1 -d"T"` 
        echo $result
        ;; 
    QPS)
        result=`${MYSQL_CONN} status|awk '{print $22}'`
        echo $result
        ;;
    TPS)
        rollback=`${MYSQL_CONN} extended-status |awk '/\/{print $4}'`
        commit=`${MYSQL_CONN} extended-status |awk '/\/{print $4}'`
        Uptime=`${MYSQL_CONN} status|awk '{print $2}'`
        tps=`awk 'BEGIN{print '$(($rollback+$commit))'/'$Uptime'}'`
        echo $tps
        ;; 
    Com_update) 
        result=`${MYSQL_CONN} extended-status |grep -w "Com_update"|cut -d"|" -f3` 
        echo $result 
        ;; 
    Slow_queries) 
        result=`${MYSQL_CONN} status |cut -f5 -d":"|cut -f1 -d"O"` 
        echo $result 
        ;; 
    Com_select) 
        result=`${MYSQL_CONN} extended-status |grep -w "Com_select"|cut -d"|" -f3` 
        echo $result 
        ;; 
    Com_rollback) 
        result=`${MYSQL_CONN} extended-status |grep -w "Com_rollback"|cut -d"|" -f3` 
        echo $result 
        ;; 
    Questions) 
        result=`${MYSQL_CONN} status|cut -f4 -d":"|cut -f1 -d"S"` 
        echo $result 
        ;; 
    Com_insert) 
        result=`${MYSQL_CONN} extended-status |grep -w "Com_insert"|cut -d"|" -f3` 
        echo $result 
        ;; 
    Com_delete) 
        result=`${MYSQL_CONN} extended-status |grep -w "Com_delete"|cut -d"|" -f3` 
        echo $result 
        ;; 
    Com_commit) 
        result=`${MYSQL_CONN} extended-status |grep -w "Com_commit"|cut -d"|" -f3` 
        echo $result 
        ;; 
    Bytes_sent) 
        result=`${MYSQL_CONN} extended-status |grep -w "Bytes_sent" |cut -d"|" -f3` 
        echo $result 
        ;; 
    Bytes_received) 
        result=`${MYSQL_CONN} extended-status |grep -w "Bytes_received" |cut -d"|" -f3` 
        echo $result 
        ;; 
    Com_begin) 
        result=`${MYSQL_CONN} extended-status |grep -w "Com_begin"|cut -d"|" -f3` 
        echo $result 
        ;;
    Qcache_free_blocks)
        result=`${MYSQL_CONN} extended-status |grep -w "Qcache_free_blocks"|cut -d"|" -f3` 
        echo $result
        ;;
    ping)
        result=`/usr/bin/mysqladmin -u${MYSQL_USER} -h${MYSQL_HOST} ping | grep -c alive`
        echo $result
        ;;
    *) 
        echo "Usage:$0(Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)" 
        ;; 
esac

注:文中有个export密码到环境,主要是文本行输入有密码,会有不安全提示,所以需要去掉这个,只获得数值!
然后就是重启了!

 # /etc/init.d/zabbix_agentd restart
2.1.4、检测
# zabbix_get -s ip -P 端口 -k 键值
2.1.5、查看zabbix界面是否有效
1562642293544.png

2.2、从库监控

2.2.1、创建监控用户
mysql> GRANT USAGE,SELECT,PROCESS,SHOW,REPLICATION CLIENT ON *.* TO 'superhero'@'localhost' IDENTIFIED BY 'passwd';
mysql> FLUSH PRIVILEGES;
2.2.2、添加zabbix_agentd配置

zabbix_agentd配置文件和上述主库一致性!
新建一个conf文件,添加以下!脚本位置自己定义哈!

UserParameter=mysql.slave.status[*],/bin/bash /apps/sh/zabbix_scripts/mysql_slave_monitor.sh "$1"
2.2.3、模板以及脚本
名称 键值 信息类型 说明
Mysql slave status mysql.slave.status[S_status] 字符 从库状态
mysql master-slave status mysql.slave.status[M-S_status] 字符 主从同步状态
Mysql Behind master mysql.slave.status[M-S_delay] 字符 主从延迟

触发器:

名称 表达式
Mysql Slave is down {Template DB MySQL Slave:mysql.slave.status[S_status].str(Yes)}=0
Mysql master and slave are not synchronized {Template DB MySQL Slave:mysql.slave.status[M-S_status].str(2)}=0
Mysql slave is behind master {Template DB MySQL Slave:mysql.slave.status[M-S_delay].last()}>10

按需更改!
模板:

数据库从库监控脚本:

#!/bin/bash
# auther:suketongxue
# time:Facing the sea
# Treasure boy!

USER='superhero'
PWD='passwd'
HOST='localhost'
PORT='3306'
COMM_MYSQL="mysql -u$USER -h$HOST -P$PORT -p$PWD"

# Test the parameter
if [ $# -ne "1" ];then
    echo "arg error!" 
fi

# Get the value
function M-S_status(){
          $COMM_MYSQL -e 'show slave status\G' 2>/dev/null |egrep "Slave_IO_Running|Slave_SQL_Running" |awk '{print $2}' |grep -c Yes
}
function M-S_delay(){
          $COMM_MYSQL -e 'show slave status\G' 2>/dev/null |grep "Seconds_Behind_Master" |tr -d " " |awk -F: '{print $2}'
}
function S_status(){
          $COMM_MYSQL -e 'show slave status\G' 2>/dev/null |grep "Slave_IO_Running" |tr -d " " |awk -F: '{print $2}'
}

$1

然后就是重启了!

 # /etc/init.d/zabbix_agentd restart
2.2.4、检测

server端

 # zabbix_get -s ip -P 端口 -k 键值
2.2.5、查看zabbix界面是否有效

图略!

你可能感兴趣的:(Zabbix-4.0.4监控系统的部署)