美文网首页DevOps解决方案运维监控
Zabbix-4.0.4监控系统的部署

Zabbix-4.0.4监控系统的部署

作者: 苏米西 | 来源:发表于2019-05-02 15:04 被阅读97次

    ​ 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 from=123456789@139.com
    
    set smtp=smtp.139.com
    
    set smtp-auth-user=123456789@139.com
    
    set smtp-auth-password=buaini    (有授权密码的例如163那些填授权,没的话填密码)
    
    set smtp-auth=login
    
    

    测试能否发送邮件

    # echo "hello,i am suke!" |mail -s "zabbix" xxx@qq.com
    
    
    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 xxx@qq.com "测试邮件标题" "测试邮件内容"
    
    
    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}故障!
    
    

    消息内容:

    告警主机:{HOSTNAME1}
    告警时间:{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}已恢复!
    
    

    消息内容:

    告警主机:{HOSTNAME1}
    告警时间:{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

    ing。。。

    相关文章

      网友评论

        本文标题:Zabbix-4.0.4监控系统的部署

        本文链接:https://www.haomeiwen.com/subject/usynnqtx.html