快速搞定端口批量监控
一、脚本及配置
1、(文件名:check_port.py)(python2.7版本) 存在路径:/etc/zabbix/zabbix_agentd.d/check_port.py
这个脚本有一部分内容是我从百度上找的,有一部分自己新增的,有一部分改吧改吧,凑合用
#!/usr/bin/python
__author__ = 'Hudaye'
import os
import json
import subprocess
command = "sudo netstat -tnlp|egrep -i tcp|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq"
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
output = process.communicate()[0]
ports = output.decode().split()
json_output = json.dumps(ports)
data = {}
tcp_list = []
port_list = []
tt = []
lines = os.popen(command).readlines()
for line in lines:
port = line.split()
port_list.append(port[0])
for i in port_list:
if i in json_output:
tt.append(i)
for port in list(set(tt)):
port_dict = {}
port_dict['{#TCP_PORT}'] = port
tcp_list.append(port_dict)
data['data'] = tcp_list
jsonStr = json.dumps(data, sort_keys=True, indent=4)
print(jsonStr)
执行check_port.py脚本因为linux环境各不一样,所以当你在服务端使用:zabbix_get -s 'ip' -p 10050 -k mis-port 命令获取agent端数据时或许会报以下错误:
sudo: sorry, you must have a tty to run sudo
# 1、那就把:sudo netstat -tnlp|egrep -i tcp|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort|uniq
# 这一行中的sudo拿掉就行了
# 2、或者不拿掉sudo可以在sudo后面加-t或者-tt
# 两个方法都试下,哪个能用用哪个,再解决不了,就上百度
2、(文件名:ZHJX_Port_Status.conf) zabbix配置文件
1、mis-port键
2、python指令路径:/usr/bin/python
3、文件存在路径:/etc/zabbix/zabbix_agentd.d/
将下面的命令写入ZHJX_Port_Status.conf配置文件中
UserParameter=mis-port,/usr/bin/python /etc/zabbix/zabbix_agentd.d/check_port.py
免密执行netstat命令,这一步在zabbix-agent机器上配置,这一步一定要配置,不然服务端无法获取agent端数据
# 开启用户可写权限
chmod u+w /etc/sudoers
vim /etc/sudoers
# 写入免密执行netstat信息
zabbix ALL=(ALL) NOPASSWD: /bin/netstat
# 关闭用户可写权限
chmod u-w /etc/sudoers
# 重启zabbix-agent
systemctl restart zabbix-agent2
在zabbix服务端测试:
# 172.16.35.47是agent端IP,mis-port是ZHJX_Port_Status.conf文件中自定义的键
zabbix_get -s '172.16.35.47' -p 10050 -k mis-port
测试过了欸,你看有数据哇
二、配置zabbix自动发现规则
创建模板:Check_ALL_Linux_Port
配置➡模板
创建完模板后,在模板里找到你创建的模板,点进去找到自动发现规则
然后创建发现规则 ,创建完成后如下图
填入自动发现名: Template Ports Discovery,填入ZHJX_Port_Status.conf zabbix配置文件中定义好的mis-port键
配置监控项原型 名:Tcp_Port $1
键值位置的net.tcp.listen[]是zabbix内置的功能,中括号里的{#TCP_PORT}就是后台传过来的批量端口
对对对,上图的名字中的$1对应的就是批量端口中的各个端口
最终会显示成这个样纸
配置触发器类型 名称:tcp_port {#TCP_PORT} status
添加按钮点开后选中之前的监控项,然后确定
这里注意:监控项原型和触发器类型这两个功能是自动发现规则功能内部的功能,别弄岔了
要正式将模板应用到主机了,这里要找到需要链接模板的主机
选中刚刚创建的模板,确定--然后更新
模板加入完成后,找到自动发现规则
进入自动发现规则
测试自动发现规则
你看,成功出现数据了吧
三、查看最新数据
等待zabbix一会,这个一会可能等的会有点烦,监测里面选择主机会看到最新的数据
最新数据里出现了最新的端口数据监测记录,这里1表示正常,不正常的情况就是0,仪表板会产生告警
四、zabbix监控脚本部署脚本
这玩意儿是用来全自动一键配置agent服务器批量监测端口环境的,除了zabbix服务端页面上的操作,这个脚本可以一键搞定agent服务器环境,前提是要先装好zabbix-agent并且在服务端页面配置好
(文件名:zabbix_Script_Deployment.sh)
#!/bin/bash
remoteHost="172.16.8.198"
userName="root"
des_pass="admin@123"
remoteFile="/etc/zabbix/zabbix_agentd.d"
# 适配多版本zabbix*.d目录
zabbixPath=$(find /etc/zabbix/ -name zabbix*.d)
# 获取zabbix-agent服务名(获取zabbix*.d目录,掐头去尾截取zabbix*.d目录名,将截取出来的目录名的_修改为-)
zabbixAgent=$(find /etc/zabbix/ -name zabbix*.d | sed 's|/etc/zabbix/\(.*\)\.d|\1|' | sed 's|_|-|g')
# 查找/etc/sudoers文件里的"#open zabbix nopasswd netstat"信息
nopwdInfo=$(grep "#open zabbix nopasswd netstat" /etc/sudoers)
nopwd=$(grep "zabbix ALL=(ALL) NOPASSWD: /bin/netstat" /etc/sudoers)
# 下载函数(使用expect下载脚本和配置文件)
downloadScript(){
# 判断部署脚本和zabbix配置文件是否存在
if [[ -z $(find /etc/zabbix/zabbix*.d/check_port.py 2>/dev/null) && -z $(find /etc/zabbix/zabbix*.d/ZHJX_Port_Status.conf 2>/dev/null) ]];then
# ---------------------------------------------------临时脚本块-------------------------------------------------------------------
# 这一块的逻辑有点问题,但不妨碍使用
# 初次登录新机器,需要输入yes确认,方便后面使用scp
expect -c "
spawn ssh -o StrictHostKeyChecking=no $userName@$remoteHost "exit"
expect "Are you sure you want to continue connecting \(yes/no\)\?"
send "yes\r"
expect "password:"
send "$des_pass\r"
expect eof
" 2>/dev/null
echo "初次登录已完成!"
# ---------------------------------------------------临时脚本块-------------------------------------------------------------------
echo "开始下载相关文件!"
# 下载check_port.py
expect -c "
spawn scp $userName@$remoteHost:$remoteFile/check_port.py $zabbixPath
expect \"password:\"
send \"${des_pass}\r\"
expect eof
"
# 下载ZHJX_Port_Status.conf
expect -c "
spawn scp $userName@$remoteHost:$remoteFile/ZHJX_Port_Status.conf $zabbixPath
expect \"password:\"
send \"${des_pass}\r\"
expect eof
"
else
echo "相关文件已存在,不需要重新下载!"
fi
}
# -------------------检查expect是否安装
if ! command -v expect &> /dev/null; then
echo "expect command not found. Trying to download and install."
sudo yum install -y expect
# 下载函数
downloadScript
else
# 下载函数
downloadScript
fi
# 判断/etc/sudoers文件中netstat免密执行信息是否存在
if [[ -z $nopwdInfo && -z $nopwd ]];then
# 免密执行netstat命令
# 开启用户写权限
chmod u+w /etc/sudoers
# 写入免密执行netstat信息
cat >> /etc/sudoers << eof
#open zabbix nopasswd netstat
zabbix ALL=(ALL) NOPASSWD: /bin/netstat
eof
# 关闭用户写权限
chmod u-w /etc/sudoers
echo "netstat免密操作已完成!"
else
echo "netstat免密执行信息已存在!不用继续加入!"
fi
if [[ -z $(grep "$zabbixPath" $zabbixPath/ZHJX_Port_Status.conf) ]]; then
# 开始修改
sed -i 's#UserParameter=mis-port,/usr/bin/python /etc/zabbix/zabbix_agentd.d/check_port.py#UserParameter=mis-port,/usr/bin/python $zabbixPath/check_port.py#g' $zabbixPath/ZHJX_Port_Status.conf
else
echo "路径正确!"
fi
if [[ -z $(ps -ef|grep zabbix | grep -v grep) ]];then
echo "zabbix不存在!"
else
# 重启zabbix-agent
systemctl restart $zabbixAgent
echo $zabbixAgent "重启完成!"
fi
五、思路总结
这篇文章总共就三个文件:
check_port.py
ZHJX_Port_Status.conf
zabbix_Script_Deployment.sh
1、首先在目标客户端创建zabbix_Script_Deployment.sh文件,将脚本内容写入
2、zabbix_Script_Deployment.sh执行时会检查服务器有没有安装expect工具,没有就安装
3、expect工具安装完成后,zabbix_Script_Deployment.sh开始执行下载操作
4、下载的是这两个文件(check_port.py 、ZHJX_Port_Status.conf )
5、zabbix_Script_Deployment.sh脚本会自动判断上面两个文件内的路径及目录是否符合当前服务器环境,不符合会找出zabbix相关路径、目录、服务名用来替换不符合的内容
6、执行netstat免密操作,这一步很重要,因为服务端会远程执行脚本里的netstat
7、判断zabbix是否存在
8、脚本不是很完善,懒得继续写了
9、本篇文章可以分为两个步骤操作:先第四步再第二步