zabbix通过自定义key "domain.discovery" 发现域名(Json格式),然后自动生成监控项,监控项通过自定义key "https"获取域名证书有效期,若少于30天则出发告警。
1、在zabbix agent 上面创建脚本文件和域名文件
在/etc/zabbix/scritps/下创建domains.txt、get_domains.sh、https.sh这三个文件
get_domains.sh
#/bin/bash
#auth xc
#date 2024-06-20
ssl_array=`cat /etc/zabbix/script/domains.txt`
length=`echo "${ssl_array}" | wc -l`
count=0
echo '{'
echo -e '\t"data":['
echo "$ssl_array" | while read line
do
echo -en '\t\t{"{#Domain_NAME}":"'$line'"}'
count=$(( $count + 1 ))
if [ $count -lt $length ];then
echo ','
fi
done
echo -e '\n\t]'
echo '}'
https.sh
#/bin/bash
#auth xc
#date 2024-06-20
#Attention: 通过域名获取证书的过期时间
#获取证书时间
end_date=`openssl s_client -host $1 -port 443 -showcerts </dev/null 2>/dev/null |sed -n '/BEGIN CERTIFICATE/,/END CERT/p' |openssl x509 -text 2>/dev/null |sed -n 's/ *Not After : *//p'`
if [ -n "$end_date" ];
then
#把证书时间转换为时间戳
end_timestamp=`date '+%s' --date "$end_date"`
##获取今天的时间戳
today=`date '+%s'`
#计算还有证书几天过期
date1=$((($end_timestamp-$today)/86400))
echo $date1
fi
domains.txt
2、在zabbix proxy或者zabbix server 修改zabbix配置文件
cd /etc/zabbix/zabbix_agentd.d
vi chk_pldomain.conf
UserParameter=domain.discovery,/bin/bash /etc/zabbix/script/get_doamins.sh
UserParameter=https[*],/bin/bash /etc/zabbix/script/https.sh $1
3、重启zabbix-agent 服务
systemctl restart zabbix-agent
4、登录zabbix server 创建监控模板
5、编辑模板
点开刚才创建的模版,创建,自动发现规则
6、添加 监控原型

7、添加监控主机,应用模板,测试。
稍等几分钟查看最新数据有没有
发现,监控原型里面的键值https已经存在了,更换一个新的,修改zabbix agnet端的配置文件。
vim /etc/zabbix/zabbix_agentd.d/chk_pldomain.conf
保存。重启zabbix agent服务
systemctl restart zabbix-agent
修改模板中的 监控原型 里面的键值
单击,最下面的,更新 按钮。
发现,过了几分钟还是同样的问题,报Cannot create item:item with the same key ……… already exits.
#####*******
经多次测试,最后发现是,{#DOMAIN_CERT} 这里的问题,这里面的值,必须是大写,如果有两个中间用下划线连接。
##最后get_doamins.sh修改后的脚本
8、添加触发器
再克隆一个,修改为,小于15天,告警程度,灾难。
####********
发现了一个问题:在监控域名对应的是ECS服务器时,证书过期时间是对的,但是当域名在,OSS SLB WAF 上面时,证书的过期时间是不对的。
原因是:检测命令少了一个参数,-sername,没有这个参数时,当检测是阿里云 OSS SLB WAF上的域名时,会自动检测到阿里的相关域名。当指定了这个-sername,就会去检测你的OSS SLB WAF 上面添加的域名,这样检测出来的时间才是正确的。
修改https.sh脚本:
#/bin/bash
#auth xc
#date 2024-06-20
#Attention: 通过域名获取证书的过期时间
#获取证书时间
end_date=`openssl s_client -host $1 -port 443 -servername $1 -showcerts </dev/null 2>/dev/null |sed -n '/BEGIN CERTIFICATE/,/END CERT/p' |openssl x509 -text 2>/dev/null |sed -n 's/ *Not After : *//p'`
if [ -n "$end_date" ];
then
#把证书时间转换为时间戳
end_date=`date '+%s' --date "$end_date"`
##获取今天的时间戳
today=`date '+%s'`
#计算还有证书几天过期
date1=$((($end_date-$today)/86400))
echo $date1
fi
