Zabbix:自动发现功能讲解,包括网络发现、自动注册、低级别自动发现以及案例分享。

视频讲解:

Zabbix自动发现-第2集-利用低级别自动发现,在被控主机上自动添加监控、触发器并形成告警

Zabbix 自动发现

自动发现的种类
在这里插入图片描述
网络发现和自动注册的区别
在这里插入图片描述
低级别自动发现的工作原理
在这里插入图片描述

网络发现

概述

  • 在大规模集群环境中,加快Zabbix的部署速度和简化管理。比如自动识别主机并对其批量(添加/删除)主机、批量(关联/取关)模板、批量(关联/取关)主机群组等操作。
  • Zabbix server或Zabbix proxy主动获取数据,支持的检查类型:SSH、LDAP、SMTP、FTP、HTTP、HTTPS、POP、NNTP、IMAP、TCP、Telnet、Zabbix agent、SNMPv1 agent、SNMPv2 agent、SNMPv3 agent、ICMP ping。

操作方法

1. Zabbix-agent配置

[root@zbx-agent1 zabbix_agent2]# vim etc/zabbix_agent2.conf
PidFile=/opt/zabbix_agent2/zabbix_agent2.pid
LogFile=/opt/zabbix_agent2/zabbix_agent2.log
LogFileSize=0
SourceIP=192.168.31.160
Server=192.168.31.160
ServerActive=192.168.31.160
HostnameItem=system.hostname
HostMetadata=Linux
Include=/opt/zabbix_agent2/etc/zabbix_agent2.d/*.conf
ControlSocket=/tmp/agent.sock

2. 创建自动发现规则

3. 创建自动发现动作

自动注册

概述

  • 在大规模集群环境中,加快Zabbix的部署速度和简化管理。比如自动识别主机并对其批量(添加/删除)主机、批量(关联/取关)模板、批量(关联/取关)主机群组等操作。
  • Zabbix agent主动上报数据,自动注册心跳间隔为 120秒。

操作方法

1. Zabbix-agent配置

[root@zbx-agent1 zabbix_agent2]# vim etc/zabbix_agent2.conf
PidFile=/opt/zabbix_agent2/zabbix_agent2.pid
LogFile=/opt/zabbix_agent2/zabbix_agent2.log
LogFileSize=0
SourceIP=192.168.31.160
Server=192.168.31.160
ServerActive=192.168.31.160
HostnameItem=system.hostname
HostMetadata=Linux
Include=/opt/zabbix_agent2/etc/zabbix_agent2.d/*.conf
ControlSocket=/tmp/agent.sock

2. 创建自动注册动作

低级别自动发现

概述

低级别自动发现提供了一种为计算机上的不同实体自动创建监控项、触发器和图表的方法。通过自动发现规则在被控主机上执行脚本,生成自定义宏变和对应的值,监控项原型将利用自定义宏变和对应的值生成监控项,再通过触发器原型生成相应的触发器从而实现监控功能。

工作原理及工作流程

  1. 创建模板,模板中包括3类,自动发现监控项、监控项原型、触发器原型
  2. 自动发现监控项获取实体信息
  3. 利用监控项原型为获取到的实体创建监控项
  4. 利用触发器原型为获取到的实体创建触发器

案例1,base进程监控

要求:

假设某些主机可能运行base_A、base_B、base_C3种进程,若有以上三个任一进程运行,则创建出相应的监控项,当该进程消失时产生告警。

步骤:

1.创建模板
模板名称:proc_check_template
可见名称:进程监控模板

2. 创建自动发现规则
名称:base进程发现
类型:Zabbix客户端(主动式)
键值:lld.proc.[base_]

3. 编写自动发现脚本

[root@zbx-agent1 ~]# vim /opt/zabbix_agent2/scripts/lld_proc.sh
#!/bin/bash

function format_data()
{
  data=""
  for x in $@
  do
    data=${data}"{\"{#NAME}\":\"$x\"},"
  done
  echo [${data%?}]
}

if [ $1 == "base_" ];then
  proc=`ps -ef | grep -v grep | grep -v $0 | egrep "\bbase_[A-Z]\b" | grep -oP "(?<=sh )\S+"`
  format_data ${proc}
fi

4. 编写自动发现配置文件并重启代理

[root@zbx-agent1 ~]# vim /opt/zabbix_agent2/etc/zabbix_agent2.d/base_proc.conf
UserParameter=lld.proc.[*],sh /opt/zabbix_agent2/scripts/lld_proc.sh $1

5. 创建监控项原型
名称:[{#NAME}]进程监控
类型:Zabbix客户端(主动式)
键值:check.proc.[{#NAME}]
信息类型:数字

6. 编写监控项配置文件并重启代理

[root@zbx-agent1 ~]# vim /opt/zabbix_agent2/etc/zabbix_agent2.d/base_proc.conf
UserParameter=check.proc.[*],ps -ef | grep -v grep | grep -c $1

7. 创建触发器原型
名称:[{#NAME}]进程运行异常
表达式:last(/proc_check_template/check.proc.[{#NAME}])<1

8. 形成告警

案例2,磁盘IO监控

要求:

每分钟获取各磁盘的IO信息,信息包括平均读等待、平均写等待、每秒读的数据量、每秒写的数据量。基于iostat命令获取数据,利用JsonPath创建监控项。

步骤:

1.创建模板
模板名称:DISK_IO_Check_Template
可见名称:磁盘IO监测模版

2. 创建自动发现规则
名称:磁盘名称自动发现
类型:Zabbix客户端(主动式)
键值:get.disk.name

3. 编写自动发现和监控脚本
lld_disk()函数用于发现所有磁盘名称
check_disk()函数用于获取所有磁盘的IO信息

[root@zbx-agent1 ~]# vim /opt/zabbix_agent2/scripts/disk_io_check.py
import subprocess
import json
import sys

def exec_command(cmd):
    try:
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        print(f"命令执行失败,返回码:{e.returncode}")
        print(f"标准错误:{e.stderr}")
    except Exception as e:
        print(f"发生错误:{e}")
    return None

def parse_iostat_output(output):
    lines = [line for line in output.strip().split('\n') if line.strip()]
    disk_data = {}
    for line in lines:
        parts = line.split()
        if len(parts) < 12:  # 检查是否有足够的部分进行解析
            continue
        disk_name = parts[0]
        disk_data[disk_name] = {
            "r_await": parts[4],
            "w_await": parts[10],
            "rMB_s": parts[1],
            "wMB_s": parts[7]
        }
    return disk_data

def lld_disk():
    cmd = "iostat -mx | grep -v grep | grep nvme | awk '{print $1}'"
    disks = exec_command(cmd)
    if disks:
        disk_list = disks.split()
        data = {"data": [{"{#DISK_NAME}": disk} for disk in disk_list]}
        print(json.dumps(data, ensure_ascii=False, indent=4))
                                                                                       
def check_disk():
    cmd = "iostat -mx | grep -v grep | grep nvme"
    output = exec_command(cmd)
    if output:
        disk_data = parse_iostat_output(output)
        print(json.dumps(disk_data, ensure_ascii=False, indent=4))

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Please enter the correct parameters, such as 'lld' or 'check'!")
    elif sys.argv[1] in ["lld", "check"]:
        globals()[sys.argv[1] + "_disk"]()
    else:
        print("Please enter the correct parameters, such as 'lld' or 'check'!")

4. 编写自动发现配置文件并重启代理

[root@zbx-agent1 ~]# vim /opt/zabbix_agent2/etc/zabbix_agent2.d/disk_io_check.conf

UserParameter=get.disk.name,python3 /opt/zabbix_agent2/scripts/disk_io_check.py lld
UserParameter=get.disk.status.info,python3 /opt/zabbix_agent2/scripts/disk_io_check.py check

5. 创建采集监控数据的监控项
名称:获取磁盘状态信息
类型:Zabbix客户端(主动式)
键值:get.disk.status.info
信息类型:字符
预处理:JSONPath $.{#DISK_NAME}.wMB_s

6. 创建监控项原型
名称:磁盘[{#DISK_NAME}]写入量MB/S
类型:相关项目
键值:wMB_s_[{#DISK_NAME}]
信息类型:浮点数
预处理:JSONPath $.{#DISK_NAME}.wMB_s

名称:磁盘[{#DISK_NAME}]读取量MB/S
类型:相关项目
键值:rMB_s_[{#DISK_NAME}]
信息类型:浮点数
预处理:JSONPath $.{#DISK_NAME}.rMB_s

名称:磁盘[{#DISK_NAME}]平均写等待
类型:相关项目
键值:w_await_[{#DISK_NAME}]
信息类型:浮点数
预处理:JSONPath $.{#DISK_NAME}.w_await

名称:磁盘[{#DISK_NAME}]平均读等待
类型:相关项目
键值:r_await_[{#DISK_NAME}]
信息类型:浮点数
预处理:JSONPath $.{#DISK_NAME}.r_await

7. 形成监控数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值