Zabbix(5)通过JMX监控Tomcat

Zabbix监控tomcat主要使用的是zabbix的zabbix-java-gateway。从Zabbix 2.0开始,内置了监控JMX的功能,叫做“Zabbix Java Gateway”,在Zabbix Server和Zabbix Proxy上启动名为“Zabbix Java Gateway”的进程,当需要获取JMX数据时,Zabbix Server会“问”JMX Gateway,然后JMX Gateway根据JMX管理API去查询需要的数据。在使用时,Java程序不需要在代码中新增任何东西,只需要在启动的时候加上一些JVM参数,使得它可以支持使用端口监控JMX。JMX的全称是Java Management Extensions,即Java管理扩展。Java程序会开放一些端口,用来获取运行状况。

一、安装jmx服务器

1、安装jdk

下载JDK: http://www.oracle.com/technetwork/java/archive-139210.html

配置环境变量: http://islocal.cc/2017/09/27/JDK%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E9%85%8D%E7%BD%AE/

2、安装jmx服务

yum -y install zabbix-java-gateway

3、配置jmx服务

egrep -v '#|^$' /etc/zabbix/zabbix_java_gateway.conf
LISTEN_IP="0.0.0.0"
LISTEN_PORT=10052
PID_FILE="/var/run/zabbix/zabbix_java.pid"
START_POLLERS=5
TIMEOUT=3
systemctl start zabbix-java-gateway
systemctl enable zabbix-java-gateway

4、修改zabbix server配置

添加以下三行,这里配置的StartJavaPollers值要小于之前java_gateway中的START_POLLERS

tail -n 3 /etc/zabbix/zabbix_server.conf 
JavaGateway=127.0.0.1
JavaGatewayPort=10052     
StartJavaPollers=3

修改zabbix_server.conf后重启服务

systemctl restart zabbix-server

二、Tomcat配置修改

1、修改配置文件

Windows下tomcat在F:deployapache-tomcat-8.5.20-OUbincatalina.bat中set “CURRENT_DIR=%cd%”下添加以下内容

set CATALINA_OPTS=-Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

2、测试JMX

下载以下两个jar包放在tomcat lib目录下。

下载cmdline-jmxclient-0.10.3.jar

http://crawler.archive.org/cmdline-jmxclient/cmdline-jmxclient-0.10.3.jar

下载catalina-jmx-remote.jar

https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.77/bin/extras/catalina-jmx-remote.jar

F:apache-tomcat-7.0.70(zabbix)lib>java -jar cmdline-jmxclient-0.10.3.jar - 192.168.6.124:12345 java.lang:type=Memory NonHeapMemoryUsage
10/10/2017 16:31:57 +0800 org.archive.jmx.Client NonHeapMemoryUsage:
committed: 24838144
init: 12746752
max: 100663296
used: 24806392

三、在zabbix web页面中添加JMX端口

1、导入模板

zabbix自带的”Template App Generic Java JMX”和”Template App Apache Tomcat JMX”模板很多都获取不到数据,从网上找了个模板,监控项不多,但是都是很实用的。

未分类

未分类

2、添加JMX端口

jmx的端口一定要与在catalina.bat下配置的jmxremote.port一样

未分类

3、关联模板

未分类

4、查看图形

未分类

Zabbix(6)监控SQL Server数据库

监控SQL Server相对来说比较简单,首先我们下载一个MS SQL的模板文件

下载地址:https://share.zabbix.com/databases/microsoft-sql-server/template-ms-sql-2012

修改zabbix_agent.conf文件

添加下边这行到配置文件最后

UserParameter=sqldatabasename.discovery,powershell -NoProfile -ExecutionPolicy Bypass -File C:zabbixscriptsSQLBaseName_To_Zabbix.ps1

将powershell脚本放在目录下

将SQLBaseName_To_Zabbix.ps1脚本放在C:zabbixscripts目录下

重启zabbix agent

重启客户端zabbix agent服务

导入模板文件

导入模板MS SQL 2012.xml

关联模板

未分类

查看最新数据

未分类

zabbix自定Nginx状态监控

监控效果

未分类

未分类

自定义监控脚本

#!/bin/bash
#author:51itinfo.com
## Active connections: 对后端发起的活动连接数
## Server accepts handled requests: accepts表示共处理了多少个连接,handled表示成功创建了 多少次握手(没有失败次数),requests表示总共处理了多少个请求
## Reading: Nginx 读取到客户端的 Header 信息数
## Writing: Nginx 返回给客户端的 Header 信息数
## Waiting: 开启 keep-alive 的情况下,这个值等于 active - ( reading + writing ), 意思是 Nginx 已经处理完成,正在等待下一次请求指令的驻留连接
## 在访问效率很高,请求很快被处理完毕的情况下,Waiting 数比较多是正常的。如果 reading + writing 数较多,则说明并发访问量很大,正在处理过程中

case $1 in
    active)
        curl -s http://127.0.0.1/nginx_status | awk '/Active/ {print $3}' ;;
    accepts)
        curl -s http://127.0.0.1/nginx_status | awk 'NR==3 {print $1}' ;;
    handled)
        curl -s http://127.0.0.1/nginx_status | awk 'NR==3 {print $2}' ;;
    requests)
        curl -s http://127.0.0.1/nginx_status | awk 'NR==3 {print $3}' ;;
    reading)
        curl -s http://127.0.0.1/nginx_status | awk '/Reading/ {print $2}' ;;
    writing)
        curl -s http://127.0.0.1/nginx_status | awk '/Writing/ {print $4}' ;;
    waiting)
        curl -s http://127.0.0.1/nginx_status | awk '/Waiting/ {print $6}' ;;
    *)
        echo "Usage: $0 { active | accepts | handled | requests | reading | writing | waiting }" ;;
esac

Centos7.2下yum安装zabbix

环境准备:

[root@xudongmingzuishuai ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@xudongmingzuishuai ~]# systemctl status firewalld.service   #关闭防火墙
● firewalld.service – firewalld – dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
[root@xudongmingzuishuai ~]# getenforce  #检查是否关闭selinux
Disabled
[root@xudongmingzuishuai ~]# hostname -I
10.0.0.202 172.16.1.202

