第十周

内容纲要

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)无法实现不同类型主机关联不同模板

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注