内容纲要
1、zabbix 架构原理,及常用组件及用途分析
1.1、zabbix架构图
1.2、常用组件及用途
架构 Zabbix 由几个主要的功能组件组成,其职责如下所示。 Server Zabbix server 是 Zabbix agent 向其报告可用性、系统完整性信息和统计信息的核心组件。是存储所有配置信息、统计信息和操作信息的核心存储库。 数据库 所有配置信息以及 Zabbix 收集到的数据都被存储在数据库中。 Web 界面 为了从任何地方和任何平台轻松访问 Zabbix ,我们提供了基于 web 的界面。该界面是 Zabbix server 的一部分,通常(但不一定)和 Zabbix server 运行在同一台物理机器上。 Proxy Zabbix proxy 可以替 Zabbix server 收集性能和可用性数据。Zabbix proxy 是 Zabbix 环境部署的可选部分;然而,它对于单个 Zabbix server 负载的分担是非常有益的。 Agent Zabbix agents 部署在被监控目标上,用于主动监控本地资源和应用程序,并将收集的数据发送给 Zabbix server。
2、监控LNMP架构,并配置报警升级,0-5分钟不报警执行重启应用,5-30分钟通知运维,30-60分钟短信通过总监。
环境: zabbix_server:10.0.0.129 zabbix_agent:10.0.0.135 1)安装server和关联agent就不多讲了,主要是准备agent的LNMP环境, nginx一键编译安装,之前的文章里有脚本。最后的配置文件代理PHP页面即可 cat /apps/nginx/conf/nginx.conf server { listen 80; server_name localhost; root /data/nginx/wordpress; index index.php; server_tokens off; location / { client_max_body_size 2000M; #client_body_buffer_size 1024k; #client_body_temp_path /apps/nginx/client_body_temp/ 1 2 2; root /data/nginx/wordpress; #指定数据目录 index index.php index.html index.htm; #指定默认主页 try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { root /data/nginx/wordpress; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ ^/(ping|pm_status)$ { #实现状态页 include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name; 此配置也可以 } 2)安装php环境,这里有坑,准备的干净主机想编译安装php74,花了几个小时,一直有依赖错误,解决不了。。。干脆yum安装,实现功能即可。 #安装源 yum install epel-release yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm #安装php和依赖 yum install php74-php-gd php74-php-pdo php74-php-mbstring php74-php-cli php74-php-fpm php74-php-mysqlnd #修改配置文件 grep '^[a-Z]' /etc/php-fpm.d/www.conf.rpmsave listen = 127.0.0.1:9000 user = apache group = apache pm = dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 slowlog = /var/log/php-fpm/www-slow.log php_admin_value[error_log] = /var/log/php-fpm/www-error.log php_admin_flag[log_errors] = on php_value[session.save_handler] = files php_value[session.save_path] = /var/lib/php/session #启动服务 systemctl start php74-php-fpm 3)创建数据库授权即可,使用mariadb和msyql都可以 create database wordpress; #创建数据库 create user wordpress@'10.0.0.%' identified by '123456'; #创建用户和密码 grant all on wordpress.* to wordpress@'10.0.0.%'; #授权从10.0.0.%段访问wordpress都可以 flush privileges; #刷新权限 4)结果 5)这里先对端口做监控,查看服务是否正常 6)要想远程执行命令必须在zabbix_agent开启执行命令的配置,不然无法执行。 AllowKey=system.run[*] #zabbix5.0版本以上,代替EnableRemoteCommands,agent2默认没有此命令手工加入 #EnableRemoteCommands=1 #开启远程执行命令,此指令在zabbix5.0版本以上淘汰 AllowRoot=1 #开启此项,直接使用root进行远程管理,而无须对zabbix用户授权sudo权限 UnsafeUserParameters=1 #允许远程执行命令的时候使用不安全的参数(特殊字符串,如: \ ' * ? [] {} ~ $ ! & ; ( ) < > 等 ) 7)创建80端口的触发器,3306端口克隆即可 8)创建动作 9)最终结果 ###动作日志
3、zabbix api批量添加多个主机,要求一些不走代理,一些支持走代理
环境: zabbix_server:10.0.0.129 zabbix_proxy:10.0.0.130 zabbix_agent-active:10.0.0.128 zabbix_agent-passive:10.0.0.138 1)要想通过API批量添加主机,前提是主机上已经安装了zabbix_agent,并且已经对配置文件进行修改,安装这里就不讲了,官网文档都有。直接上干货 2)代理agent的配置文件: [root@rocky5 ~]#grep '^[a-Z]' /etc/zabbix/zabbix_agent2.conf PidFile=/var/run/zabbix/zabbix_agent2.pid LogFile=/var/log/zabbix/zabbix_agent2.log LogFileSize=0 Server=10.0.0.130 ServerActive=10.0.0.130 Hostname=10.0.0.128 Include=/etc/zabbix/zabbix_agent2.d/*.conf ControlSocket=/tmp/agent.sock 3)无代理的agent配置文件 [root@rocky ~]#grep '^[a-Z]' /etc/zabbix/zabbix_agentd.conf PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=10.0.0.129 ListenPort=10050 ServerActive=127.0.0.1 Hostname=10.0.0.138 Include=/etc/zabbix/zabbix_agentd.d/*.conf 4)准备获取zabbix_server的token脚本 cat /data/sh/zabbix_api-token.sh #!/bin/bash ZABBIX_SERVER=10.0.0.129 curl -s -XPOST -H "Content-Type: application/json-rpc" -d ' { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1, "auth": null }' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php 5)准备通过api添加主机脚本 cat zabbix-api_addhost.sh #!/bin/bash ZABBIX_SERVER=10.0.0.129 TOKEN=$(./zabbix-api-token.sh| awk -F'"' '{print $8}') ACTIVE_IP=10.0.0.128 PASSIVE_IP=10.0.0.138 active () { for HOST in $ACTIVE_IP;do curl -s -XPOST -H "Content-Type: application/json-rpc" -d ' { "jsonrpc": "2.0", "method": "host.create", "params": { "host": "'$HOST'", "name": "'web-$HOST'", "proxy_hostid": "10442", "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": "'$HOST'", "dns": "", "port": "10050" } ], "groups": [ { "groupid": "2" } ], "templates": [ { "templateid": "10001" } ] }, "id": 1, "auth": "'$TOKEN'" }' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php done } passive () { for HOST in $PASSIVE_IP;do curl -s -XPOST -H "Content-Type: application/json-rpc" -d ' { "jsonrpc": "2.0", "method": "host.create", "params": { "host": "'$HOST'", "name": "'db-$HOST'", "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": "'$HOST'", "dns": "", "port": "10050" } ], "groups": [ { "groupid": "2" } ], "templates": [ { "templateid": "10001" } ] }, "id": 1, "auth": "'$TOKEN'" }' http://${ZABBIX_SERVER}/zabbix/api_jsonrpc.php done } active passive 6)当前主机只要一个server和proxy两台 7)执行脚本查看结果 sh /data/sh/zabbix-api_addhost.sh ###这里看到两台主机一台走代理,一台没走代理。因为是刚加上可用性还没返回数据 ###等待一段时间后发现已经上线
4、总结zabbix自定义监控项,基于自定义监控项监控nginx
4.1 自定义监控项
监控项键值的格式(包括键值的参数)必须遵循语法规则。
UserParameter=<key>,<shell command>
要构建有效的监控项键值,首先要指定键值的名称,然后选择是否具有参数
键值名称
Key(键值)名称本身具有字符范围的限制,允许的字符是:0-9a-zA-Z_-.
客户端可以自定义监控项,在Zabbix Agent 配置文件添加内容,格式如下
#cat /etc/zabbix/zabbix_agentd.conf
#cat /etc/zabbix/zabbix_agent2.conf
UserParameter=<key>,<shell command>
Include=/etc/zabbix/zabbix_agentd.d/*.conf
例:获取根分区的磁盘利用率
UserParameter=root_filesystem_use,df|awk -F' +|%' '$7 == "/" {print $5 }'
4.2 自定义监控项监控nginx
####先在agent上安装nginx,yum -y install nginx
####设置监控页面vim /etc/nginx/nginx.conf
location /nginx_status {
stub_status;
access_log off;
allow 10.0.0.129; #允许zabbix_server访问
allow 127.0.0.1; #允许本机访问
deny all; #拒绝所有
}
####nginx -t 检查语法
####nginx -s reload
1)在agent上编写脚本
cat /etc/zabbix/zabbix_agent.d/nginx.sh
#!/bin/bash
nginx_status_fun(){ #函数内容
NGINX_PORT=$1 #端口,函数的第一个参数是脚本的第二个参数,即脚本的第二个参数是段端口号
NGINX_COMMAND=$2 #命令,函数的第二个参数是脚本的第三个参数,即脚本的第三个参数是命令
nginx_active(){ #获取nginx_active数量,以下相同,这是开启了nginx状态但是只能从本机看到
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
nginx_reading(){ #获取nginx_reading状态的数量
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
nginx_writing(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
nginx_waiting(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
nginx_accepts(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
nginx_handled(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
nginx_requests(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
case $NGINX_COMMAND in
active)
nginx_active;
;;
reading)
nginx_reading;
;;
writing)
nginx_writing;
;;
waiting)
nginx_waiting;
;;
accepts)
nginx_accepts;
;;
handled)
nginx_handled;
;;
requests)
nginx_requests;
esac
}
main(){ #主函数内容
case $1 in #分支结构,用于判断用户的输入而进行响应的操作
nginx_status) #当输入nginx_status就调用nginx_status_fun,并传递第二和第三个参数
nginx_status_fun $2 $3;
;;
*) #其他的输入打印帮助信息
echo $"Usage: $0 {nginx_status key}"
esac #分支结束符
}
main $1 $2 $3
2)cat /etc/zabbix/zabbix_agent.conf
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agent2.d/nginx.sh "$1" "$2" "$3"
3)重启agent
systemctl restart zabbix_agent.service
4)在zabbix_server上测试是否拿到数据
zabbix_get -s 10.0.0.128 -k nginx.status["nginx_statux",80,"active"]
5)在zabbix_server的web页面上添加模板和监控项
####创建监控项,这里创建一个,其他的克隆即可
####创建监控端口的监控项
####创建触发器
####创建图形
####模板创建完成
####主机内关联模板
####查看最新数据及图形
####nginx自定义监控创建完成
5、基于zabbix实现邮件或微信告警
1)使用163邮箱获取授权码 2)管理-->报警媒介类型-->创建报警媒介类型 3)添加报警信息模板用于发送信息 #可以修改两个消息模板 # 问题 主题: 告警: {EVENT.NAME} 告警主机:{HOST.NAME1} 告警服务: {ITEM.NAME1} 告警Key1: {ITEM.KEY1}:{ITEM.VALUE1} 告警Key2: {ITEM.KEY2}:{ITEM.VALUE2} 严重级别: {TRIGGER.SEVERITY} # 恢复 Problem Recovery 主题: 恢复: {EVENT.DURATION}: {EVENT.NAME} 恢复主机:{HOST.NAME1} 恢复服务: {ITEM.NAME1} 恢复Key1:{ITEM.KEY1}:{ITEM.VALUE1} 恢复Key2: {ITEM.KEY2}:{ITEM.VALUE2} 4)添加完后测试是否可收到邮件 #收到邮件 5)配置用户的收件邮箱和使用的动作 #默认动作 6)停止nginx和启动nginx,查看是否发送故障和恢复邮件。上面自定义监控项里已设置80端口触发器 systemctl stop nginx systemctl start nginx ###邮箱收到的邮件列表
6、总结zabbix自动发现监控
之前都是手动一台一台主机的添加到 Zabbix 中进行监控,很是繁琐,可以利用自动发现功能,自动添加被监控的主机,当众多的服务器都已经安装了agent或者snmp后,利用自动发现功能,Zabbix server 可以自动扫描预先配置好的ip段,自动添加主机,自动关联模板,自动加到主机组里等等。 网络发现功能更快速的部署zabbix、简化zabbix管理、并且在经常变动的环境里面也不需要花太多的精力,毕竟网络发现也能随时发现变化。 当然网络发现也不是万能的,虽然网络发现能干很多事情,但是它无法发现网络拓扑的变化。由于自动发现效率比较低,严重消耗Zabbix Server资源和网络带宽,大规模环境中较少使用自动发现虽然能自动完成发现并添加主机,但仍然存在一些问题 1)发现时间长,效率较低 2)扫描过程中容易漏扫 3)当IP地址不固定难以实现 4)无法实现不同类型主机关联不同模板