第1章 安装zabbix源

[root@xudongmingzuishuai ~]# rpm -ivh http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
Retrieving http://mirrors.aliyun.com/zabbix/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
warning: /var/tmp/rpm-tmp.de2mvt: Header V4 DSA/SHA1 Signature, key ID 79ea5ed4: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:zabbix-release-3.0-1.el7         ################################# [100%]
[root@xudongmingzuishuai ~]# cd /etc/yum.repos.d/
[root@xudongmingzuishuai yum.repos.d]# ls
CentOS-Base-Aliyun.repo  epel-Aliyun.repo  zabbix.repo

替换zabbix源的下载地址

[root@xudongmingzuishuai yum.repos.d]# sed -i.bak 's#repo.zabbix.com#mirrors.aliyun.com/zabbix#g' zabbix.repo 
 [root@xudongmingzuishuai yum.repos.d]# ls
 CentOS-Base-Aliyun.repo  epel-Aliyun.repo  zabbix.repo  zabbix.repo.bak 

第2章 安装zabbix相关服务

yum install -y zabbix-server-mysql zabbix-web-mysql

安装数据库

yum install -y mariadb-server

启动数据库服务

systemctl start mariadb.service

登录数据库并创建数据库授权用户

mysql
create database zabbix character set utf8;
grant all on zabbix.* to zabbix@'localhost' identified by 'zabbix';
flush privileges;

启动web服务

systemctl start httpd.service 

更改zabbix服务配置文件时区

sed -i 's@# php_value date.timezone Europe/Riga@ php_value date.timezone Asia/Shanghai@g' /etc/httpd/conf.d/zabbix.conf
systemctl restart httpd.service 

更改httpd配置文件

echo "ServerName 127.0.0.1:80">>/etc/httpd/conf/httpd.conf
systemctl restart httpd.service 

查看zabbix数据库文件所在的位置

rpm -ql zabbix-server-mysql 
cd /usr/share/doc/zabbix-server-mysql-3.0.10/

导入数据库文件

zcat create.sql.gz|mysql -uzabbix -pzabbix zabbix

编辑zabbix服务配置文件添加登录数据库密码

vi /etc/zabbix/zabbix_server.conf 
DBPassword=zabbix

重启zabbix服务

systemctl start zabbix-server.service

Zabbix 监控 Nginx status 性能

其实zabbix对nginx的服务状态监控,网上有很多相关模板以及设置方法,根据自己的需求修改即可,后期我会写一些比较详细用于生产环境中的一些教程。

部署环境:

  • OS:CentOS 7.4
  • WEB: Nginx 1.3
  • 监控:Zabbix 3.4

先决条件:

《Centos 7 源码编译安装 Nginx》
https://www.renwole.com/archives/39

注意:主要是 –with-http_stub_status_module 模块。

1. 修改 nginx.conf

在 server 段 添加以下内容:

$ vim /usr/local/nginx/conf/nginx.conf
location /stub_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}

2. 重启Nginx服务并测试访问

$ systemctl restart nginx.service
$ curl http://127.0.0.1/stub_status
Active connections: 1
server accepts handled requests
304 304 304
Reading: 0 Writing: 1 Waiting: 0

访问返回数据说明Nginx配置正常.

3. 创建 Nginx 监控脚本

将以下代码复制保存为 nginx.sh

$ cd /usr/local/zabbix/bin
$ vim nginx.sh
#!/bin/bash

HOST="127.0.0.1"
PORT="80"
stub_status=stub_status
function check() {
/sbin/pidof nginx | wc -l
}
function active() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
function accepts() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
function handled() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
function requests() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
function reading() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
function writing() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
function waiting() {
/usr/bin/curl -s "http://$HOST:$PORT/${stub_status}/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}

case "$1" in
check)
check
;;
active)
active
;;
accepts)
accepts
;;
handled)
handled
;;
requests)
requests
;;
reading)
reading
;;
writing)
writing
;;
waiting)
waiting
;;

*)
echo $"Usage $0 {check|active|accepts|handled|requests|reading|writing|waiting}"
exit
esac

4. 给该脚本执行权限

$ chmod 755 nginx.sh

5. 创建 userparameter_nginx.conf 配置文件

$ cd /usr/local/zabbix/etc/zabbix_agentd.conf.d

添加以下内容:

$ vim userparameter_nginx.conf
UserParameter=nginx.status[*],/usr/local/zabbix/bin/nginx.sh $1

6. 重启 zabbix

$ systemctl restart zabbix-agent.service

7. 导入 zbx_nginx_templates.xml 模板

下载模板: https://www.renwole.com/zabbix/nginx/zbx_nginx_templates.xml

导入模板添加主机链接到 Template App Nginx 模板即可。

zabbix自动发现监控tomcat健康页面

一、背景

公司系统平台有10几个tomcat服务,由于需要服务保持全年无间断服务,特在tomcat中嵌入专门的监控页面,在curl 专用页面返回值为200时,则认定服务正常运行,否则报警发送专门的监控运维的邮箱。

二、原理

正常的tomcat健康状态监控页面如下图

未分类

我们利用如下命令判断返回值是否为200

shell>/usr/bin/curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' http://10.0.0.107:9100/sms-app/health

倘若返回值不为200,则断定服务异常,报警

三、具体自动发现操作部署如下

1、首先定义需要监控自动发现的tomcat的URL

如下内容

cat >/etc/zabbix/WEB.txt <<EOF
10.0.0.107:9000/sms-admin/health
10.0.0.107:9100/sms-app/health
10.0.0.107:9090/auditServer/health
10.0.0.107:7711/pushControl/health
10.0.0.107:7700/sendService/health
10.0.0.107:6003/pa/health
10.0.0.107:8513/sms/health
10.0.0.107:7712/pushControl/health
10.0.0.107:7725/reply-server/health
10.0.0.107:2222/mdnServer/health
EOF

2、监控脚本如下所示

cat >/etc/zabbix/scripts/web_site_code_status.sh <<EOF
#!/bin/bash 
# function:monitor tcp connect status from zabbix 

