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
# 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;
}
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、官网下载
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
1.1.1、点击Template。。然后全克隆!
1.1.2、名称改一下,方便辨别!然后点添加!
然后选择类型勾上,选择主动式,其他不用操作,下方点更新!
1.2、返回模板中,找到刚克隆的模板!
1.2.1、点击监控项,勾选全部--批量更新!
1.2.2、点击1.2图中的自动发现!图中有两个呢!都设置一下!设置成主动式!
2、添加主机
由于生产环境主机数量比较多,所以我们采用自动发现功能来自动批量添加主机。
添加主机前需要先创建群组!
配置--主机群组--创建主机群组
2.1、方法一
ps:这个方法,需要在agentd某个参数配置健值,懒得配置,所以建议方法二!
自动发现规则
配置--自动发现--创建自动发现规则
ps:名称随意取哟!更新间隔60s根据服务器数量定时间!
动作:
事件源选择自动发现!
名称随意写哟!条件主要三个如下图,注意添加!
这里主要是三个操作,添加主机,添加群组,链接模板!当然你也可以设置发送消息!注意添加!
ps:这里链接模板选择克隆的那个主动式模板!
最后!监测--自动发现,可以看到主机慢慢添加,刷新!
2.2、方法二
ps:和方法一主要是自动发现不一样!动作是一样的!采用ping的方式,不过zabbix3之后好像使用的是fping!so!
# yum install -y fping
然后就是添加动作的,和方法一动作一样哟!
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、配置报警媒介类型
脚本参数:
{ALERT.SENDTO} 收件人
{ALERT.SUBJECT} 主题
{ALERT.MESSAGE} 消息
3.3.2、配置用户
ps:暂用系统用户,也可自己创建用户,但要注意权限问题!添加收件人!
3.3.3、配置动作
注意:事件源是触发器!
默认标题:
故障{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}
默认标题:
恢复{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
4.2、server端
# cd /data/app/zabbix
# bin/zabbix_get -s 10.250.0.95 -p 10050 -k "sftpfile" 监测能否获取数据
4.3、配置监控项
自定义,不用参照我的,改了端口。
4.4、配置触发器
这个根据自己的脚本而改!
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
4.1、agentd主机指定代理
六、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、在默认模板中添加自动发现规则
1.1.4、添加监控原型
其他:
名称:{#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、添加图形原型
触发器:略
2、自定义数据库监控
2.1、主库监控
2.1.1、创建监控用户
mysql> GRANT USAGE ON *.* TO 'superhero'@'localhost' IDENTIFIED BY 'passwd';
mysql> FLUSH PRIVILEGES;
2.1.2、添加zabbix_agentd配置
查看配置文件,在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界面是否有效
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界面是否有效
图略!