• zabbix模板的自动发现规则(ldd)实现被监控项自动发现


    zabbix模板的自动发现规则(ldd)实现被监控项自动发现

    自动发现规则(ldd)用途说明

    在zabbix自带的linux模板的自动发现规则中,有一个Mounted filesystem discovery自动发现规则,可以根据每个服务器磁盘梳理不同,自动生成相应的磁盘监控数据.
    这就是自动注册的用途,根据不同服务器上同一个监控项不同的数量,自动生成对应数量的监控

    例如5个服务器都分别启动了tomcat多实例,但启动的tomcat数量不相同,端口也不同,我想要监控这些端口是否down掉:
    用普通的方式创建的监控模板,就得给每个服务器单独创建,不能通用
    而如果通过自动发现规则来创建,就可以只用一个模板,对应这些不同数量的tomcat进行端口检查

    自动发现规则使用实例

    以监控java端口的自动发现为例,进行操作说明
    流程:

    1. 命令行获取结果
    2. 编写zabbix脚本,输出json格式
    3. 创建zabbix客户端key
    4. 服务端验证结果
    5. web页添加模板规则
    6. web页主机绑定模板
    7. 验证结果

    1. 命令行获取结果

    首先在命令行,使用命令获取想要的结果

    [root@zhimai-api02 api]# ss -lntup|grep java|awk -F "[ |:]+" '{print $6}'
    9090
    9091
    

    2. 编写zabbix脚本,输出json格式

    zabbix的api需要的都是json格式的数据,这里也不例外,不管通过shell脚本还是python脚本,反正最终需要输出json格式数据
    shell脚本如下:
    vim java_port_list.sh

    #!/bin/bash
    #获取所有java服务端口,并以json格式返回
    string=`ss -lntup|grep java|awk -F "[ |:]+" '{print $6}'`
    count=`echo $string|wc -w`
    printf '{"data":[
    '
    for ((i=1;i<=$count;i++))
    do
        proc_array=`echo $string |cut -d ' ' -f$i`
       #echo "proc"$proc_array
        printf "	{"{#PORT}":"${proc_array}"},
    "
    done
    date=`date +%d%H%m%s`
    printf "	{"{#DATE}":"${date}"}
    "
        printf "	]
    "
    printf "}
    "
    

    脚本执行结果如下:

    [root@zhimai-api02 ~]# sh /etc/zabbix/zabbix_agentd.d/scripts/java_port_list.sh 
    {"data":[
    	{"{#PORT}":"9090"},
    	{"{#PORT}":"9091"},
    	{"{#DATE}":"3117101572512518"}
    	]
    }
    # 最前面的data是标准语法要求的,必须要相同,后面的key可以自己定义
    

    3. 创建zabbix客户端key

    zabbix_agentd.d目录下,创建两个自定义key,一个key用来自动发现,一个key用来作为具体监控项

    [root@zhimai-api02 ~]# cat /etc/zabbix/zabbix_agentd.d/java_api.conf
    # 获取json列表传递给zabbix-server
    UserParameter=discovery.api.port,sh /etc/zabbix/zabbix_agentd.d/scripts/java_port_list.sh
    # 端口状态监控key
    UserParameter=api.port.status[*],ss -lntup|grep "$1"|wc -l
    

    重启zabbix客户端,然后到服务端去测试验证

    systemctl restart zabbix-agent.service
    

    4. 服务端验证结果

    在zabbix服务使用zabbix-get命令验证

    [root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k discovery.api.port
    {"data":[
    	{"{#DATE}":"3114101572502867"}
    	]
    }
    

    如上,没有获取到java端口信息,经查是ss -lntup命令中的-p参数,在普通用户下是看不了其他用户进程的,也就获取不到数据,可以使用免密sudo方式,也可以给ss命令添加s权限,让ss命令直接在root命令下运行

    #客户端上操作
    chmod +s /usr/sbin/ss
    

    再次在服务端验证:

    [root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k discovery.api.port
    {"data":[
    	{"{#PORT}":"9090"},
    	{"{#PORT}":"9091"},
    	{"{#DATE}":"3117101572512494"}
    	]
    }
    

    再拿获取的端口9090验证端口存活状态key

    [root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k api.port.status[9090]
    1
    

    如上,已经能获取端口列表,也能验证改端口的状态了,可以添加规则了

    5. web页添加模板规则

    A 先创建模板的自动发现规则
    在web页面创建模板,进入模板的自动发现规则页,创建自动发现规则,主要注意键值过滤器两项设置
    自动发现规则
    过滤器
    B 继续编写自动发现规则的监控项原型和触发器类型
    监控项原型
    触发器类型

    6.web页主机绑定模板

    此操作过于简单,略

    7. 验证结果

    自动发现结果

    过程中遇到的问题:

    1. json格式错误导致自动发现不了
      问题:自动发现不了,zabbix-server端日志提示became not supported
      discovery rule "xxx:discovery.api.port" became not supported: Value should be a JSON object
      

    原因:这个问题经过检查,是输出的内容不是json格式导致的
    2. 有多个端口/服务,但只能自动发现一个端口/服务
    原因:也是由于json格式导致的
    正确的应该每个key-value键值对都要用一堆大括号包起来
    但输出的json格式中,却将所有的键值对只用了一个大括号包起来,如下
    ```json

    正确

    {"data":[
    {"{#PORT}":"9090"},
    {"{#PORT}":"9091"}
    ]
    }

    错误

    {"data":[{
    "{#PORT}":"9090",
    "{#PORT}":"9091"
    }]
    }
    ```
    3. 客户端执行脚本正常,服务端用zabbix-get获取数据不正确
    是由于使用的命令,如ss,在普通用户模式下,是没有权限获取如进程信息之类数据导致的
    解决办法:可以使用visudo给zabbix用户授权某些命令免密码执行,也可以给这些命令增加s权限,如

    chmod +s /usr/sbin/ss
    #增加操作一定要慎重,个别可以修改数据的命令,一定不要添加s权限
    
  • 相关阅读:
    JavaScript常用设计模式
    js 判断l对象类型
    JavaScript编程(终极篇)
    微信小程序开发-滑动操作
    解决Jquery向页面append新元素之后事件的绑定问题
    C# list与数组互相转换
    C# “贝格尔”编排法
    C#数字格式化
    SQL从一个表查询数据插入/更新到另一个表
    全局唯一标识符 (GUID)
  • 原文地址:https://www.cnblogs.com/noah-luo/p/11772542.html
Copyright © 2020-2023  润新知