source /etc/bashrc >/dev/null 2>&1
source /etc/profile  >/dev/null 2>&1
#/usr/bin/curl -o /dev/null -s -w %{http_code} http://$1/ 

web_site_discovery () {
WEB_SITE=($(cat  /etc/zabbix/WEB.txt|grep -v "^#"))
        printf '{n'
        printf 't"data":[n'
for((i=0;i<${#WEB_SITE[@]};++i))
{
num=$(echo $((${#WEB_SITE[@]}-1)))
        if [ "$i" != ${num} ];
                then
        printf "tt{ n"
        printf "ttt"{#SITENAME}":"${WEB_SITE[$i]}"},n"
                else
                        printf  "tt{ n"
                        printf  "ttt"{#SITENAME}":"${WEB_SITE[$num]}"}]}n"
        fi
}
}

web_site_code () {
/usr/bin/curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' $1
}

case "$1" in
web_site_discovery)
web_site_discovery
;;
web_site_code)
web_site_code $2
;;
*)

echo "Usage:$0 {web_site_discovery|web_site_code [URL]}" 
;;
esac
EOF

3、增加zabbix配置文件监控项目

root@DL-test2:zabbix# grep '^[a-Z]' zabbix_agentd.conf 
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=10.0.0.113
ServerActive=10.0.0.113
Hostname=DL-test2
Include=/etc/zabbix/zabbix_agentd.d/*.conf  #此项打开
cat >/etc/zabbix/zabbix_agentd.d/web_site_discovery.conf <<EOF
UserParameter=web.site.discovery,/bin/bash /etc/zabbix/scripts/web_site_code_status.sh web_site_discovery  
UserParameter=web.site.code[*],/bin/bash /etc/zabbix/scripts/web_site_code_status.sh web_site_code $1
EOF
#/bin/bash 此项必须要加上,不然有可能找不到命令,导致脚本命令无法被zabbix-agent调用

4、增加自动发现模板

模板详见附件
直接在模板里导入附件模板
启动zabbix-agent
会在被监控主机的触发器中发现我们需要监控的tomcat

未分类

停止6003端口的服务,我们会发现如下图所示报警

未分类

然后启动6003服务后,服务监控正常。

至此自动发现tomcat服务状态,部署完毕。

使用Zabbix+Grafana监控

部署代码

https://github.com/liqiang311/zabbix-grafana

部署步骤

准备工作

下载部署代码,并且下载granafa插件

git clone https://github.com/liqiang311/zabbix-grafana.git
git clone https://github.com/alexanderzobnin/grafana-zabbix.git zabbix-grafana/grafana/plugins/grafana-zabbix

下载docker镜像

如何安装Docker和Docker-Compose见http://www.liqiang311.com/2017/09/docker-install/

docker pull mysql:5.7
docker pull zabbix/zabbix-server-mysql:latest
docker pull zabbix/zabbix-web-nginx-mysql:latest
docker pull grafana/grafana:latest

启动命令

cd zabbix-grafana
docker-compose up -d

配置

Zabbix

登录ip:10052,帐号为Admin,密码为zabbix

进入后右上角可以更改语言为中文

Grafana

webip:3000

默认帐号admin/admin

Plugins->app->Zabbix->点击Enable

添加Data Source

点击左上角Grafana图标,选择Data Sources->Add data Source

填写以下内容

Name: zabbix
Type: Zabbix
url: http://localhost:10052/api_jsonrpc.php
Access: proxy
Basic Auth: √
Basic Auth Details User: admin
Basic Auth Details Password: zabbix
Zabbix API details Username: admin
Zabbix API details Password: zabbix

然后点击下方 Save & Test。若成功连接,则按钮上方会显示绿色信息:

Success
Zabbix API version: 3.2.5

客户端安装

若要监控磁盘使用率、CPU等,需在主机上安装如下软件

apt-get install zabbix-agent

然后编辑如下配置文件

vim /etc/zabbix/zabbix_agentd.conf

将其中的85行的Server改为上文Zabbix配置的IP,如127.0.0.1

将其中的126行的ServerActive配置为上文Zabbix的server IP,如127.0.0.1:10051

保存文件退出。

重启zabbix-agent

service zabbix-agent restart

自定义监控选项

参考http://www.cnblogs.com/jjzd/p/6474193.html

在/etc/zabbix/zabbix_agentd.conf中底部添加如下代码:

UserParameter=gpu0.temp, nvidia-smi -q -g 0 2>&1|grep -i "gpu current temp"|awk '{print $5}'| sed s/%//g
UserParameter=gpu1.temp, nvidia-smi -q -g 1 2>&1|grep -i "gpu current temp"|awk '{print $5}'| sed s/%//g

UserParameter=cpu0.temp, sensors coretemp-isa-0000|grep Physical|awk '{print $4}'|cut -d "." -f1
UserParameter=cpu1.temp, sensors coretemp-isa-0001|grep Physical|awk '{print $4}'|cut -d "." -f1

重启zabbix-agent service zabbix-agent restart

在server中添加监控, 键值名为 gpu0.temp

Centos 7 Zabbix Agent 客户端源码编译安装配置

Zabbix Agent 安装在远程系统上,需要通过Zabbix服务器进行监控。Zabbix Agent在客户端系统上收集资源利用和应用程序数据,并向Zabbix服务器提供这些信息。Zabbix支持Ping,ZBX、SNMP、JMX、IPMI等监控方式。

1. 安装扩展包以及依赖包

$ yum -y install epel-release
$ yum install pcre pcre-devel openssl openssl-devel -y

2. 添加Zabbix用户和组

$ groupadd zabbix
$ useradd zabbix -g zabbix -s /sbin/nologin

3. 安装Zabbix-Agent

下载地址:https://www.zabbix.com/download

$ cd /tmp
$ tar -zxvf zabbix-3.4.1.tar.gz
$ cd zabbix-3.4.1
$ ./configure --prefix=/usr/local/zabbix --enable-agent --with-mysql --with-openssl
$ make && make install

4. 创建Zabbix日志目录并生成(PSK)密钥

$ mkdir -p /usr/local/zabbix/logs/
$ chown -R zabbix.zabbix /user/local/zabbix
$ sh -c "openssl rand -hex 32 > /usr/local/zabbix/etc/zabbix_agentd.psk"
$ cat /usr/local/zabbix/etc/zabbix_agentd.psk
fd1ac849e5f787dfc04300ae997d158e6f6f0c2209d66e7d2e687da2032ecbae

5. 配置zabbix_agentd.conf

以下是配置完成后的内容:

$ egrep -v "(^#|^$)" /usr/local/zabbix/etc/zabbix_agentd.conf

EnableRemoteCommands=1 #来至zabbix服务器的远程命令是否允许被执行
PidFile=/usr/local/zabbix/zabbix_agentd.pid
LogFile=/usr/local/zabbix/logs/zabbix_agentd.log
Server=10.10.204.65 #Zabbix Server IP 地址
ServerActive=10.10.204.65 #地址同上 主动向 Zabbix Server 发送监控内容
Hostname=101020465 #本机主机名 内容要和Zabbix Server 配置的 Host Name 一致
HostMetadataItem=system.uname #用于Item获取数据
User=zabbix
UnsafeUserParameters=1 #是否启用自定义key,zabbix监控mysql、tomcat等数据时需要自定义key
#下面使用预共享密钥(PSK)来保护服务器和客户端之间的连接
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK 001
TLSPSKFile=/usr/local/zabbix/etc/zabbix_agentd.psk

注意:关于更多Agent配置参数优化,请参阅这里(https://www.zabbix.com/documentation/3.4/zh/manual/appendix/config/zabbix_agentd)。

6. 创建systemctl系统Zabbix agent 单元文件

$ vim /usr/lib/systemd/system/zabbix-agent.service

[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/usr/local/zabbix/etc/zabbix_agentd.conf"
#EnvironmentFile=/usr/local/zabbix/etc/zabbix_agentd.conf.d/
Type=forking
Restart=on-failure
#PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=/usr/local/zabbix/sbin/zabbix_agentd -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s

[Install]
WantedBy=multi-user.target

7. 启动 Zabbix Agentd 客户端服务并加入开机自启动

$ systemctl start zabbix-agent
$ systemctl enable zabbix-agent

8. 设置 Firewalld 防火墙

$ firewall-cmd --permanent --add-port=10050/tcp
$ firewall-cmd --reload

已经完成 Zabbix Agent 的安装。后期我还会写一些关于zabbix的使用以及优化。

使用Python操作Zabbix Api

众所周知,zabbix是一款强大的分布式监控系统,集各家所长于一体,得到了广大SA的认可。其强大的管理界面也极其方便,但是美中不足的是,如果同时有大批量(50台+)的服务器需要添加监控时,这时,其图形界面反而显得有些臃肿了,好在zabbix提供了一套强大的API管理接口,我们可以使用它快速地添加或删除成千上万台服务器了。

下面的流程图代表了Zabbix API 工作的典型工作流。验证(方法user.login)是获取验证ID的强制步骤。这个ID又允许我们调用API提供的任何权限允许的方法来进行操作。在之前的例子中没有提到user.logout方法,这也是一次验证ID能够重复使用的原因所在。使用user.logout方法后将会使验证ID失效,后面的操作将不能再使用此ID。

未分类

1. 首先获取所有模板及ID

#!/usr/bin/python 
#coding:utf-8 

import json 
import urllib2 
from urllib2 import URLError 
import sys,argparse

class zabbix_api: 
    def __init__(self):
        self.url = 'http://10.0.8.8/api_jsonrpc.php'
        self.header = {"Content-Type":"application/json"}

    def user_login(self): 
        data = json.dumps({ 
                           "jsonrpc": "2.0", 
                           "method": "user.login", 
                           "params": { 
                                      "user": "pengdongwen",            #修改用户名
                                      "password": "pengdongwen"         #修改密码
                                      }, 
                           "id": 0 
                           }) 

        request = urllib2.Request(self.url, data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            print "33[041m 用户认证失败,请检查 !33[0m", e.code 
        else: 
            response = json.loads(result.read()) 
            result.close() 
            #print response['result'] 
            self.authID = response['result'] 
            return self.authID 

    def template_get(self,templateName=''): 
        data = json.dumps({ 
                           "jsonrpc":"2.0", 
                           "method": "template.get", 
                           "params": { 
                                      "output": "extend", 
                                      "filter": { 
                                                 "name":templateName                                                        
                                                 } 
                                      }, 
                           "auth":self.user_login(), 
                           "id":1, 
                           })

        request = urllib2.Request(self.url, data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            print "Error as ", e 
        else: 
            response = json.loads(result.read()) 
            result.close() 
            #print response
            for template in response['result']:                
                if len(templateName)==0:
                    print "template : 33[31m%s33[0mt  id : %s" % (template['name'], template['templateid'])
                else:
                    self.templateID = response['result'][0]['templateid'] 
            print "Template Name :  33[31m%s33[0m "%templateName
                    return response['result'][0]['templateid']

if __name__ == "__main__":
    zabbix=zabbix_api()
        zabbix_api().template_get()

2. 根据模板ID获取某个模板关联的主机ID

#!/usr/bin/python 
#coding:utf-8 

import json 
import urllib2 
from urllib2 import URLError 
import sys,argparse

class zabbix_api: 
    def __init__(self):
        self.url = 'http://10.0.8.8/api_jsonrpc.php'
        self.header = {"Content-Type":"application/json"}

    def user_login(self): 
        data = json.dumps({ 
                           "jsonrpc": "2.0", 
                           "method": "user.login", 
                           "params": { 
                                      "user": "pengdongwen",            #修改用户名
                                      "password": "pengdongwen" #修改密码
                                      }, 
                           "id": 0 
                           }) 

        request = urllib2.Request(self.url, data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            print "33[041m 用户认证失败,请检查 !33[0m", e.code 
        else: 
            response = json.loads(result.read()) 
            result.close() 
            self.authID = response['result'] 
            return self.authID 

    def host_get(self): 
        data=json.dumps({
                "jsonrpc": "2.0",
                "method": "host.get",
                "params": {
                          "output": ["hostid","name"],
                              "templateids":["10105"]
                          },
                "auth": self.user_login(),
                "id": 1
                })
        request = urllib2.Request(self.url,data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            if hasattr(e, 'reason'): 
                print 'We failed to reach a server.' 
                print 'Reason: ', e.reason 
            elif hasattr(e, 'code'): 
                print 'The server could not fulfill the request.' 
                print 'Error code: ', e.code 
        else: 
            response = json.loads(result.read()) 
            #print response
                for host in response['result']:
                    print "HostID : %st HostName : %st"%(host['hostid'],host['name'])
            result.close() 
            #print "主机数量: 33[31m%s33[0m"%(len(response['result']))

if __name__ == "__main__":
        zabbix=zabbix_api()
        zabbix.host_get()

3. 根据主机ID获取主机IP地址

#!/usr/bin/python 
#coding:utf-8 

import json 
import urllib2 
from urllib2 import URLError 
import sys,argparse

class zabbix_api: 
    def __init__(self):
        self.url = 'http://10.0.8.8/api_jsonrpc.php'
        self.header = {"Content-Type":"application/json"}

    def user_login(self): 
        data = json.dumps({ 
                           "jsonrpc": "2.0", 
                           "method": "user.login", 
                           "params": { 
                                      "user": "pengdongwen",            #修改用户名
                                      "password": "pengdongwen"         #修改密码
                                      }, 
                           "id": 0 
                           }) 

        request = urllib2.Request(self.url, data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            print "33[041m 用户认证失败,请检查 !33[0m", e.code 
        else: 
            response = json.loads(result.read()) 
            result.close() 
            self.authID = response['result'] 
            return self.authID 

    def host_ip(self): 
        data=json.dumps({
                "jsonrpc": "2.0",
                "method": "hostinterface.get",
                "params": {
                          "output": ["hostid","ip"],
                              "hostids": ["10031"]
                          },
                "auth": self.user_login(),
                "id": 1
                })
        request = urllib2.Request(self.url,data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            if hasattr(e, 'reason'): 
                print 'We failed to reach a server.' 
                print 'Reason: ', e.reason 
            elif hasattr(e, 'code'): 
                print 'The server could not fulfill the request.' 
                print 'Error code: ', e.code 
        else: 
            response = json.loads(result.read()) 
            #print response
                for host in response['result']:
                    print "HostID: %st IP: %st"%(host['hostid'],host['ip'])
            result.close() 
            print "主机数量: 33[31m%s33[0m"%(len(response['result']))

if __name__ == "__main__":
        zabbix=zabbix_api()
        zabbix.host_ip()

4. 多功能API

#!/usr/bin/python 
#coding:utf-8 

import json 
import urllib2 
from urllib2 import URLError 
import sys,argparse

class zabbix_api: 
    def __init__(self):
        self.url = 'http://nh.monitor.ejuops.com/api_jsonrpc.php'
        self.header = {"Content-Type":"application/json"}

    def user_login(self): 
        data = json.dumps({ 
                           "jsonrpc": "2.0", 
                           "method": "user.login", 
                           "params": { 
                                      "user": "pengdongwen",            #修改用户名
                                      "password": "pengdongwen@eju" #修改密码
                                      }, 
                           "id": 0 
                           }) 

        request = urllib2.Request(self.url, data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            print "33[041m 用户认证失败,请检查 !33[0m", e.code 
        else: 
            response = json.loads(result.read()) 
            result.close() 
            #print response['result'] 
            self.authID = response['result'] 
            return self.authID 

    def host_get(self,hostName=''): 
        data=json.dumps({
                "jsonrpc": "2.0",
                "method": "host.get",
                "params": {
                          "output": "extend",
                          "filter":{"host":hostName} 
                          },
                "auth": self.user_login(),
                "id": 1
                })
        request = urllib2.Request(self.url,data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 


        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            if hasattr(e, 'reason'): 
                print 'We failed to reach a server.' 
                print 'Reason: ', e.reason 
            elif hasattr(e, 'code'): 
                print 'The server could not fulfill the request.' 
                print 'Error code: ', e.code 
        else: 
            response = json.loads(result.read()) 
            #print response
            result.close() 
            print "主机数量: 33[31m%s33[0m"%(len(response['result']))
            for host in response['result']:      
                    status={"0":"OK","1":"Disabled"}
            available={"0":"Unknown","1":"available","2":"Unavailable"}
            #print host
            if len(hostName)==0:
                        print "HostID : %st HostName : %st Status :33[32m%s33[0m t Available :33[31m%s33[0m"%(host['hostid'],host['name'],status[host['status']],available[host['available']])
            else:
                        print "HostID : %st HostName : %st Status :33[32m%s33[0m t Available :33[31m%s33[0m"%(host['hostid'],host['name'],status[host['status']],available[host['available']])
                return host['hostid']

    def hostgroup_get(self, hostgroupName=''): 
        data = json.dumps({ 
                           "jsonrpc":"2.0", 
                           "method":"hostgroup.get", 
                           "params":{ 
                                     "output": "extend", 
                                     "filter": { 
                                                "name": hostgroupName 
                                                } 
                                     }, 
                           "auth":self.user_login(), 
                           "id":1, 
                           }) 

        request = urllib2.Request(self.url,data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            print "Error as ", e 
        else: 
            #print result.read()
            response = json.loads(result.read()) 
            result.close() 
            #print response()
            for group in response['result']:
                if  len(hostgroupName)==0:
                    print "hostgroup:  33[31m%s33[0m tgroupid : %s" %(group['name'],group['groupid'])
            else:
                    print "hostgroup:  33[31m%s33[0mtgroupid : %s" %(group['name'],group['groupid'])
                    self.hostgroupID = group['groupid'] 
                    return group['groupid'] 


    def template_get(self,templateName=''): 
        data = json.dumps({ 
                           "jsonrpc":"2.0", 
                           "method": "template.get", 
                           "params": { 
                                      "output": "extend", 
                                      "filter": { 
                                                 "name":templateName                                                        
                                                 } 
                                      }, 
                           "auth":self.user_login(), 
                           "id":1, 
                           })

        request = urllib2.Request(self.url, data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            print "Error as ", e 
        else: 
            response = json.loads(result.read()) 
            result.close() 
            #print response
            for template in response['result']:                
                if len(templateName)==0:
                    print "template : 33[31m%s33[0mt  id : %s" % (template['name'], template['templateid'])
                else:
                    self.templateID = response['result'][0]['templateid'] 
            print "Template Name :  33[31m%s33[0m "%templateName
                    return response['result'][0]['templateid']
    def hostgroup_create(self,hostgroupName):

        if self.hostgroup_get(hostgroupName):
            print "hostgroup  33[42m%s33[0m is exist !"%hostgroupName
            sys.exit(1)
        data = json.dumps({
                          "jsonrpc": "2.0",
                          "method": "hostgroup.create",
                          "params": {
                          "name": hostgroupName
                          },
                          "auth": self.user_login(),
                          "id": 1
                          })
        request=urllib2.Request(self.url,data)

        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request)
        except URLError as e: 
            print "Error as ", e 
        else: 
            response = json.loads(result.read()) 
            result.close()
            print "33[042m 添加主机组:%s33[0m  hostgroupID : %s"%(hostgroupName,response['result']['groupids'])



    def host_create(self, hostip, hostgroupName, templateName): 
        if self.host_get(hostip):
        print "33[041m该主机已经添加!33[0m" 
        sys.exit(1)
            if self.hostgroup_get(hostgroupName):
                print "33[041m该主机组存在!33[0m"
            else:
                data = json.dumps({
                                  "jsonrpc": "2.0",
                                  "method": "hostgroup.create",
                                  "params": {
                                  "name": hostgroupName
                                  },
                                  "auth": self.user_login(),
                                  "id": 1
                })
                request=urllib2.Request(self.url,data)

                for key in self.header:
                    request.add_header(key, self.header[key])

                try:
                    result = urllib2.urlopen(request)
                except URLError as e:
                    print "Error as ", e
                else:
                    response = json.loads(result.read())
                    result.close()
                    #print "33[042m 添加主机组:%s33[0m  hostgroupID : %s"%(hostgroupName,response['result']['groupids'])

        group_list=[]
        template_list=[]
        for i in hostgroupName.split(','):
            var = {}
            var['groupid'] = self.hostgroup_get(i)
            group_list.append(var)
        for i in templateName.split(','):
            var={}
            var['templateid']=self.template_get(i)
            template_list.append(var)   

        data = json.dumps({ 
                           "jsonrpc":"2.0", 
                           "method":"host.create", 
                           "params":{ 
                                     "host": hostip, 
                                     "interfaces": [ 
                                     { 
                                     "type": 1, 
                                     "main": 1, 
                                     "useip": 1, 
                                     "ip": hostip, 
                                     "dns": "", 
                                     "port": "10050" 
                                      } 
                                     ], 
                                   "groups": group_list,
                                   "templates": template_list,
                                     }, 
                           "auth": self.user_login(), 
                           "id":1                   
        }) 
        request = urllib2.Request(self.url, data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except URLError as e: 
            print "Error as ", e 
        else: 
            response = json.loads(result.read()) 
            result.close() 
            print "添加主机 : 33[42m%s31[0m tid :33[31m%s33[0m" % (hostip, response['result']['hostids']) 



    def host_disable(self,hostip):
        data=json.dumps({
        "jsonrpc": "2.0",
        "method": "host.update",
        "params": {
        "hostid": self.host_get(hostip),
        "status": 1
        },
        "auth": self.user_login(),
        "id": 1
        })
        request = urllib2.Request(self.url,data)
            for key in self.header:
                request.add_header(key, self.header[key])       
            try: 
                result = urllib2.urlopen(request)
            except URLError as e: 
                print "Error as ", e 
            else: 
                response = json.loads(result.read()) 
                result.close()
                print '----主机现在状态------------'
            print self.host_get(hostip)


    def host_delete(self,hostid):
        hostid_list=[]
        #print type(hostid)
        for i in hostid.split(','):
            var = {}
            var['hostid'] = self.host_get(i)
            hostid_list.append(var)      
        data=json.dumps({
                "jsonrpc": "2.0",
                "method": "host.delete",
                "params": hostid_list,
                "auth": self.user_login(),
                "id": 1
                })

        request = urllib2.Request(self.url,data) 
        for key in self.header: 
            request.add_header(key, self.header[key]) 

        try: 
            result = urllib2.urlopen(request) 
        except Exception,e: 
            print  e
        else: 

            result.close() 
            print "主机 33[041m %s33[0m  已经删除 !"%hostid 


if __name__ == "__main__":
    zabbix=zabbix_api()
    parser=argparse.ArgumentParser(description='zabbix  api ',usage='%(prog)s [options]')
    parser.add_argument('-H','--host',nargs='?',dest='listhost',default='host',help='查询主机')
    parser.add_argument('-G','--group',nargs='?',dest='listgroup',default='group',help='查询主机组')
    parser.add_argument('-T','--template',nargs='?',dest='listtemp',default='template',help='查询模板信息')
    parser.add_argument('-A','--add-group',nargs=1,dest='addgroup',help='添加主机组')
    parser.add_argument('-C','--add-host',dest='addhost',nargs=3,metavar=('192.168.2.1', 'test01,test02', 'Template01,Template02'),help='添加主机,多个主机组或模板使用分号')
    parser.add_argument('-d','--disable',dest='disablehost',nargs=1,metavar=('192.168.2.1'),help='禁用主机')
    parser.add_argument('-D','--delete',dest='deletehost',nargs='+',metavar=('192.168.2.1'),help='删除主机,多个主机之间用分号')
    parser.add_argument('-v','--version', action='version', version='%(prog)s 1.0')
    if len(sys.argv)==1:
        print parser.print_help()
    else:
        args=parser.parse_args()

        if args.listhost != 'host' :
            if args.listhost:
                zabbix.host_get(args.listhost)
            else:
                zabbix.host_get()
        if args.listgroup !='group':
            if args.listgroup:
                zabbix.hostgroup_get(args.listgroup)
            else:
                zabbix.hostgroup_get()
        if args.listtemp != 'template':
            if args.listtemp:
                zabbix.template_get(args.listtemp)
            else:
                zabbix.template_get()
        if args.addgroup:
            zabbix.hostgroup_create(args.addgroup[0])
        if args.addhost:
            zabbix.host_create(args.addhost[0], args.addhost[1], args.addhost[2])
        if args.disablehost:
            zabbix.host_disable(args.disablehost)
        if args.deletehost:
            zabbix.host_delete(args.deletehost[0])

完结。。。

Zabbix部署及邮件报警(mysql主从 lamp)

一、部署说明

本次部署原本调用5台虚拟机,详情如下:

  • 192.168.8.134–NFS-ZABBIX-SERVER-WEB(用于存放LAP发布目录以及zabbix服务器端)

  • 192.168.8.135—LAP(用于安装Apache以及PHP)

  • 192.168.8.136—MYCAT(用于做mysql读写分离)

  • 192.168.8.137–MYSQL-MASTER(mysql主库)

  • 192.168.8.137–MYSQL-SLAVE(mysql从库)

注:由于笔者试图用mycat作为中间件来使mysql读写分离,但由于zabbix连接mycat一直连接错误,所以最后放弃使用mycat,zabbix直接连接mysql-master,后续在研究!

若文章中命令复制到CLI中执行出错,请手动输入一遍,命令是没问题,可能是格式问题。

二、部署拓扑

未分类

三、详细部署步骤

3.1 安装LAP环境

(Apache发布目录位于zabbix主机的/data/upload,使用nfs挂载到Apache主机,nfs搭建请查看我其他文档,这里不赘述)

[root@localhost ~]# yum install httpd httpd-devel php php-devel php-mysql –y

注意此处安装的为php5.3,由于Zabbix3.2+ PHP版本需要使用PHP5.4.0版本,请将本机PHP版本升级至5.4.0+,PHP5.3升级至PHP5.6

  • 更新yum源,如果是centos7就使用7的yum源
[root@localhost ~]#  rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm
[root@localhost ~]# rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
  • 移除之前安装的PHP
[root@localhost ~]# yum remove php* -y
  • 安装新版本PHP
[root@localhost ~]# yum install php56w.x86_64 php56w-cli.x86_64 
php56w-common.x86_64 php56w-gd.x86_64 php56w-ldap.x86_64 
php56w-mbstring.x86_64 php56w-mcrypt.x86_64 php56w-mysql.x86_64 php56w-pdo.x86_64 -y

3.2 部署mysql主从

3.2.1 Mysql主从原理

未分类

MySQL 主从复制原理剖析

Mysql主从同步其实是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,整个过程需要开启3个线程,分别是Master开启IO线程,slave开启IO线程和SQL线程。

  • 在从服务器执行slave start,从服务器上IO线程会通过授权的用户连接上master,并请求master从指定的文件和位置之后发送bin-log日志内容。

  • Master服务器接收到来自slave服务器的IO线程的请求后,master服务器上的IO线程根据slave服务器发送的指定bin-log日志之后的内容,然后返回给slave端的IO线程。(返回的信息中除了bin-log日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。)

  • Slave的IO线程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master.info文件中,以便在下一次读取的时候能够清楚的告诉Master”我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”;

  • Slave的Sql线程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。

3.2.2安装mysql

  • 安装mysql环境,master和slave都执行
[root@localhost ~]# yum install mysql-server mysql-devel mysql-libs –y

启动mysql数据库,此时数据会自动初始化

[root@localhost ~]# service mysqld restart

master修改my.cnf文件

[root@localhost ~]# vim /etc/my.cnf

在文件[mysqld]中添加如下内容:

log-bin=mysql-bin 开启binlog功能

server-id = 137 指定服务器的id,通常id指定为ip地址的最后一位

若需要指定数据目录请修改datadir=/var/lib/mysql,创建目录后需要给mysql授权,最好是把用户和组指定给mysql,本实验不指定。

未分类

  • slave修改my.cnf文件

未分类

  • 在master上面给slave授权
mysql> grant all on *.* to slave@"%" identified by "123456";

其中all代表所有权限

%代表除本机外所有ip的主机均可连接,若本机连接需要把%改为localhost

mysql> flush privileges;

刷新权限

  • 重启master及slave

未分类

  • 查看mysql-bin及Position

在master上执行

mysql> show master status;

未分类

记录file及position

  • 在slave服务器指定master IP和同步的mysql-bin及pos点
mysql> change master to master_host='192.168.8.137',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;

注意以上红色字体,必须按照实际填写

未分类

  • 启动slave
mysql> slave start;

未分类

在slave上查看同步状态

mysql> show slave statusG

如果如下两行为yes,代表主从同步成功。

未分类

3.3 安装zabbix server环境及web发布目录

  • 下载zabbix源码包,本实验使用3.2.6
[root@localhost tmp]# wget https://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/3.2.6/zabbix-3.2.6.tar.gz
  • 安装依赖包
[root@localhost tmp]# yum -y install curl curl-devel net-snmp net-snmp-devel perl-DBI
  • 创建zabbix用户信息
[root@localhost tmp]# groupadd zabbix
[root@localhost tmp]# useradd -g zabbix zabbix
[root@localhost tmp]# usermod -s /sbin/nologin zabbix
  • 解压
[root@localhost tmp]# tar -zxvf zabbix-3.2.6.tar.gz

进入到zabbix目录

[root@localhost tmp]# cd zabbix-3.2.6
  • 把zabbix的SQL包导入mysql-master

由于zabbix与mysql是分开部署,故在zabbix服务器上安装mysql客户端并远程登陆到mysql-master上导入sql包。

[root@localhost tmp]# yum install mysql –y

安装mysql客户端

[root@localhost]# mysql -h 192.168.8.137 -uslave -p123456

此处使用之前创建的slave账户,若为安全着想可以单独创建管理账户,由于我之前slave账户给的all权限,故此次直接使用,后面不加端口默认使用3306

未分类

mysql> create database zabbix charset=utf8;

创建zabbix数据库并指定编码类型为utf8

未分类

未分类

mysql> grant all on zabbix.* to zabbix@"%" identified by '123456';

创建zabbix账户给zabbix使用,但注意如下报错:

未分类

此处是因为我在zabbix主机使用slave登陆的,所以现在需要直接到mysql-master上面使用以上命令来授权并刷新权限。

未分类

现在数据库与授权都做好了,可以开始导入sql包了

找到sql包

未分类

如上图所示,zabbix自带的有多种数据库包,当前我们直接使用mysql的即可;

未分类

进入到mysql程序中;

mysql> use zabbix;

进入zabbix库

mysql> source /tmp/zabbix-3.2.6/database/mysql/schema.sql

先导入schema包

mysql> source /tmp/zabbix-3.2.6/database/mysql/images.sql

再导入images包

mysql> source /tmp/zabbix-3.2.6/database/mysql/data.sql

最后导入data包

至此zabbix使用的sql包完全导入。

  • 开始编译安装zabbix(源码安装三步骤)
[root@localhost zabbix-3.2.6]# ./configure --prefix=/usr/local/zabbix/ --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl

注:全新服务器安装会报如下错误,是因为没有安装gcc

未分类

[root@localhost zabbix-3.2.6]# yum install gcc –y

安装GCC后再次编译还会遇到一个问题如下图:

未分类

提示找不到mysql library,如果是数据库在本地不会报这个错误。

解决办法有两种:

  • 修改—with-mysql为–with-mysql=/usr/local/mysql55

  • 安装mysql-devel:yum install mysql-devel –y

编译完成会提示如下图:

未分类

但还是建议先执行make

[root@localhost zabbix-3.2.6]# make –j8 && make install –j8

软连接服务程序到/usr/local/sbin/下

[root@localhost /]# ln -s /usr/local/zabbix/sbin/zabbix_* /usr/local/sbin/

进入到zabbix主配置文件目录

未分类

  • 修改主配置文件zabbix_server.conf
[root@localhost etc]# cp zabbix_server.conf zabbix_server.conf.bak

先备份然后修改

未分类

把主配置文件内容修改为如下内容:

LogFile=/tmp/zabbix_server.log log  #存放路径
DBHost=192.168.8.137                      #数据库master地址
DBName=zabbix                               #数据库名字
DBUser=zabbix                                  #数据库用户名
DBPassword=123456                          #数据库密码

未分类

  • cp zabbix_server启动脚本至/etc/init.d/目录并授权
[root@localhost zabbix-3.2.6]# cp misc/init.d/tru64/zabbix_server /etc/init.d/zabbix_server

未分类

注:若上述启动文件不可用,可以cp如下位置文件

cp /zabbix-2.2.6/misc/init.d/fedora/core/zabbix_server /etc/init.d/

讲zabbix web代码拷贝到Apache发布目录

cp -a /root/zabbix-3.2.6/frontends/php/* /data/

修改PHP时区

[root@localhost ~]# sed -i '/date.timezone/i date.timezone = PRC' /etc/php.ini

以上命令在LAP主机上执行

  • 启动zabbix server
[root@localhost data]# /etc/init.d/zabbix_server restart

查看zabbix启动状态

root@localhost data]# ps -ef | grep zabbix

未分类

[root@localhost data]# netstat -anlp | grep zabbix

访问Apache主页

未分类

至此整体环境已经搭建完成。

3.4 安装配置zabbix web

  • 解决PHP参数与依赖报错

点击下一步会遇到如下报错,这是由于PHP里的参数与依赖不符合zabbix要求

未分类

需要在LAP主机上安装并修改PHP主配置文件,若不安装zabbix会确实部分功能

[root@localhost html]# yum install php56w-mbstring php56w-bcmath php56w-gd php56w-xml –y
[root@localhost html]# yum install gd gd-devel -y

以上是安装依赖

[root@localhost html]# sed -i '/post_max_size/s/8/16/g;/max_execution_time/s/30/300/g;/max_input_time/s/60/300/g;s/;date.timezone.*/date.timezone = PRC/g;s/;always_populate_raw_post_data/always_populate_raw_post_data/g' /etc/php.ini

以上是利用sed修改PHP主配置文件,sed用法不赘述

安装修改完成后,刷新页面

未分类

  • 填写数据库信息

未分类

  • 填写监控信息

未分类

若zabbix与Apache不在一个服务器 host可以填写zabbix服务器地址,此处暂不填写,后面会报错,后面处理

  • 最后核对信息

未分类

  • 安装完成

未分类

注意此处由于我实现给发布目录赋予了写入权限,所以不会报如下图错误:

未分类

遇此错误是因为该路径没有写入权限,可以下载图中提示的文件,然后上传到相应目录即可。

  • 点击完成,登入系统,默认用户名为admin,密码为zabbix

  • 解决Zabbix server is not running

进入系统遇到如下错误

未分类

这是由于zabbix与web 发布软件Apache不在一个服务器导致,需要求该发布目录中一下文件

未分类

修改$ZBX_SERVER后跟zabbix服务器ip

未分类

重启Apache、zabbix服务端

未分类

至此全部部署完成。

3.5 zabbix邮件报警

  • 设置发件信息

进入管理à报警媒介类型àEmail

未分类

设置发件服务器信息,最后点击更新;

未分类

选择接受人信息,这里选择admin就可以;

未分类

选择报警媒介,点击添加;

未分类

填写收件人邮箱,也可以根据需求设置时间和报警级别,通常全选,点击添加;(可添加多人)

未分类

点击更新即可;

未分类

点击配置à动作选择事件源”触发器”,可以新建也可以使用默认的;

未分类

选择动作,添加触发条件,这里使用”触发器示警度”+”大于等于”+”警告”,代表警告级别以上就触发报警,点击添加;

未分类

点击操作,修改默认操作步骤时间为60,再点击新的;

未分类

点击发送到用户的添加,然后会弹出右边对话框,选择admin(若收件人不在admin里面则选择自己定义的);

未分类

此页可不修改,也可根据自己需求修改,最后点击更新;

未分类

至此,邮件告警配置完成,以下为测试告警邮件。

未分类

未分类