运维监控小能手之zabbix
1.zabbix的简介
zabbix是一个高度集成的监控解决方案;可以实现企业级的开源分布式监控;zabbix通过C/S模式采集监控数据;zabbix通过B/S模式实现web管理。zabbix监控主要有监控服务器和被监控主机组成,监控服务器通过SNMP或Agent采集数据,然后将采集到的数据写入mysql,oracle等数据库中,最后通过LAMP实现web前端的管理;监控主机只需要安装Agent。
2.搭建LAMP平台
2.1安装nginx
安装说明:nginx主要作用是为了zabbix实现web前端的管理,需要提前ss -pltanu | grep 80 检查80端口是否被占用,如果被占用需要修改为其他端口。
# yum -y install nginx-1.16.1-1.el7.ngx.x86_64.rpm
# cd /etc/nginx/conf.d/
# vim zabbix.conf
server {
listen 8081;
server_tokens off;
root /data/www/zabbix;
index index.php index.html index.htm;
location / {
if ( -f $request_filename) {
break;
}
if ( !-e $request_filename) {
rewrite ^(.*)$ /index.php/$1 last;
break;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 1h;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
location ~ .+\.php($|/) {
set $script $uri;
set $path_info "";
if ($uri ~ "^(.+\.php)(/.+)") {
set $script $1;
set $path_info $2;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php?IF_REWRITE=1;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $script;
include fastcgi_params;
}
location ~ /\. {
deny all;
}
}
# systemctl start nginx
# systemctl enable nginx
2.2安装mysql
安装说明:mysql主要作用用于存放zabbix的监控数据,mysql相关软件包需要自行网上下载,可以通过这个网址下载: http://ftp.ntu.edu.tw/MySQL/Downloads/;centos/rhel的系统有自带mariadb,需要检查一下是否有安装,如果有安装但想用mysql,那么可以抱mariadb卸载。
# ll Mysql-5.6.47/
MySQL-client-5.6.47-1.el7.x86_64.rpm
MySQL-devel-5.6.47-1.el7.x86_64.rpm
MySQL-embedded-5.6.47-1.el7.x86_64.rpm
MySQL-server-5.6.47-1.el7.x86_64.rpm
MySQL-shared-5.6.47-1.el7.x86_64.rpm
MySQL-shared-compat-5.6.47-1.el7.x86_64.rpm
MySQL-test-5.6.47-1.el7.x86_64.rpm
# yum -y install MySQL-*.rpm
# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql/
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
#skip-grant-tables
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
sql_mode=ALLOW_INVALID_DATES,ANSI,NO_AUTO_CREATE_USER
# systemctl start mysql
# ss -pltanu | grep :3306
# grep password /var/log/mysqld.log #初始化获取登录密码
2019-04-27T12:53:27.754281Z 1 [Note] A temporary password is generated for root@localhost: 3ApSddNyu0%j
# mysql -uroot -p
mysql> alter user user() identified by '***********';
#修改root密码,不然无法进行任何数据库操作
mysql> create database zabbix character set utf8 collate utf8_bin;
#创建存放zabbix的数据库,支持中文字符集
mysql> create user zabbix@'%' identified by '*********';
#创建可以访问数据库的账户和密码
mysql> GRANT all ON zabbix.* TO 'zabbix'@'%' IDENTIFIED BY '**********';
#给zabbix授权,让其有访问zabbix数据库的权限
2.3安装php
安装说明:php的作用是zabbix网页文件是php写的,需要php解释器,php-fpm这个软件包需要自行下载,下载网址:https://mirrors.aliyun.com/centos/7.6.1810/os/x86_64/Packages/,
但是要注意系统版本和php-fpm的版本。
# yum -y install gcc automake autoconf libtool make gcc-c++ glibc libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssl-devel pcre pcre-devel libmcrypt libmcrypt-devel libcurl libcurl-devel gmp gmp-devel readline readline-devel
# tar -xf php-7.1.12.tar.gz
# cd php-7.1.12
# ./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --with-mcrypt=/usr/local/libmcrypt --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-gd --with-iconv --with-zlib --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --enable-session --with-curl --with-jpeg-dir --with-freetype-dir --enable-opcache
# make && make install
# cp php.ini-production /usr/local/php7/etc/php.ini
# cp sapi/fpm/init.d.php-fpm /etc/init.d/php7-fpm
# cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
# cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
# vim /usr/local/php7/etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000 //PHP端口号
pm.max_children = 32 //最大进程数量
pm.start_servers = 15 //最小进程数量
pm.min_spare_servers = 5 //最少需要几个空闲着的进程
pm.max_spare_servers = 32 //最多允许几个进程处于空闲状态
# vim /usr/local/php7/etc/php.ini
date.timezone = Asia/Shanghai #设置时区
max_execution_time = 300 #最大执行时间秒
post_max_size = 32M #POST数据量最大容量
max_input_time = 300 #服务器接收数据的时间限制
memory_limit = 128M #内存容量限制
mbstring.func_overload = 0
# chmod u+x /etc/init.d/php7-fpm
# /etc/init.d/php7-fpm start
测试php:
[root@zabbix ~]# vim /data/www/test/test.php
<?php
phpinfo();
?>
# systemctl restart nginx
打开浏览器,在地址栏输入ip回车进行测试,正确的测试结果如下图:
3.搭建zabbix监控平台
3.1安装zabbix
# yum install -y net-snmp-devel curl-devel libevent-devel
# tar -xf zabbix-4.0.19.tar.gz
# cd zabbix-4.0.19
# ./configure --enable-server --enable-proxy --enable-agent --with-mysql=/usr/bin/mysql_config --with-net-snmp --with-libcurl --prefix=/usr/local/zabbix
// --enable-server安装部署zabbix服务器端软件
// --enable-agent安装部署zabbix被监控端软件
// --enable-proxy安装部署zabbix代理相关软件
// --with-mysql配置mysql_config路径
// --with-net-snmp允许zabbix通过 snmp协议监控其他设备
//--with-libcurl安装相关curl库文件,这样zabbix就可以通过curl连接http等服务
# make && make install
# cd database/mysql
# mysql -uzabbix -p zabbix < schema.sql
# mysql -uzabbix -p zabbix < images.sql
# mysql -uzabbix -p zabbix < data.sql
//刚刚创建是空数据库,zabbix源码包目录下,有提前准备好的数据
//使用my sql导入这些数据即可(注意导入顺序)
# cd ../../frontends/php/
# cp -r * /data/www/zabbix/
# chmod -R 777 /data/www/zabbix/*
# vim /usr/local/zabbix/etc/zabbix_server.conf
ListenPort=10051
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=数据库密码
LogFile=/tmp/zabbix_server.log
DBSocket=/var/lib/mysql/mysql.sock
# useradd -s /sbin/nologin zabbix
# /usr/local/zabbix/sbin/zabbix_server -c
/usr/local/zabbix/etc/zabbix_server.conf #zabbix_server启动
# /usr/local/zabbix/sbin/zabbix_agentd -c
/usr/local/zabbix/etc/zabbix_agentd.conf #zabbix_agentd启动
3.2 zabbix界面管理
打开浏览器,在地址栏输入:ip/Zabbix-----à回车,单击‘next step’
注意查看是否全部为ok,单击‘next step’
注意填写:根据上面数据库的用户名,密码,库名,端口号进行填写,一旦一项错误,无法完成设置,设置完成,单击‘next step’
以下可填可不填,单击‘next step’
再一次确认刚刚填写的数据库信息是否正确,单击‘next step’
看到以下情景,单击‘finish’,完成所有设置。
输入用户名Admin和密码zabbix登录zabbix界面。
设置中文环境:Administrator-User-Language-(Chinese(zh_cn)),效果如下:
将界面改为中文;当改为中文后,在查看图表时会遇到乱码问题,这是由于字体格式不一致导致。zabbix默认使用的是“graphfont.ttf”,该字体对中文支持度不好,因此下方数据会有乱码。
在本地的C:\Windows\Fonts下选择自己喜欢的字体,,此处选择黑体(我只测试过宋体,楷体,黑体,幼圆其他中文字体应该都支持)
通过xftp(或其他上传工具)将黑体字体上传至zabbix的fonts目录(zabbix的web安装路径下的fonts)
# cd /data/www/zabbix/assets/fonts/
# chmod 777 simhei.ttf
# cd /data/www/zabbix/include/
# vim defines.inc.php
……
define('ZBX_GRAPH_FONT_NAME', 'simhei'); // font file name
…….
define('ZBX_FONT_NAME', 'simhei');
……
# systemctl restart nginx
zabbix触发器到了要发送通知的情况下,需要一个中间介质来接收并传递它的消息给我们运维人员,通常用脚本发送邮件,发送微信或者短信来达到报警。这个脚本实际上就是一个媒介,也就是我们通常说的报警媒介。
微信现在离不开我们的生活,所以选择微信就是一个不错的媒介工具。使用微信作为报警媒介,首先我们需要注册一个微信公众号用来接收告警信息。申请微信公众号网址:https://qy.weixin.qq.com/,登录微信网址,根据提示申请微信公众号。登录网址,进入以下界面,单击“立即注册”。
如下图,填写企业名称,行业类型,人员规模,管理员姓名,管理员手机号,短信验证码,还有需要扫码管理员微信,也就是你申请人的微信或者公司提供微信。
企业微信号注册完成进入企业微信首页并且进入企业微信,应用与小程序--->创建应用,如下图
在应用与小程序中创建一个应用用于zabbix监控告警,如下图
创建成功后,如下图所示,在创建脚本时,以下参数需要被调用。
4.1.2 zabbix服务器端配置
# grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/local/zabbix/alertscripts
#在配置文件查找报警脚本路径的存放位置
安装python需要调用的simplejson
#wget https://pypi.python.org/packages/f0/07/26b519e6ebb03c2a74989f7571e6ae6b82e9d7d81b8de6fcdbfc643c7b58/simplejson-3.8.2.tar.gz
# tar zxvf simplejson-3.8.2.tar.gz && cd simplejson-3.8.2
# python setup.py build
# python setup.py install
在我们书写脚本时,我们需要得到以下信息,方便脚本调用微信,成员账号、组织部门ID、应用ID、CorpID和Secret这几个测试,按照4.1.1最后几张均可查到相应的参数。
# vim /usr/local/zabbix/alertscripts /weixin.py
#!/usr/bin/python
#_*_coding:utf-8 _*_
import urllib,urllib2
import json
import sys
import simplejson
reload(sys)
sys.setdefaultencoding('utf-8')
def gettoken(corpid,corpsecret):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + corpsecret
print gettoken_url
try:
token_file = urllib2.urlopen(gettoken_url)
except urllib2.HTTPError as e:
print e.code
print e.read().decode("utf8")
sys.exit()
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
def senddata(access_token,user,subject,content):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
send_values = {
"touser":"Admin",
#企业号中的用户帐号,在zabbix用户Media中配置,如果配置不正常,将按部门发送。
"toparty":"2", #企业号中的部门id。
"msgtype":"text", #消息类型。
"agentid":"********", #企业号中的应用id。
"text":{
"content":subject + '\n' + content
},
"safe":"0"
}
# send_data = json.dumps(send_values, ensure_ascii=False)
send_data = simplejson.dumps(send_values, ensure_ascii=False).encode('utf-8')
send_request = urllib2.Request(send_url, send_data)
response = json.loads(urllib2.urlopen(send_request).read())
print str(response)
if __name__ == '__main__':
user = str(sys.argv[1]) #zabbix传过来的第一个参数
subject = str(sys.argv[2]) #zabbix传过来的第二个参数
content = str(sys.argv[3]) #zabbix传过来的第三个参数
corpid = '***************' #CorpID是企业号的标识
corpsecret='****************************************' #corpsecretSecret是管理组凭证密钥
accesstoken = gettoken(corpid,corpsecret)
senddata(accesstoken,user,subject,content)
[root@zabbix ~]# chown zabbix.zabbix /usr/local/zabbix/alertscripts /weixin.py
[root@zabbix ~]# chmod 755 /usr/local/zabbix/alertscripts /weixin.py
[root@zabbix alertscripts]# ./weixin.py user 报警测试 error
添加微信插件,接收告警就不用到企业微信上查看,如下图:
#测试微信告警脚本是否成功,成功则会收到如下图
4.1.3 zabbix的web界面设置
Zabbix_server的web界面,“管理”---->“报警媒介类型”---->“创建媒介类型”,如下图。
在报警媒介类型中,填写名称:weixin,类型:脚本,脚本名称:weixin.py(刚刚创建的脚本名称),注意下面要填写的脚本参数:
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
单击“更新”,如下图。
“管理”--->“用户”---->“Admin”,如下图
单击“Admin”进入下图,选择“报警媒介”---->“添加”,弹出“报警媒介”,类型:weixin,收件人:1000002,当启用时:1-7,00:00-24:00,单击“添加”。
如下图,单击“更新”。
“配置”---->“动作”----->“创建动作”,如下图
单击“创建动作”进入如下图菜单,在“动作”中,名称:weixin,新的触发条件:时间期间。
切换至“操作”,默认操作步骤持续时间 60,
默认标题:{TRIGGER.STATUS}:{TRIGGER.NAME}
消息内容:
告警主机:{HOST.NAME}
告警IP:{HOST.IP}
告警时间:{EVENT.DATE}-{EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}:{ITEM.VALUE}
事件ID:{EVENT.ID}
步骤:1-3
步骤持续时间:60
发送到用户:Admin (Zabbix Administrator)
仅送到:weixin
单击“添加”。
切换至“恢复操作”,
默认标题:{TRIGGER.STATUS}:{TRIGGER.NAME}
消息内容:
告警主机:{HOST.NAME}
告警IP:{HOST.IP}
告警时间:{EVENT.DATE}-{EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}:{ITEM.VALUE}
事件ID:{EVENT.ID}
发送到用户:Admin (Zabbix Administrator)
仅送到:weixin
单击“添加”。
切换至“Update operations”,
默认标题:{TRIGGER.STATUS}:{TRIGGER.NAME}
消息内容:
告警主机:{HOST.NAME}
告警IP:{HOST.IP}
告警时间:{EVENT.DATE}-{EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}:{ITEM.VALUE}
事件ID:{EVENT.ID}
发送到用户:Admin (Zabbix Administrator)
仅送到:weixin
单击“添加”。
再次单击“添加”即可完成,再进行zabbix报警测试,任意找一台服务器调整阈值来测试微信是否可以收到zabbix告警,如成功如下图。
# rpm -Uvh
https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm
# yum clean all
# yum repolist
# yum install zabbix-agent
# vim /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=127.0.0.1,172.16.32.6
ServerActive=127.0.0.1,172.16.32.6
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agentd.d/*.conf
UnsafeUserParameters=1
# systemctl restart zabbix-agent