# 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. 命令行获取结果
首先在命令行,使用命令获取想要的结果
```sh
[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`
```sh
#!/bin/bash
#获取所有java服务端口,并以json格式返回
string=`ss -lntup|grep java|awk -F "[ |:]+" '{print $6}'`
count=`echo $string|wc -w`
printf '{"data":[\n'
for ((i=1;i<=$count;i++))
do
proc_array=`echo $string |cut -d ' ' -f$i`
#echo "proc"$proc_array
printf "\t{\"{#PORT}\":\"${proc_array}\"},\n"
done
date=`date +%d%H%m%s`
printf "\t{\"{#DATE}\":\"${date}\"}\n"
printf "\t]\n"
printf "}\n"
```
脚本执行结果如下:
```sh
[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用来作为具体监控项
```sh
[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客户端,然后到服务端去测试验证
```sh
systemctl restart zabbix-agent.service
```
### 4. 服务端验证结果
在zabbix服务使用zabbix-get命令验证
```sh
[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命令下运行
```sh
#客户端上操作
chmod +s /usr/sbin/ss
```
再次在服务端验证:
```sh
[root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k discovery.api.port
{"data":[
{"{#PORT}":"9090"},
{"{#PORT}":"9091"},
{"{#DATE}":"3117101572512494"}
]
}
```
再拿获取的端口`9090`验证端口存活状态`key`
```sh
[root@zq-zabbix ~]# zabbix_get -s 172.17.19.13 -k api.port.status[9090]
1
```
>如上,已经能获取端口列表,也能验证改端口的状态了,可以添加规则了
### 5. web页添加模板规则
**A 先创建模板的自动发现规则**
在web页面创建模板,进入模板的`自动发现规则`页,创建自动发现规则,主要注意`键值`和`过滤器`两项设置
[![自动发现规则](https://s2.ax1x.com/2019/10/31/KIBuo6.md.png)](https://imgchr.com/i/KIBuo6)
[![过滤器](https://s2.ax1x.com/2019/10/31/KIBjfO.md.png)](https://imgchr.com/i/KIBjfO)
**B 继续编写自动发现规则的监控项原型和触发器类型**
[![监控项原型](https://s2.ax1x.com/2019/10/31/KIrBrj.md.png)](https://imgchr.com/i/KIrBrj)
[![触发器类型](https://s2.ax1x.com/2019/10/31/KIrvsH.md.png)](https://imgchr.com/i/KIrvsH)
### 6.web页主机绑定模板
此操作过于简单,略
### 7. 验证结果
[![自动发现结果](https://s2.ax1x.com/2019/10/31/KoFkyq.md.png)](https://imgchr.com/i/KoFkyq)
## 过程中遇到的问题:
1. json格式错误导致自动发现不了
问题:自动发现不了,zabbix-server端日志提示`became not supported`
```sh
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`权限,如
```sh
chmod +s /usr/sbin/ss
#增加操作一定要慎重,个别可以修改数据的命令,一定不要添加s权限
```
- shell编程
- 变量1-规范-环境变量-普通变量
- 变量2-位置-状态-特殊变量
- 变量3-变量子串
- 变量4-变量赋值三种方法
- 变量5-数组相关
- 计算1-数值计算命令和案例
- 计算2-expr命令举例
- 计算3-条件表达式和各种操作符
- 计算4-条件表达式和操作符案例
- 循环1-函数的概念与作用
- 循环2-if与case语法
- 循环3-while语法
- 循环4-for循环
- 其他1-判断传入的参数为0或整数的多种思路
- 其他2-while+read按行读取文件
- 其他3-给输出内容加颜色
- 其他4-shell脚本后台运行知识
- 其他5-6种产生随机数的方法
- 其他6-break,continue,exit,return区别
- if语法案例
- case语法案例
- 函数语法案例
- WEB服务软件
- nginx相关
- 01-简介与对比
- 02-日志说明
- 03-配置文件和虚拟主机
- 04-location模块和访问控制
- 05-status状态模块
- 06-rewrite重写模块
- 07-负载均衡和反向代理
- 08-反向代理监控虚拟IP地址
- nginx与https自签发证书
- php-nginx-mysql联动
- Nginx编译安装[1.12.2]
- 案例
- 不同客户端显示不同信息
- 上传和访问资源池分离
- 配置文件
- nginx转发解决跨域问题
- 反向代理典型配置
- php相关
- C6编译安装php.5.5.32
- C7编译php5
- C6/7yum安装PHP指定版本
- tomcxat相关
- 01-jkd与tomcat部署
- 02-目录-日志-配置文件介绍
- 03-tomcat配置文件详解
- 04-tomcat多实例和集群
- 05-tomcat监控和调优
- 06-Tomcat安全管理规范
- show-busy-java-threads脚本
- LVS与keepalived
- keepalived
- keepalived介绍和部署
- keepalived脑裂控制
- keepalived与nginx联动-监控
- keepalived与nginx联动-双主
- LVS负载均衡
- 01-LVS相关概念
- 02-LVS部署实践-ipvsadm
- 03-LVS+keepalived部署实践
- 04-LVS的一些问题和思路
- mysql数据库
- 配置和脚本
- 5.6基础my.cnf
- 5.7基础my.cnf
- 多种安装方式
- 详细用法和命令
- 高可用和读写分离
- 优化和压测
- docker与k8s
- docker容器技术
- 1-容器和docker基础知识
- 2-docker软件部署
- 3-docker基础操作命令
- 4-数据的持久化和共享互连
- 5-docker镜像构建
- 6-docker镜像仓库和标签tag
- 7-docker容器的网络通信
- 9-企业级私有仓库harbor
- docker单机编排技术
- 1-docker-compose快速入门
- 2-compose命令和yaml模板
- 3-docker-compose命令
- 4-compose/stack/swarm集群
- 5-命令补全和资源限制
- k8s容器编排工具
- mvn的dockerfile打包插件
- openstack与KVM
- kvm虚拟化
- 1-KVM基础与快速部署
- 2-KVM日常管理命令
- 3-磁盘格式-快照和克隆
- 4-桥接网络-热添加与热迁移
- openstack云平台
- 1-openstack基础知识
- 2-搭建环境准备
- 3-keystone认证服务部署
- 4-glance镜像服务部署
- 5-nova计算服务部署
- 6-neutron网络服务部署
- 7-horizon仪表盘服务部署
- 8-启动openstack实例
- 9-添加计算节点流程
- 10-迁移glance镜像服务
- 11-cinder块存储服务部署
- 12-cinder服务支持NFS存储
- 13-新增一个网络类型
- 14-云主机冷迁移前提设置
- 15-VXALN网络类型配置
- 未分类杂项
- 部署环境准备
- 监控
- https证书
- python3.6编译安装
- 编译安装curl[7.59.0]
- 修改Redhat7默认yum源为阿里云
- 升级glibc至2.17
- rabbitmq安装和启动
- rabbitmq多实例部署[命令方式]
- mysql5.6基础my.cnf
- centos6[upstart]/7[systemd]创建守护进程
- Java启动参数详解
- 权限控制方案
- app发包仓库
- 版本发布流程
- elk日志系统
- rsyslog日志统一收集系统
- ELK系统介绍及YUM源
- 快速安装部署ELK
- Filebeat模块讲解
- logstash的in/output模块
- logstash的filter模块
- Elasticsearch相关操作
- ES6.X集群及head插件
- elk收集nginx日志(json格式)
- kibana说明-汉化-安全
- ES安装IK分词器
- zabbix监控
- zabbix自动注册模板实现监控项自动注册
- hadoop大数据集群
- hadoop部署
- https证书
- certbot网站
- jenkins与CI/CD
- 01-Jenkins部署和初始化
- 02-Jenkins三种插件安装方式
- 03-Jenkins目录说明和备份
- 04-git与gitlab项目准备
- 05-构建自由风格项目和相关知识
- 06-构建html静态网页项目
- 07-gitlab自动触发项目构建
- 08-pipelinel流水线构建项目
- 09-用maven构建java项目
- iptables
- 01-知识概念
- 02-常规命令实战
- 03-企业应用模板
- 04-企业应用模板[1键脚本]
- 05-企业案例-共享上网和端口映射
- SSH与VPN
- 常用VPN
- VPN概念和常用软件
- VPN之PPTP部署[6.x][7.x]
- 使用docker部署softether vpn
- softEther-vpn静态路由表推送
- SSH服务
- SSH介绍和部署
- SSH批量分发脚本
- 开启sftp日志并限制sftp访问目录
- sftp账号权限分离-开发平台
- ssh配置文件最佳实践
- git-github-gitlab
- git安装部署
- git详细用法
- github使用说明
- gitlab部署和使用
- 缓存数据库
- zookeeper草稿
- mongodb数据库系列
- mongodb基本使用
- mongodb常用命令
- MongoDB配置文件详解
- mongodb用户认证管理
- mongodb备份与恢复
- mongodb复制集群
- mongodb分片集群
- docker部署mongodb
- memcached
- memcached基本概念
- memcached部署[6.x][7.x]
- memcached参数和命令
- memcached状态和监控
- 会话共享和集群-优化-持久化
- memcached客户端-web端
- PHP测试代码
- redis
- 1安装和使用
- 2持久化-事务-锁
- 3数据类型和发布订阅
- 4主从复制和高可用
- 5redis集群
- 6工具-安全-pythonl连接
- redis配置文件详解
- 磁盘管理和存储
- Glusterfs分布式存储
- GlusterFS 4.1 版本选择和部署
- Glusterfs常用命令整理
- GlusterFS 4.1 深入使用
- NFS文件存储
- NFS操作和部署
- NFS文件系统-挂载和优化
- sersync与inotify
- rsync同步服务
- rsyncd.conf
- rsync操作和部署文档
- rsync常见错误处理
- inotify+sersync同步服务
- inotify安装部署
- inotify最佳脚本
- sersync安装部署
- 时间服务ntp和chrony
- 时间服务器部署
- 修改utc时间为cst时间
- 批量操作与自动化
- cobbler与kickstart
- KS+COBBLER文件
- cobbler部署[7.x]
- kickstart部署[7.x]
- kickstar-KS文件和语法解析
- kickstart-PXE配置文件解析
- 自动化之ansible
- ansible部署和实践
- ansible剧本编写规范
- 配置文件示例
- 内网DNS服务
- 压力测试
- 压测工具-qpefr测试带宽和延时